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

📄 bb_http.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
📖 第 1 页 / 共 2 页
字号:
        return octstr_create("SMSC id not given");}static Octstr *httpd_restart_smsc(List *cgivars, int status_type){    Octstr *reply;    Octstr *smsc;    if ((reply = httpd_check_authorization(cgivars, 0))!= NULL) return reply;    if ((reply = httpd_check_status())!= NULL) return reply;    /* check if the smsc id is given */    smsc = http_cgi_variable(cgivars, "smsc");    if (smsc) {        if (bb_restart_smsc(smsc) == -1)            return octstr_format("Could not re-start smsc-id `%s'", octstr_get_cstr(smsc));        else            return octstr_format("SMSC `%s' re-started", octstr_get_cstr(smsc));    } else        return octstr_create("SMSC id not given");}/* Known httpd commands and their functions */static struct httpd_command {    const char *command;    Octstr * (*function)(List *cgivars, int status_type);} httpd_commands[] = {    { "status", httpd_status },    { "store-status", httpd_store_status },    { "log-level", httpd_loglevel },    { "shutdown", httpd_shutdown },    { "suspend", httpd_suspend },    { "isolate", httpd_isolate },    { "resume", httpd_resume },    { "restart", httpd_restart },    { "flush-dlr", httpd_flush_dlr },    { "stop-smsc", httpd_stop_smsc },    { "start-smsc", httpd_restart_smsc },    { NULL , NULL } /* terminate list */};static void httpd_serve(HTTPClient *client, Octstr *ourl, List *headers,    	    	    	Octstr *body, List *cgivars){    Octstr *reply, *final_reply, *url;    char *content_type;    char *header, *footer;    int status_type;    int i;    long pos;    reply = final_reply = NULL; /* for compiler please */    url = octstr_duplicate(ourl);    /* Set default reply format according to client     * Accept: header */    if (http_type_accepted(headers, "text/vnd.wap.wml")) {	status_type = BBSTATUS_WML;	content_type = "text/vnd.wap.wml";    }    else if (http_type_accepted(headers, "text/html")) {	status_type = BBSTATUS_HTML;	content_type = "text/html";    }    else if (http_type_accepted(headers, "text/xml")) {	status_type = BBSTATUS_XML;	content_type = "text/xml";    } else {	status_type = BBSTATUS_TEXT;	content_type = "text/plain";    }    /* kill '/cgi-bin' prefix */    pos = octstr_search(url, octstr_imm("/cgi-bin/"), 0);    if (pos != -1)        octstr_delete(url, pos, 9);    else if (octstr_get_char(url, 0) == '/')        octstr_delete(url, 0, 1);    /* look for type and kill it */    pos = octstr_search_char(url, '.', 0);    if (pos != -1) {        Octstr *tmp = octstr_copy(url, pos+1, octstr_len(url) - pos - 1);        octstr_delete(url, pos, octstr_len(url) - pos);        if (octstr_str_compare(tmp, "txt") == 0)            status_type = BBSTATUS_TEXT;        else if (octstr_str_compare(tmp, "html") == 0)            status_type = BBSTATUS_HTML;        else if (octstr_str_compare(tmp, "xml") == 0)            status_type = BBSTATUS_XML;        else if (octstr_str_compare(tmp, "wml") == 0)            status_type = BBSTATUS_WML;        octstr_destroy(tmp);    }    for (i=0; httpd_commands[i].command != NULL; i++) {        if (octstr_str_compare(url, httpd_commands[i].command) == 0) {            reply = httpd_commands[i].function(cgivars, status_type);            break;        }    }    /* check if command found */    if (httpd_commands[i].command == NULL) {        char *lb = bb_status_linebreak(status_type);	reply = octstr_format("Unknown command `%S'.%sPossible commands are:%s",            ourl, lb, lb);        for (i=0; httpd_commands[i].command != NULL; i++)            octstr_format_append(reply, "%s%s", httpd_commands[i].command, lb);    }    gw_assert(reply != NULL);    if (status_type == BBSTATUS_HTML) {	header = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">\n" 	    "<html>\n<title>" GW_NAME "</title>\n<body>\n<p>";	footer = "</p>\n</body></html>\n";	content_type = "text/html";    } else if (status_type == BBSTATUS_WML) {	header = "<?xml version=\"1.0\"?>\n"            "<!DOCTYPE wml PUBLIC \"-//WAPFORUM//DTD WML 1.1//EN\" "            "\"http://www.wapforum.org/DTD/wml_1.1.xml\">\n"            "\n<wml>\n <card>\n  <p>";	footer = "  </p>\n </card>\n</wml>\n";	content_type = "text/vnd.wap.wml";    } else if (status_type == BBSTATUS_XML) {	header = "<?xml version=\"1.0\"?>\n"            "<gateway>\n";        footer = "</gateway>\n";    } else {	header = "";	footer = "";	content_type = "text/plain";    }    final_reply = octstr_create(header);    octstr_append(final_reply, reply);    octstr_append_cstr(final_reply, footer);        /* debug("bb.http", 0, "Result: '%s'", octstr_get_cstr(final_reply));     */    http_destroy_headers(headers);    headers = list_create();    http_header_add(headers, "Content-Type", content_type);    http_send_reply(client, HTTP_OK, headers, final_reply);    octstr_destroy(url);    octstr_destroy(ourl);    octstr_destroy(body);    octstr_destroy(reply);    octstr_destroy(final_reply);    http_destroy_headers(headers);    http_destroy_cgiargs(cgivars);}static void httpadmin_run(void *arg){    HTTPClient *client;    Octstr *ip, *url, *body;    List *headers, *cgivars;    while(bb_status != BB_DEAD) {	if (bb_status == BB_SHUTDOWN)	    bb_shutdown();    	client = http_accept_request(ha_port, &ip, &url, &headers, &body, 	    	    	    	     &cgivars);	if (client == NULL)	    break;	if (is_allowed_ip(ha_allow_ip, ha_deny_ip, ip) == 0) {	    info(0, "HTTP admin tried from denied host <%s>, disconnected",		 octstr_get_cstr(ip));	    http_close_client(client);	    continue;	}        httpd_serve(client, url, headers, body, cgivars);	octstr_destroy(ip);    }    httpadmin_running = 0;}/*------------------------------------------------------------- * public functions * */int httpadmin_start(Cfg *cfg){    CfgGroup *grp;    int ssl = 0; #ifdef HAVE_LIBSSL    Octstr *ssl_server_cert_file;    Octstr *ssl_server_key_file;#endif /* HAVE_LIBSSL */        if (httpadmin_running) return -1;    grp = cfg_get_single_group(cfg, octstr_imm("core"));    if (cfg_get_integer(&ha_port, grp, octstr_imm("admin-port")) == -1)	panic(0, "Missing admin-port variable, cannot start HTTP admin");    ha_interface = cfg_get(grp, octstr_imm("admin-interface"));    ha_password = cfg_get(grp, octstr_imm("admin-password"));    if (ha_password == NULL)	panic(0, "You MUST set HTTP admin-password");        ha_status_pw = cfg_get(grp, octstr_imm("status-password"));    ha_allow_ip = cfg_get(grp, octstr_imm("admin-allow-ip"));    ha_deny_ip = cfg_get(grp, octstr_imm("admin-deny-ip"));#ifdef HAVE_LIBSSL    cfg_get_bool(&ssl, grp, octstr_imm("admin-port-ssl"));        /*     * check if SSL is desired for HTTP servers and then     * load SSL client and SSL server public certificates      * and private keys     */        ssl_server_cert_file = cfg_get(grp, octstr_imm("ssl-server-cert-file"));    ssl_server_key_file = cfg_get(grp, octstr_imm("ssl-server-key-file"));    if (ssl_server_cert_file != NULL && ssl_server_key_file != NULL) {        /* we are fine here, the following call is now in conn_config_ssl(),         * so there is no reason to do this twice.        use_global_server_certkey_file(ssl_server_cert_file,             ssl_server_key_file);        */    } else if (ssl) {	   panic(0, "You MUST specify cert and key files within core group for SSL-enabled HTTP servers!");    }    octstr_destroy(ssl_server_cert_file);    octstr_destroy(ssl_server_key_file);#endif /* HAVE_LIBSSL */    http_open_port_if(ha_port, ssl, ha_interface);    if (gwthread_create(httpadmin_run, NULL) == -1)	panic(0, "Failed to start a new thread for HTTP admin");    httpadmin_running = 1;    return 0;}void httpadmin_stop(void){    http_close_all_ports();    gwthread_join_every(httpadmin_run);    octstr_destroy(ha_interface);        octstr_destroy(ha_password);    octstr_destroy(ha_status_pw);    octstr_destroy(ha_allow_ip);    octstr_destroy(ha_deny_ip);    ha_password = NULL;    ha_status_pw = NULL;    ha_allow_ip = NULL;    ha_deny_ip = NULL;}

⌨️ 快捷键说明

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