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

📄 smsc_http.c

📁 WAP gateway, Linux source
💻 C
📖 第 1 页 / 共 5 页
字号:
                  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 brunet_receive_sms(SMSCConn *conn, HTTPClient *client,                               List *headers, Octstr *body, List *cgivars){    ConnData *conndata = conn->data;    Octstr *user, *from, *to, *text, *udh, *date, *type;    Octstr *retmsg;    int	mclass, mwi, coding, validity, deferred;    List *reply_headers;    int ret;    mclass = mwi = coding = validity = deferred = 0;    user = http_cgi_variable(cgivars, "CustomerId");    from = http_cgi_variable(cgivars, "MsIsdn");    to = http_cgi_variable(cgivars, "Recipient");    text = http_cgi_variable(cgivars, "SMMO");    udh = http_cgi_variable(cgivars, "XSer");    date = http_cgi_variable(cgivars, "DateReceived");    type = http_cgi_variable(cgivars, "MessageType");    debug("smsc.http.brunet", 0, "HTTP[%s]: Received a request",          octstr_get_cstr(conn->id));        if (user == NULL || octstr_compare(user, conndata->username) != 0) {        error(0, "HTTP[%s]: Authorization failure. CustomerId was <%s>.",              octstr_get_cstr(conn->id), octstr_get_cstr(user));        retmsg = octstr_create("Authorization failed for MO submission.");    }    else if (from == NULL || to == NULL || text == NULL) {        error(0, "HTTP[%s]: Insufficient args.",              octstr_get_cstr(conn->id));        retmsg = octstr_create("Insufficient arguments, rejected.");    }    else {        Msg *msg;        msg = msg_create(sms);        debug("smsc.http.brunet", 0, "HTTP[%s]: Received new MO SMS.",              octstr_get_cstr(conn->id));	        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); /* XXX maybe extract from DateReceived */         msg->sms.mclass = mclass;        msg->sms.mwi = mwi;        msg->sms.coding = coding;        msg->sms.validity = validity;        msg->sms.deferred = deferred;        ret = bb_smscconn_receive(conn, msg);        if (ret == -1)            retmsg = octstr_create("Status=1");        else            retmsg = octstr_create("Status=0");    }    reply_headers = gwlist_create();    http_header_add(reply_headers, "Content-Type", "text/plain");    debug("smsc.http.brunet", 0, "HTTP[%s]: Sending reply `%s'.",          octstr_get_cstr(conn->id), octstr_get_cstr(retmsg));    http_send_reply(client, HTTP_OK, reply_headers, retmsg);    octstr_destroy(retmsg);    http_destroy_headers(reply_headers);}/*---------------------------------------------------------------- * 3united.com (formerly Xidris) - An austrian (AT) SMS aggregator  * Implementing version 1.3, 2003-05-06 * Updating to version 1.9.1, 2004-09-28 * * Stipe Tolj <stolj@wapme.de> *//* MT related function */static void xidris_send_sms(SMSCConn *conn, Msg *sms){    ConnData *conndata = conn->data;    Octstr *url, *new_msg;    List *headers;    int dcs, esm_class;    url = new_msg = NULL;    dcs = esm_class = 0;    /* format the URL for call */    url = octstr_format("%S?"        "app_id=%E&key=%E&dest_addr=%E&source_addr=%E",        conndata->send_url, conndata->username,         conndata->password, sms->sms.receiver, sms->sms.sender);    if (octstr_len(sms->sms.udhdata)) {        /* RAW additions for binary (8bit) msgs  */        /* set the data coding scheme (DCS) and ESM class fields */        dcs = fields_to_dcs(sms, sms->sms.alt_dcs);        /* ESM_CLASS_SUBMIT_STORE_AND_FORWARD_MODE |            ESM_CLASS_SUBMIT_UDH_INDICATOR */        esm_class = 0x03 | 0x40;             /* prepend UDH header to message block */        new_msg = octstr_duplicate(sms->sms.udhdata);        octstr_append(new_msg, sms->sms.msgdata);        octstr_format_append(url, "&type=200&dcs=%d&esm=%d&message=%H",                             dcs, esm_class, new_msg);    }  else {        /* additions for text (7bit) msgs */        octstr_format_append(url, "&type=%E&message=%E",                            (sms->sms.mclass ? octstr_imm("1") : octstr_imm("0")),                            sms->sms.msgdata);    }    /*      * We use &account=<foobar> from sendsms interface to encode any additionaly     * proxied parameters, ie. billing information.     */    if (octstr_len(sms->sms.account)) {        octstr_url_decode(sms->sms.account);        octstr_format_append(url, "&%s", octstr_get_cstr(sms->sms.account));    }    headers = gwlist_create();    debug("smsc.http.xidris", 0, "HTTP[%s]: Sending request <%s>",          octstr_get_cstr(conn->id), octstr_get_cstr(url));    http_start_request(conndata->http_ref, HTTP_METHOD_GET, url, headers,                        NULL, 0, sms, NULL);    octstr_destroy(url);    octstr_destroy(new_msg);    http_destroy_headers(headers);}/*  * Parse for an parameter of an given XML tag and return it as Octstr */static Octstr *parse_xml_tag(Octstr *body, Octstr *tag){    Octstr *stag, *etag, *ret;    int spos, epos;       stag = octstr_format("<%s>", octstr_get_cstr(tag));    if ((spos = octstr_search(body, stag, 0)) == -1) {        octstr_destroy(stag);        return NULL;    }    etag = octstr_format("</%s>", octstr_get_cstr(tag));    if ((epos = octstr_search(body, etag, spos+octstr_len(stag))) == -1) {        octstr_destroy(stag);        octstr_destroy(etag);        return NULL;    }        ret = octstr_copy(body, spos+octstr_len(stag), epos+1 - (spos+octstr_len(etag)));      octstr_strip_blanks(ret);    octstr_strip_crlfs(ret);    octstr_destroy(stag);    octstr_destroy(etag);    return ret;}static void xidris_parse_reply(SMSCConn *conn, Msg *msg, int status,                               List *headers, Octstr *body){    Octstr *code, *desc, *mid;    if (status == HTTP_OK || status == HTTP_ACCEPTED) {        /* now parse the XML document for error code */        code = parse_xml_tag(body, octstr_imm("status"));        desc = parse_xml_tag(body, octstr_imm("description"));                /* The following parsing assumes we get only *one* message id in the          * response XML. Which is ok, since we garantee via previous concat         * splitting, that we only pass PDUs of 1 SMS size to SMSC. */        mid = parse_xml_tag(body, octstr_imm("message_id"));        if (octstr_case_compare(code, octstr_imm("0")) == 0 && mid != NULL) {            /* ensure the message id gets logged */            msg->sms.binfo = octstr_duplicate(mid);            /* SMSC ACK.. now we have the message id. */            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 {            error(0, "HTTP[%s]: Message not accepted. Status code <%s> "                  "description `%s'.", octstr_get_cstr(conn->id),                  octstr_get_cstr(code), octstr_get_cstr(desc));            bb_smscconn_send_failed(conn, msg,	                SMSCCONN_FAILED_MALFORMED, octstr_duplicate(desc));        }    } else {        error(0, "HTTP[%s]: Message was rejected. SMSC reponse was:",              octstr_get_cstr(conn->id));        octstr_dump(body, 0);        bb_smscconn_send_failed(conn, msg,	            SMSCCONN_FAILED_REJECTED, octstr_create("REJECTED"));    }}/* MO related function */static void xidris_receive_sms(SMSCConn *conn, HTTPClient *client,                               List *headers, Octstr *body, List *cgivars){    ConnData *conndata = conn->data;    Octstr *user, *pass, *from, *to, *text, *account, *binfo;    Octstr *state, *mid, *dest;    Octstr *retmsg;    int	mclass, mwi, coding, validity, deferred;     List *reply_headers;    int ret, status;    mclass = mwi = coding = validity = deferred = 0;    retmsg = NULL;    /* generic values */    user = http_cgi_variable(cgivars, "app_id");    pass = http_cgi_variable(cgivars, "key");    /* MO specific values */    from = http_cgi_variable(cgivars, "source_addr");    to = http_cgi_variable(cgivars, "dest_addr");    text = http_cgi_variable(cgivars, "message");    account = http_cgi_variable(cgivars, "operator");    binfo = http_cgi_variable(cgivars, "tariff");    /* DLR (callback) specific values */    state = http_cgi_variable(cgivars, "state");    mid = http_cgi_variable(cgivars, "message_id");    dest = http_cgi_variable(cgivars, "dest_addr");    debug("smsc.http.xidris", 0, "HTTP[%s]: Received a 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. username was <%s>.",              octstr_get_cstr(conn->id), octstr_get_cstr(user));        retmsg = octstr_create("Authorization failed for MO submission.");        status = HTTP_UNAUTHORIZED;    }    else if (state != NULL && mid != NULL && dest != NULL) {    /* a DLR message */        Msg *dlrmsg;        int dlrstat = -1;        if (octstr_compare(state, octstr_imm("DELIVRD")) == 0)            dlrstat = DLR_SUCCESS;        else if (octstr_compare(state, octstr_imm("ACCEPTD")) == 0)            dlrstat = DLR_BUFFERED;        else            dlrstat = DLR_FAIL;        dlrmsg = dlr_find(conn->id,            mid, /* smsc message id */            dest , /* destination */            dlrstat);        if (dlrmsg != NULL) {            dlrmsg->sms.msgdata = octstr_duplicate(mid);            dlrmsg->sms.sms_type = report_mo;                        ret = bb_smscconn_receive(conn, dlrmsg);            status = (ret == 0 ? HTTP_OK : HTTP_FORBIDDEN);        } 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(mid),                octstr_get_cstr(dest), dlrstat);            status = HTTP_OK;        }    }    else if (from == NULL || to == NULL || text == NULL) {        error(0, "HTTP[%s]: Insufficient args.",              octstr_get_cstr(conn->id));        retmsg = octstr_create("Insufficient arguments, rejected.");        status = HTTP_BAD_REQUEST;    }    else {        Msg *msg;        msg = msg_create(sms);        debug("smsc.http.xidris", 0, "HTTP[%s]: Received new MO SMS.",              octstr_get_cstr(conn->id));	        msg->sms.sender = octstr_duplicate(from);        msg->sms.receiver = octstr_duplicate(to);        msg->sms.msgdata = octstr_duplicate(text);        msg->sms.account = octstr_duplicate(account);        msg->sms.binfo = octstr_duplicate(binfo);        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;        ret = bb_smscconn_receive(conn, msg);        status = (ret == 0 ? HTTP_OK : HTTP_FORBIDDEN);    }    reply_headers = gwlist_create();    debug("smsc.http.xidris", 0, "HTTP[%s]: Sending reply with HTTP status <%d>.",          octstr_get_cstr(conn->id), status);    http_send_reply(client, status, reply_headers, retmsg);    octstr_destroy(retmsg);    http_destroy_headers(reply_headers);}/*---------------------------------------------------------------- * Wapme SMS Proxy * * Stipe Tolj <stolj@kannel.org> */

⌨️ 快捷键说明

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