📄 smsc_http.c
字号:
http_start_request(conndata->http_ref, HTTP_METHOD_GET, url, headers, NULL, 0, sms, NULL); octstr_destroy(url); http_destroy_headers(headers);}/* * Parse a line in the format: ID: XXXXXXXXXXXXXXXXXX * and return a Dict with the 'ID' as key and the value as value, * otherwise return NULL if a parsing error occures. */static Dict *clickatell_parse_body(Octstr *body){ Dict *param = NULL; List *words = NULL; long len; Octstr *word, *value; words = octstr_split_words(body); if ((len = gwlist_len(words)) > 1) { word = gwlist_extract_first(words); if (octstr_compare(word, octstr_imm("ID:")) == 0) { value = gwlist_extract_first(words); param = dict_create(4, NULL); dict_put(param, octstr_imm("ID"), value); } else if (octstr_compare(word, octstr_imm("ERR:")) == 0) { value = gwlist_extract_first(words); param = dict_create(4, NULL); dict_put(param, octstr_imm("ERR"), value); } octstr_destroy(word); } gwlist_destroy(words, (void(*)(void *)) octstr_destroy); return param;}static void clickatell_parse_reply(SMSCConn *conn, Msg *msg, int status, List *headers, Octstr *body){ if (status == HTTP_OK || status == HTTP_ACCEPTED) { Dict *param; Octstr *msgid; if ((param = clickatell_parse_body(body)) != NULL && (msgid = dict_get(param, octstr_imm("ID"))) != NULL && msgid != NULL) { /* SMSC ACK.. now we have the message id. */ if (DLR_IS_ENABLED_DEVICE(msg->sms.dlr_mask)) dlr_add(conn->id, msgid, msg); bb_smscconn_sent(conn, msg, NULL); } else { error(0, "HTTP[%s]: Message was malformed or error was returned. SMSC response `%s'.", octstr_get_cstr(conn->id), octstr_get_cstr(body)); bb_smscconn_send_failed(conn, msg, SMSCCONN_FAILED_MALFORMED, octstr_duplicate(body)); } dict_destroy(param); } else { error(0, "HTTP[%s]: Message was rejected. SMSC reponse `%s'.", octstr_get_cstr(conn->id), octstr_get_cstr(body)); bb_smscconn_send_failed(conn, msg, SMSCCONN_FAILED_REJECTED, octstr_duplicate(body)); }}/* MO related function */static void clickatell_receive_sms(SMSCConn *conn, HTTPClient *client, List *headers, Octstr *body, List *cgivars){ List *reply_headers; int ret; Octstr *apimsgid, *status, *timestamp, *retmsg, *dest, *charge; Octstr *api_id, *from, *to, *text, *charset, *udh; int httpstatus = HTTP_UNAUTHORIZED, dlrstat; Msg *dlrmsg, *momsg; struct tm tm; /* dlr parameters */ apimsgid = http_cgi_variable(cgivars, "apiMsgId"); status = http_cgi_variable(cgivars, "status"); /* timestamp is for both DLR & MO */ timestamp = http_cgi_variable(cgivars, "timestamp"); dest = http_cgi_variable(cgivars, "to"); charge = http_cgi_variable(cgivars, "charge"); /* MO parameters */ api_id = http_cgi_variable(cgivars, "api_id"); from = http_cgi_variable(cgivars, "from"); to = http_cgi_variable(cgivars, "to"); text = http_cgi_variable(cgivars, "text"); charset = http_cgi_variable(cgivars, "charset"); udh = http_cgi_variable(cgivars, "udh"); debug("smsc.http.clickatell", 0, "HTTP[%s]: Received a request", octstr_get_cstr(conn->id)); if (api_id != NULL && from != NULL && to != NULL && timestamp != NULL && text != NULL && charset != NULL && udh != NULL) { /* we received an MO message */ debug("smsc.http.clickatell", 0, "HTTP[%s]: Received MO message from %s: <%s>", octstr_get_cstr(conn->id), octstr_get_cstr(from), octstr_get_cstr(text)); momsg = msg_create(sms); momsg->sms.sms_type = mo; momsg->sms.sender = octstr_duplicate(from); momsg->sms.receiver = octstr_duplicate(to); momsg->sms.msgdata = octstr_duplicate(text); momsg->sms.charset = octstr_duplicate(charset); momsg->sms.binfo = octstr_duplicate(api_id); momsg->sms.smsc_id = octstr_duplicate(conn->id); if (octstr_len(udh) > 0) { momsg->sms.udhdata = octstr_duplicate(udh); } strptime(octstr_get_cstr(timestamp), "%Y-%m-%d %H:%M:%S", &tm); momsg->sms.time = gw_mktime(&tm); /* note: implicit msg_destroy */ ret = bb_smscconn_receive(conn, momsg); httpstatus = HTTP_OK; retmsg = octstr_create("Thanks"); } else if (apimsgid == NULL || status == NULL || timestamp == NULL || dest == NULL) { error(0, "HTTP[%s]: Insufficient args.", octstr_get_cstr(conn->id)); httpstatus = HTTP_BAD_REQUEST; retmsg = octstr_create("Insufficient arguments, rejected."); } else { switch (atoi(octstr_get_cstr(status))) { case 1: /* message unknown */ case 5: /* error with message */ case 6: /* user cancelled message */ case 7: /* error delivering message */ case 9: /* routing error */ case 10: /* message expired */ dlrstat = 2; /* delivery failure */ break; case 2: /* message queued */ case 3: /* delivered */ case 11: /* message queued for later delivery */ dlrstat = 4; /* message buffered */ break; case 4: /* received by recipient */ case 8: /* OK */ dlrstat = 1; /* message received */ break; default: /* unknown status code */ dlrstat = 16; /* smsc reject */ break; } dlrmsg = dlr_find(conn->id, apimsgid, /* smsc message id */ dest , /* destination */ dlrstat); if (dlrmsg != NULL) { /* dlrmsg->sms.msgdata = octstr_duplicate(apimsgid); */ dlrmsg->sms.sms_type = report_mo; dlrmsg->sms.time = atoi(octstr_get_cstr(timestamp)); if (charge) { /* unsure if smsbox relays the binfo field to dlrs. But it is here in case they will start to do it. */ dlrmsg->sms.binfo = octstr_duplicate(charge); } ret = bb_smscconn_receive(conn, dlrmsg); httpstatus = (ret == 0 ? HTTP_OK : HTTP_FORBIDDEN); retmsg = octstr_create("Sent"); } else { error(0,"HTTP[%s]: got DLR but could not find message or was not interested " "in it id<%s> dst<%s>, type<%d>", octstr_get_cstr(conn->id), octstr_get_cstr(apimsgid), octstr_get_cstr(dest), dlrstat); httpstatus = HTTP_OK; retmsg = octstr_create("Thanks"); } } reply_headers = gwlist_create(); http_header_add(reply_headers, "Content-Type", "text/plain"); debug("smsc.http.clickatell", 0, "HTTP[%s]: Sending reply `%s'.", octstr_get_cstr(conn->id), octstr_get_cstr(retmsg)); http_send_reply(client, httpstatus, reply_headers, retmsg); octstr_destroy(retmsg); http_destroy_headers(reply_headers);}/*---------------------------------------------------------------- * Brunet - A german aggregator (mainly doing T-Mobil D1 connections) * * o bruHTT v1.3L (for MO traffic) * o bruHTP v2.1 (date 22.04.2003) (for MT traffic) * * Stipe Tolj <stolj@wapme.de> * Tobias Weber <weber@wapme.de> *//* MT related function */static void brunet_send_sms(SMSCConn *conn, Msg *sms){ ConnData *conndata = conn->data; Octstr *url, *tid, *xser; List *headers; char id[UUID_STR_LEN + 1]; int dcs; /* * Construct TransactionId. * Beware that brunet needs an "clean" octstr representation, * without the dashes in the string. So remove them. */ uuid_unparse(sms->sms.id, id); tid = octstr_create(id); octstr_replace(tid, octstr_imm("-"), octstr_imm("")); /* form the basic URL */ url = octstr_format("%S?MsIsdn=%E&Originator=%E", conndata->send_url, sms->sms.receiver, sms->sms.sender); /* * We use &binfo=<foobar> from sendsms interface to encode * additional paramters. If a mandatory value is not set, * a default value is applied */ if (octstr_len(sms->sms.binfo)) { octstr_url_decode(sms->sms.binfo); octstr_format_append(url, "&%S", sms->sms.binfo); } /* CustomerId */ if (octstr_search(url, octstr_create("CustomerId="), 0) == -1) { octstr_format_append(url, "&CustomerId=%S", conndata->username); } /* TransactionId */ if (octstr_search(url, octstr_create("TransactionId="), 0) == -1) { octstr_format_append(url, "&TransactionId=%S", tid); } /* SMSCount */ if (octstr_search(url, octstr_create("SMSCount="), 0) == -1) { octstr_format_append(url, "&%s", "SMSCount=1"); } /* ActionType */ if (octstr_search(url, octstr_create("ActionType="), 0) == -1) { octstr_format_append(url, "&%s", "ActionType=A"); } /* ServiceDeliveryType */ if (octstr_search(url, octstr_create("ServiceDeliveryType="), 0) == -1) { octstr_format_append(url, "&%s", "ServiceDeliveryType=P"); } /* if coding is not set and UDH exists, assume DC_8BIT * else default to DC_7BIT */ if (sms->sms.coding == DC_UNDEF) sms->sms.coding = octstr_len(sms->sms.udhdata) > 0 ? DC_8BIT : DC_7BIT; if (sms->sms.coding == DC_8BIT) octstr_format_append(url, "&MessageType=B&Text=%H", sms->sms.msgdata); else octstr_format_append(url, "&MessageType=S&Text=%E", sms->sms.msgdata); dcs = fields_to_dcs(sms, (sms->sms.alt_dcs != SMS_PARAM_UNDEFINED ? sms->sms.alt_dcs : 0)); /* XSer processing */ xser = octstr_create(""); /* XSer DCS values */ if (dcs != 0 && dcs != 4) octstr_format_append(xser, "0201%02x", dcs & 0xff); /* add UDH header */ if (octstr_len(sms->sms.udhdata)) { octstr_format_append(xser, "01%02x%H", octstr_len(sms->sms.udhdata), sms->sms.udhdata); } if (octstr_len(xser) > 0) octstr_format_append(url, "&XSer=%S", xser); octstr_destroy(xser); headers = http_create_empty_headers(); debug("smsc.http.brunet", 0, "HTTP[%s]: Sending request <%s>", octstr_get_cstr(conn->id), octstr_get_cstr(url)); /* * Brunet requires an SSL-enabled HTTP client call, this is handled * transparently by the Kannel HTTP layer module. */ http_start_request(conndata->http_ref, HTTP_METHOD_GET, url, headers, NULL, 0, sms, NULL); octstr_destroy(url); octstr_destroy(tid); http_destroy_headers(headers);}/* * Parse a line in the format: <name=value name=value ...> * and return a Dict with the name as key and the value as value, * otherwise return NULL if a parsing error occures. */static Dict *brunet_parse_body(Octstr *body){ Dict *param = NULL; List *words = NULL; long len; Octstr *word; words = octstr_split_words(body); if ((len = gwlist_len(words)) > 0) { param = dict_create(4, NULL); while ((word = gwlist_extract_first(words)) != NULL) { List *l = octstr_split(word, octstr_imm("=")); Octstr *key = gwlist_extract_first(l); Octstr *value = gwlist_extract_first(l); if (octstr_len(key)) dict_put(param, key, value); octstr_destroy(key); octstr_destroy(word); gwlist_destroy(l, (void(*)(void *)) octstr_destroy); } } gwlist_destroy(words, (void(*)(void *)) octstr_destroy); return param;}static void brunet_parse_reply(SMSCConn *conn, Msg *msg, int status, List *headers, Octstr *body){ if (status == HTTP_OK || status == HTTP_ACCEPTED) { Dict *param; Octstr *status; if ((param = brunet_parse_body(body)) != NULL && (status = dict_get(param, octstr_imm("Status"))) != NULL && octstr_case_compare(status, octstr_imm("0")) == 0) { Octstr *msg_id; /* pass the MessageId for this MT to the logging facility */ if ((msg_id = dict_get(param, octstr_imm("MessageId"))) != NULL) msg->sms.binfo = octstr_duplicate(msg_id); bb_smscconn_sent(conn, msg, NULL); } else { error(0, "HTTP[%s]: Message was malformed. SMSC response `%s'.",
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -