⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 smsc_http.c

📁 WAP gateway, Linux source
💻 C
📖 第 1 页 / 共 5 页
字号:
 * of the chain is signaling the DLR-URL, since the last instance receives * the DLR from the upstream SMSC and the associated smsbox triggers the * DLR-URL. * For some considerations this is not what we want. If we want to transport * the orginal DLR-URL to the "first" smsbox instance of the calling chain * then we need to define a 'dlr-url' config directive in the smsc group. * This value defines the inbound MO/DLR port of our own smsc group and * maps arround the orginal DLR-URL. So the next smsbox does not signal the * orginal DLR-URL, but our own smsc group instance with the DLR, and we can * forward on to smsbox and possibly further on the chain to the first * instance. *  * Example: (consider the 2 chain architecture from above) * A MT is put to smsbox1 with dlr-url=http://foobar/aaa as DLR-URL. The MT * is forwarded to bearerbox. * If no 'dlr-url' is given in the smsc HTTP for the next smsbox2, then we * simply pass the same value to smsbox2. Resulting that smsbox2 will call * the DLR-URL when we receive a DLR from the upstream SMSC connection of * bearerbox2. * If 'dlr-url = http://localhost:15015/' is given in the smsc HTTP for the * next smsbox2, then we map the orginal DLR-URL into this value, resulting * in a dlr-url=http://lcoalhost:15015/&dlr-url=http://foobar/aaa call to * smsbox2. So smsbox2 is not signaling http://foobar/aaa directly, but our * own bearerbox1's smsc HTTP port for MO/DLR receive. */enum { HEX_NOT_UPPERCASE = 0 };static void kannel_send_sms(SMSCConn *conn, Msg *sms){    ConnData *conndata = conn->data;    Octstr *url;    List *headers;    if (!conndata->no_sep) {        url = octstr_format("%S?"			    "username=%E&password=%E&to=%E&text=%E",			     conndata->send_url,			     conndata->username, conndata->password,			     sms->sms.receiver, sms->sms.msgdata);    } else {        octstr_binary_to_hex(sms->sms.msgdata, HEX_NOT_UPPERCASE);        url = octstr_format("%S?"			    "username=%E&password=%E&to=%E&text=%S",			     conndata->send_url,			     conndata->username, conndata->password,			     sms->sms.receiver,                              sms->sms.msgdata);     }       if (octstr_len(sms->sms.udhdata)) {        if (!conndata->no_sep) {	    octstr_format_append(url, "&udh=%E", sms->sms.udhdata);        } else {	    octstr_binary_to_hex(sms->sms.udhdata, HEX_NOT_UPPERCASE);            octstr_format_append(url, "&udh=%S", sms->sms.udhdata);	}    }    if (!conndata->no_sender)        octstr_format_append(url, "&from=%E", sms->sms.sender);    if (sms->sms.mclass != MC_UNDEF)        octstr_format_append(url, "&mclass=%d", sms->sms.mclass);    if (!conndata->no_coding && sms->sms.coding != DC_UNDEF)        octstr_format_append(url, "&coding=%d", sms->sms.coding);    /* Obey that smsbox's sendsms HTTP interface is still expecting      * WINDOWS-1252 as default charset, while all other internal parts     * use UTF-8 as internal encoding. This means, when we pass a SMS     * into a next Kannel instance, we need to let the smsbox know which     * charset we have in use.     * XXX TODO: change smsbox interface to use UTF-8 as default     * in next major release. */    if (sms->sms.coding == DC_7BIT)        octstr_append_cstr(url, "&charset=UTF-8");    else if (sms->sms.coding == DC_UCS2)        octstr_append_cstr(url, "&charset=UTF-16BE");    if (sms->sms.mwi != MWI_UNDEF)        octstr_format_append(url, "&mwi=%d", sms->sms.mwi);    if (sms->sms.account) /* prepend account with local username */        octstr_format_append(url, "&account=%E:%E", sms->sms.service, sms->sms.account);    if (sms->sms.binfo) /* prepend billing info */        octstr_format_append(url, "&binfo=%S", sms->sms.binfo);    if (sms->sms.smsc_id) /* proxy the smsc-id to the next instance */        octstr_format_append(url, "&smsc=%S", sms->sms.smsc_id);    if (sms->sms.dlr_url) {        if (conndata->dlr_url) {            char id[UUID_STR_LEN + 1];            Octstr *mid;            /* create Octstr from UUID */              uuid_unparse(sms->sms.id, id);            mid = octstr_create(id);             octstr_format_append(url, "&dlr-url=%E", conndata->dlr_url);            /* encapsulate the orginal DLR-URL, escape code for DLR mask             * and message id */            octstr_format_append(url, "%E%E%E%E%E",                 octstr_imm("&dlr-url="), sms->sms.dlr_url,                octstr_imm("&dlr-mask=%d"),                octstr_imm("&dlr-mid="), mid);                            octstr_destroy(mid);        } else                         octstr_format_append(url, "&dlr-url=%E", sms->sms.dlr_url);    }    if (sms->sms.dlr_mask != DLR_UNDEFINED && sms->sms.dlr_mask != DLR_NOTHING)        octstr_format_append(url, "&dlr-mask=%d", sms->sms.dlr_mask);    headers = gwlist_create();    debug("smsc.http.kannel", 0, "HTTP[%s]: Start request",          octstr_get_cstr(conn->id));    http_start_request(conndata->http_ref, HTTP_METHOD_GET, url, headers,                        NULL, 0, sms, NULL);    octstr_destroy(url);    http_destroy_headers(headers);}static void kannel_parse_reply(SMSCConn *conn, Msg *msg, int status,			       List *headers, Octstr *body){    /* Test on three cases:     * 1. an smsbox reply of an remote kannel instance     * 2. an smsc_http response (if used for MT to MO looping)     * 3. an smsbox reply of partly successful sendings */    if ((status == HTTP_OK || status == HTTP_ACCEPTED)        && (octstr_case_compare(body, octstr_imm("0: Accepted for delivery")) == 0 ||            octstr_case_compare(body, octstr_imm("Sent.")) == 0 ||            octstr_case_compare(body, octstr_imm("Ok.")) == 0 ||            octstr_ncompare(body, octstr_imm("Result: OK"),10) == 0)) {        char id[UUID_STR_LEN + 1];        Octstr *mid;        /* create Octstr from UUID */          uuid_unparse(msg->sms.id, id);        mid = octstr_create(id);             /* add to our own DLR storage */                       if (DLR_IS_ENABLED_DEVICE(msg->sms.dlr_mask))            dlr_add(conn->id, mid, msg);        octstr_destroy(mid);                                bb_smscconn_sent(conn, msg, NULL);    } else {        bb_smscconn_send_failed(conn, msg,	            SMSCCONN_FAILED_MALFORMED, octstr_duplicate(body));    }}static void kannel_receive_sms(SMSCConn *conn, HTTPClient *client,                               List *headers, Octstr *body, List *cgivars){    ConnData *conndata = conn->data;    Octstr *user, *pass, *from, *to, *text, *udh, *account, *binfo;    Octstr *dlrurl, *dlrmid;    Octstr *tmp_string, *retmsg;    int	mclass, mwi, coding, validity, deferred, dlrmask;    List *reply_headers;    int ret;    mclass = mwi = coding = validity =         deferred = dlrmask = SMS_PARAM_UNDEFINED;    user = http_cgi_variable(cgivars, "username");    pass = http_cgi_variable(cgivars, "password");    from = http_cgi_variable(cgivars, "from");    to = http_cgi_variable(cgivars, "to");    text = http_cgi_variable(cgivars, "text");    udh = http_cgi_variable(cgivars, "udh");    account = http_cgi_variable(cgivars, "account");    binfo = http_cgi_variable(cgivars, "binfo");    dlrurl = http_cgi_variable(cgivars, "dlr-url");    dlrmid = http_cgi_variable(cgivars, "dlr-mid");    tmp_string = http_cgi_variable(cgivars, "flash");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &mclass);    }    tmp_string = http_cgi_variable(cgivars, "mclass");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &mclass);    }    tmp_string = http_cgi_variable(cgivars, "mwi");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &mwi);    }    tmp_string = http_cgi_variable(cgivars, "coding");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &coding);    }    tmp_string = http_cgi_variable(cgivars, "validity");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &validity);    }    tmp_string = http_cgi_variable(cgivars, "deferred");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &deferred);    }    tmp_string = http_cgi_variable(cgivars, "dlr-mask");    if (tmp_string) {        sscanf(octstr_get_cstr(tmp_string),"%d", &dlrmask);    }    debug("smsc.http.kannel", 0, "HTTP[%s]: Received an HTTP request",          octstr_get_cstr(conn->id));        if (user == NULL || pass == NULL ||	    octstr_compare(user, conndata->username) != 0 ||	    octstr_compare(pass, conndata->password) != 0) {        error(0, "HTTP[%s]: Authorization failure",              octstr_get_cstr(conn->id));        retmsg = octstr_create("Authorization failed for sendsms");    }    else if (dlrurl != NULL && dlrmask != 0 && dlrmid != NULL) {        /* we got a DLR, and we don't require additional values */        Msg *dlrmsg;                dlrmsg = dlr_find(conn->id,            dlrmid, /* message id */            to, /* destination */            dlrmask);        if (dlrmsg != NULL) {            dlrmsg->sms.sms_type = report_mo;            debug("smsc.http.kannel", 0, "HTTP[%s]: Received DLR for DLR-URL <%s>",                  octstr_get_cstr(conn->id), octstr_get_cstr(dlrmsg->sms.dlr_url));                ret = bb_smscconn_receive(conn, dlrmsg);            if (ret == -1)                retmsg = octstr_create("Not accepted");            else                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(dlrmid),                  octstr_get_cstr(to), dlrmask);            retmsg = octstr_create("Unknown DLR, not accepted");        }                        }    else if (from == NULL || to == NULL || text == NULL) {	        error(0, "HTTP[%s]: Insufficient args",              octstr_get_cstr(conn->id));        retmsg = octstr_create("Insufficient args, rejected");    }    else if (udh != NULL && (octstr_len(udh) != octstr_get_char(udh, 0) + 1)) {        error(0, "HTTP[%s]: UDH field misformed, rejected",              octstr_get_cstr(conn->id));        retmsg = octstr_create("UDH field misformed, rejected");    }    else if (udh != NULL && octstr_len(udh) > MAX_SMS_OCTETS) {        error(0, "HTTP[%s]: UDH field is too long, rejected",              octstr_get_cstr(conn->id));        retmsg = octstr_create("UDH field is too long, rejected");    }    else {        /* we got a normal MO SMS */        Msg *msg;        msg = msg_create(sms);        debug("smsc.http.kannel", 0, "HTTP[%s]: Constructing new SMS",              octstr_get_cstr(conn->id));	        msg->sms.service = octstr_duplicate(user);        msg->sms.sender = octstr_duplicate(from);        msg->sms.receiver = octstr_duplicate(to);        msg->sms.msgdata = octstr_duplicate(text);        msg->sms.udhdata = octstr_duplicate(udh);        msg->sms.smsc_id = octstr_duplicate(conn->id);        msg->sms.time = time(NULL);        msg->sms.mclass = mclass;        msg->sms.mwi = mwi;        msg->sms.coding = coding;        msg->sms.validity = validity;        msg->sms.deferred = deferred;        msg->sms.account = octstr_duplicate(account);        msg->sms.binfo = octstr_duplicate(binfo);        ret = bb_smscconn_receive(conn, msg);        if (ret == -1)            retmsg = octstr_create("Not accepted");        else            retmsg = octstr_create("Sent.");    }    reply_headers = gwlist_create();    http_header_add(reply_headers, "Content-Type", "text/plain");    debug("smsc.http.kannel", 0, "HTTP[%s]: Sending reply",          octstr_get_cstr(conn->id));    http_send_reply(client, HTTP_ACCEPTED, reply_headers, retmsg);    octstr_destroy(retmsg);    http_destroy_headers(reply_headers);}/*---------------------------------------------------------------- * Clickatell - http://api.clickatell.com/ * * Rene Kluwen <rene.kluwen@chimit.nl> *//* MT related function */static void clickatell_send_sms(SMSCConn *conn, Msg *sms){    ConnData *conndata = conn->data;    Octstr *url;    List *headers;    /* form the basic URL */    url = octstr_format("%S/sendmsg?to=%E&from=%E&api_id=%E&user=%E&password=%E",        conndata->send_url, sms->sms.receiver, sms->sms.sender, conndata->system_id, conndata->username, conndata->password);        /*      * 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);    }    /* add UDH header */    if (octstr_len(sms->sms.udhdata)) {        octstr_format_append(url, "&data=%H", sms->sms.msgdata);        octstr_format_append(url, "&udh=%H", sms->sms.udhdata);    } else {        octstr_format_append(url, "&text=%E", sms->sms.msgdata);    }    if (DLR_IS_ENABLED_DEVICE(sms->sms.dlr_mask))	octstr_format_append(url, "&callback=3&deliv_ack=1");    headers = http_create_empty_headers();    debug("smsc.http.clickatell", 0, "HTTP[%s]: Sending request <%s>",          octstr_get_cstr(conn->id), octstr_get_cstr(url));    /*      * Clickatell requires optionally an SSL-enabled HTTP client call, this is handled     * transparently by the Kannel HTTP layer module.     */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -