test_http_server.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:7k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * test_http.c - a simple program to test the http library, server end
  3.  *
  4.  * Lars Wirzenius
  5.  */
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <signal.h>
  10. #include "gwlib/gwlib.h"
  11. #include "gwlib/http.h"
  12. #define MAX_THREADS 1024
  13. Octstr *whitelist,
  14.        *blacklist;
  15. int verbose,
  16.     run,
  17.     port;
  18. static void client_thread(void *arg) 
  19. {
  20.     HTTPClient *client;
  21.     Octstr *body, *url, *ip;
  22.     List *headers, *resph, *cgivars;
  23.     HTTPCGIVar *v;
  24.     Octstr *reply_body, *reply_type;
  25.     
  26.     if (arg == NULL) {
  27. reply_body = octstr_create("Sent.");
  28. reply_type = octstr_create("Content-Type: text/plain; "
  29.                   "charset="UTF-8"");
  30.     } else {
  31. reply_body = arg;
  32. reply_type = octstr_create("Content-Type: text/vnd.wap.wml");
  33.     }
  34.     
  35.     resph = list_create();
  36.     list_append(resph, reply_type);
  37.     while (run) {
  38. client = http_accept_request(port, &ip, &url, &headers, &body, 
  39.                     &cgivars);
  40. if (client == NULL)
  41.     break;
  42. debug("test.http", 0, "Request for <%s> from <%s>", 
  43.               octstr_get_cstr(url), octstr_get_cstr(ip));
  44.         if (verbose)
  45.             debug("test.http", 0, "Cgivars were");
  46. while ((v = list_extract_first(cgivars)) != NULL) {
  47.     if (verbose) {
  48.         octstr_dump(v->name, 0);
  49.         octstr_dump(v->value, 0);
  50.             }
  51.     octstr_destroy(v->name);
  52.     octstr_destroy(v->value);
  53.     gw_free(v);
  54. }
  55. list_destroy(cgivars, NULL);
  56.     
  57.     if (octstr_compare(url, octstr_imm("/quit")) == 0) {
  58.     run = 0;
  59.     } else if (octstr_compare(url, octstr_imm("/whitelist")) == 0) {
  60.     octstr_destroy(reply_body);
  61.         if (whitelist != NULL) {
  62.             if (verbose) {
  63.                 debug("test.http.server", 0, "we send a white list");
  64.                 octstr_dump(whitelist, 0);
  65.             }
  66.             reply_body = octstr_duplicate(whitelist);
  67.         } else {
  68.         reply_body = octstr_imm("");
  69.     }
  70. } else if (octstr_compare(url, octstr_imm("/blacklist")) == 0) {
  71.         octstr_destroy(reply_body);
  72.         if (blacklist != NULL) {
  73.             if (verbose) {
  74.                 debug("test.http.server", 0, "we send a blacklist");
  75.                 octstr_dump(blacklist, 0);
  76.             }
  77.         reply_body = octstr_duplicate(blacklist);
  78.         } else {
  79.         reply_body = octstr_imm("");
  80.     } 
  81.     }
  82.         
  83.    if (verbose) {
  84.        debug("test.http", 0, "request headers were");
  85.        http_header_dump(headers);
  86.        if (body != NULL) {
  87.            debug("test.http", 0, "request body was");
  88.            octstr_dump(body, 0);
  89.        }
  90.     }
  91. octstr_destroy(ip);
  92. octstr_destroy(url);
  93. octstr_destroy(body);
  94. list_destroy(headers, octstr_destroy_item);
  95.     
  96. http_send_reply(client, HTTP_OK, resph, reply_body);
  97.     }
  98.     list_destroy(resph, octstr_destroy_item);
  99.     octstr_destroy(reply_body);
  100.     octstr_destroy(whitelist);
  101.     octstr_destroy(blacklist);
  102.     debug("test.http", 0, "client_thread terminates");
  103.     http_close_all_ports();
  104. }
  105. static void help(void) {
  106.     info(0, "Usage: test_http_server [-v loglevel][-l logfile][-f file][-h][-q][-p port][-s][-c ssl_cert][-k ssl_key][-w white_list][b blacklist]n");
  107. }
  108. static void sigterm(int signo) {
  109.     run = 0;
  110.     http_close_all_ports();
  111.     debug("test.gwlib", 0, "Signal %d received, quitting.", signo);
  112. }
  113. int main(int argc, char **argv) {
  114.     int i, opt, use_threads;
  115.     struct sigaction act;
  116.     char *filename;
  117.     Octstr *log_filename;
  118.     Octstr *file_contents;
  119.     int ssl = 0;   /* indicate if SSL-enabled server should be used */
  120. #ifdef HAVE_LIBSSL
  121.     Octstr *ssl_server_cert_file = NULL;
  122.     Octstr *ssl_server_key_file = NULL;
  123. #endif
  124.     char *whitelist_name;
  125.     char *blacklist_name;
  126.     int white_asked,
  127.         black_asked;
  128.     long threads[MAX_THREADS];
  129.     gwlib_init();
  130.     act.sa_handler = sigterm;
  131.     sigemptyset(&act.sa_mask);
  132.     act.sa_flags = 0;
  133.     sigaction(SIGTERM, &act, NULL);
  134.     port = 8080;
  135.     use_threads = 1;
  136.     verbose = 1;
  137.     run = 1;
  138.     filename = NULL;
  139.     log_filename = NULL;
  140.     blacklist_name = NULL;
  141.     whitelist_name = NULL;
  142.     white_asked = 0;
  143.     black_asked = 0;
  144.     while ((opt = getopt(argc, argv, "hqv:p:t:f:l:sc:k:b:w:")) != EOF) {
  145. switch (opt) {
  146. case 'v':
  147.     log_set_output_level(atoi(optarg));
  148.     break;
  149.         case 'q':
  150.     verbose = 0;                                           
  151.     break;
  152. case 'h':
  153.     help();
  154.     exit(0);
  155. case 'p':
  156.     port = atoi(optarg);
  157.     break;
  158. case 't':
  159.     use_threads = atoi(optarg);
  160.     if (use_threads > MAX_THREADS)
  161.             use_threads = MAX_THREADS;
  162.     break;
  163.         case 'c':
  164. #ifdef HAVE_LIBSSL
  165.     octstr_destroy(ssl_server_cert_file);
  166.     ssl_server_cert_file = octstr_create(optarg);
  167. #endif
  168.         break;
  169.         case 'k':
  170. #ifdef HAVE_LIBSSL
  171.     octstr_destroy(ssl_server_key_file);
  172.     ssl_server_key_file = octstr_create(optarg);
  173. #endif
  174.         break;
  175. case 's':
  176. #ifdef HAVE_LIBSSL
  177.         ssl = 1;
  178. #endif   
  179.         break;
  180. case 'f':
  181.     filename = optarg;
  182.     break;
  183. case 'l':
  184.     octstr_destroy(log_filename);
  185.     log_filename = octstr_create(optarg);
  186. break;
  187.     case 'w':
  188.         whitelist_name = optarg;
  189.         if (whitelist_name == NULL)
  190.             whitelist_name = "";
  191.         white_asked = 1;
  192. break;
  193.     case 'b':
  194.         blacklist_name = optarg;
  195.         if (blacklist_name == NULL)
  196.             blacklist_name = "";
  197.         black_asked = 1;
  198. break;
  199. case '?':
  200. default:
  201.     error(0, "Invalid option %c", opt);
  202.     help();
  203.     panic(0, "Stopping.");
  204. }
  205.     }
  206.     if (log_filename != NULL) {
  207.      log_open(octstr_get_cstr(log_filename), GW_DEBUG);
  208.     octstr_destroy(log_filename);
  209.     }
  210.     if (filename == NULL)
  211.      file_contents = NULL;
  212.     else
  213.      file_contents = octstr_read_file(filename);
  214.     if (white_asked) {
  215.         whitelist = octstr_read_file(whitelist_name);
  216.         if (whitelist == NULL)
  217.             panic(0, "Cannot read the whitelist");
  218.     }
  219.     
  220.     if (black_asked) {
  221.         blacklist = octstr_read_file(blacklist_name);
  222.         if (blacklist == NULL)
  223.             panic(0, "Cannot read the blacklist");
  224.     }
  225. #ifdef HAVE_LIBSSL
  226.     /*
  227.      * check if we are doing a SSL-enabled server version here
  228.      * load the required cert and key file
  229.      */
  230.     if (ssl) {
  231.         if (ssl_server_cert_file != NULL && ssl_server_key_file != NULL) {
  232.             use_global_server_certkey_file(ssl_server_cert_file, ssl_server_key_file);
  233.             octstr_destroy(ssl_server_cert_file);
  234.             octstr_destroy(ssl_server_key_file);
  235.         } else {
  236.             panic(0, "certificate and public key need to be given!");
  237.         }
  238.     }
  239. #endif
  240.      
  241.     if (http_open_port(port, ssl) == -1)
  242. panic(0, "http_open_server failed");
  243.     /*
  244.      * Do the real work in a separate thread so that the main
  245.      * thread can catch signals safely.
  246.      */
  247.     for (i = 0; i < use_threads; ++i) 
  248.         threads[i] = gwthread_create(client_thread, file_contents);
  249.     for (i = 0; i < use_threads; ++i)
  250.         gwthread_join(threads[i]);
  251.     debug("test.http", 0, "Program exiting normally.");
  252.     gwlib_shutdown();
  253.     return 0;
  254. }