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

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  * test_xmlrpc.c: A simple program to test XML-RPC parsing
  3.  *
  4.  * Stipe Tolj <tolj@wapme-systems.de>
  5.  */
  6. #include <string.h>
  7. #include <stdlib.h>
  8. #include <unistd.h>
  9. #include <stdio.h>
  10. #include "gwlib/gwlib.h"
  11. #include "gwlib/http.h"
  12. #include "gwlib/xmlrpc.h"
  13. #define MAX_THREADS 1024
  14. #define MAX_IN_QUEUE 128
  15. static Counter *counter = NULL;
  16. static long max_requests = 1;
  17. static int verbose = 1;
  18. static Octstr *auth_username = NULL;
  19. static Octstr *auth_password = NULL;
  20. static Octstr *ssl_client_certkey_file = NULL;
  21. static Octstr *extra_headers = NULL;
  22. static Octstr *content_file = NULL;
  23. static Octstr *url = NULL;
  24. static int file = 0;
  25. static XMLRPCMethodCall *msg;
  26. static void start_request(HTTPCaller *caller, List *reqh, long i)
  27. {
  28.     long *id;
  29.     int ret;
  30.     if ((i % 1000) == 0)
  31.    info(0, "Starting fetch %ld", i);
  32.     id = gw_malloc(sizeof(long));
  33.     *id = i;
  34.                            
  35.     /*
  36.      * not semd the XML-RPC document contained in msg to
  37.      * the URL 'url' using the POST method
  38.      */
  39.     ret = xmlrpc_call_send(msg, caller, url, reqh, id);
  40.     debug("", 0, "Started request %ld with url:", *id);
  41.     octstr_url_decode(url);
  42.     octstr_dump(url, 0);
  43. }
  44. static int receive_reply(HTTPCaller *caller)
  45. {
  46.     void *id;
  47.     int ret;
  48.     Octstr *final_url;
  49.     List *replyh;
  50.     Octstr *replyb;
  51.     Octstr *type;
  52.     Octstr *charset;
  53.     Octstr *os;
  54.     id = http_receive_result(caller, &ret, &final_url, &replyh, &replyb);
  55.     octstr_destroy(final_url);
  56.     if (id == NULL || ret == -1) {
  57.         error(0, "http POST failed");
  58.         gw_free(id);
  59.         return -1;
  60.     }
  61.     debug("", 0, "Done with request %ld", *(long *) id);
  62.     gw_free(id);
  63.     http_header_get_content_type(replyh, &type, &charset);
  64.     debug("", 0, "Content-type is <%s>, charset is <%s>",
  65.           octstr_get_cstr(type), octstr_get_cstr(charset));
  66.     octstr_destroy(type);
  67.     octstr_destroy(charset);
  68.     if (verbose)
  69.         debug("", 0, "Reply headers:");
  70.     while ((os = list_extract_first(replyh)) != NULL) {
  71.         if (verbose)
  72.             octstr_dump(os, 1);
  73.         octstr_destroy(os);
  74.     }
  75.     list_destroy(replyh, NULL);
  76.     if (verbose) {
  77.         debug("", 0, "Reply body:");
  78.         octstr_dump(replyb, 1);
  79.     }
  80.     octstr_destroy(replyb);
  81.     return 0;
  82. }
  83. static void client_thread(void *arg) 
  84. {
  85.     List *reqh;
  86.     long i, succeeded, failed;
  87.     HTTPCaller *caller;
  88.     char buf[1024];
  89.     long in_queue;
  90.     caller = arg;
  91.     succeeded = 0;
  92.     failed = 0;
  93.     reqh = list_create();
  94.     sprintf(buf, "%ld", (long) gwthread_self());
  95.     http_header_add(reqh, "X-Thread", buf);
  96.     if (auth_username != NULL && auth_password != NULL)
  97.         http_add_basic_auth(reqh, auth_username, auth_password);
  98.     in_queue = 0;
  99.     
  100.     for (;;) {
  101.         while (in_queue < MAX_IN_QUEUE) {
  102.             i = counter_increase(counter);
  103.             if (i >= max_requests)
  104.                 goto receive_rest;
  105.             start_request(caller, reqh, i);
  106. #if 0
  107.             gwthread_sleep(0.1);
  108. #endif
  109.             ++in_queue;
  110.         }
  111.         while (in_queue >= MAX_IN_QUEUE) {
  112.             if (receive_reply(caller) == -1)
  113.                 ++failed;
  114.             else
  115.                 ++succeeded;
  116.             --in_queue;
  117.         }
  118.     }
  119.     
  120. receive_rest:
  121.     while (in_queue > 0) {
  122.         if (receive_reply(caller) == -1)
  123.             ++failed;
  124.         else
  125.             ++succeeded;
  126.         --in_queue;
  127.     }
  128.     http_caller_destroy(caller);
  129.     info(0, "This thread: %ld succeeded, %ld failed.", succeeded, failed);
  130. }
  131. static void help(void) 
  132. {
  133.     info(0, "Usage: test_xmlrpc [options] xml_source");
  134.     info(0, "where options are:");
  135.     info(0, "-u URL");
  136.     info(0, "    send XML-RPC source as POST HTTP request to URL");
  137.     info(0, "-v number");
  138.     info(0, "    set log level for stderr logging");
  139.     info(0, "-q");
  140.     info(0, "    don't print the body or headers of the HTTP response");
  141.     info(0, "-r number");
  142.     info(0, "    make `number' requests, repeating URLs as necessary");
  143.     info(0, "-p domain.name");
  144.     info(0, "    use `domain.name' as a proxy");
  145.     info(0, "-P portnumber");
  146.     info(0, "    connect to proxy at port `portnumber'");
  147.     info(0, "-e domain1:domain2:...");
  148.     info(0, "    set exception list for proxy use");
  149.     info(0, "-s");
  150.     info(0, "    use HTTPS scheme to access SSL-enabled HTTP server");
  151.     info(0, "-c ssl_client_cert_key_file");
  152.     info(0, "    use this file as the SSL certificate and key file");
  153. }
  154. int main(int argc, char **argv)
  155. {
  156.     int i, opt, num_threads;
  157.     Octstr *proxy;
  158.     List *exceptions;
  159.     long proxy_port;
  160.     Octstr *proxy_username;
  161.     Octstr *proxy_password;
  162.     char *p;
  163.     long threads[MAX_THREADS];
  164.     time_t start, end;
  165.     double run_time;
  166.     FILE *fp;
  167.     Octstr *output, *xml_doc;
  168.     int ssl = 0;
  169.     
  170.     gwlib_init();
  171.     proxy = NULL;
  172.     proxy_port = -1;
  173.     exceptions = list_create();
  174.     proxy_username = NULL;
  175.     proxy_password = NULL;
  176.     num_threads = 0;
  177.     file = 0;
  178.     fp = NULL;
  179.     
  180.     while ((opt = getopt(argc, argv, "hvr:t:p:u:P:e:a:sc:")) != EOF) {
  181.         switch (opt) {
  182.             case 'h':
  183.                 help();
  184.                 exit(1);
  185.                 break;
  186.             case 'v':
  187.                 log_set_output_level(atoi(optarg));
  188.                 break;
  189.             case 'r':
  190.                 max_requests = atoi(optarg);
  191.                 break;
  192.             case 't':
  193.                 num_threads = atoi(optarg);
  194.                 if (num_threads > MAX_THREADS)
  195.                     num_threads = MAX_THREADS;
  196.                 break;
  197.             case 'p':
  198.                 proxy = octstr_create(optarg);
  199.                 break;
  200.             case 'u':
  201.                 url = octstr_create(optarg);
  202.                 break;
  203.             case 'P':
  204.                 proxy_port = atoi(optarg);
  205.                 break;
  206.             case 'e':
  207.                 p = strtok(optarg, ":");
  208.                 while (p != NULL) {
  209.                     list_append(exceptions, octstr_create(p));
  210.                     p = strtok(NULL, ":");
  211.                 }
  212.                 break;
  213.             case 'a':
  214.                 p = strtok(optarg, ":");
  215.                 if (p != NULL) {
  216.                     auth_username = octstr_create(p);
  217.                     p = strtok(NULL, "");
  218.                     if (p != NULL)
  219.                         auth_password = octstr_create(p);
  220.                 }
  221.                 break;
  222.             case 's':
  223.                 ssl = 1;
  224.                 break;
  225.             case 'c':
  226.            octstr_destroy(ssl_client_certkey_file);
  227.            ssl_client_certkey_file = octstr_create(optarg);
  228.                 break;
  229.             case '?':
  230.             default:
  231.                 error(0, "Invalid option %c", opt);
  232.                 help();
  233.                 panic(0, "Stopping");
  234.                 break;
  235.         }
  236.     }
  237.     if (optind >= argc) {
  238.         error(0, "Missing arguments");
  239.         help();
  240.         panic(0, "Stopping");
  241.     }
  242. #ifdef HAVE_LIBSSL
  243.     /*
  244.      * check if we are doing a SSL-enabled client version here
  245.      * load the required cert and key file
  246.      */
  247.     if (ssl) {
  248.         if (ssl_client_certkey_file != NULL) {
  249.             use_global_client_certkey_file(ssl_client_certkey_file);
  250.         } else {
  251.             panic(0, "client certkey file need to be given!");
  252.         }
  253.     }
  254. #endif
  255.     if (proxy != NULL && proxy_port > 0) {
  256.         http_use_proxy(proxy, proxy_port, exceptions,
  257.                        proxy_username, proxy_password);
  258.     }
  259.     octstr_destroy(proxy);
  260.     octstr_destroy(proxy_username);
  261.     octstr_destroy(proxy_password);
  262.     list_destroy(exceptions, octstr_destroy_item);
  263.     
  264.     counter = counter_create();
  265.     xml_doc = octstr_read_file(argv[optind]);
  266.     if (xml_doc == NULL)
  267.         panic(0, "Cannot read the XML document");
  268.     /*
  269.      * parse the XML source
  270.      */
  271.     msg = xmlrpc_call_parse(xml_doc);
  272.     if ((xmlrpc_parse_status(msg) != XMLRPC_COMPILE_OK) && 
  273.         ((output = xmlrpc_parse_error(msg)) != NULL)) {
  274.         /* parse failure */
  275.         error(0, "%s", octstr_get_cstr(output));
  276.         octstr_destroy(output);
  277.     }
  278.     /*
  279.      * if no POST is desired then dump the re-formated XML
  280.      */
  281.     if (url != NULL) {
  282.         
  283.         time(&start);
  284.         if (num_threads == 0)
  285.        client_thread(http_caller_create());
  286.         else {
  287.             for (i = 0; i < num_threads; ++i)
  288.                 threads[i] = gwthread_create(client_thread, http_caller_create());
  289.             for (i = 0; i < num_threads; ++i)
  290.                 gwthread_join(threads[i]);
  291.         }
  292.         time(&end);
  293.     
  294.     
  295.         run_time = difftime(end, start);
  296.         info(0, "%ld requests in %f seconds, %f requests/s.",
  297.          max_requests, run_time, max_requests / run_time);
  298.         
  299.         octstr_destroy(url);
  300.     } else {
  301.         output = xmlrpc_call_octstr(msg);
  302.         octstr_dump(output, 0);
  303.         octstr_destroy(output);
  304.     }
  305.     counter_destroy(counter);
  306.     octstr_destroy(auth_username);
  307.     octstr_destroy(auth_password);
  308.     octstr_destroy(ssl_client_certkey_file);
  309.     octstr_destroy(extra_headers);
  310.     octstr_destroy(content_file);
  311.     xmlrpc_call_destroy(msg);
  312.     octstr_destroy(xml_doc);
  313.     gwlib_shutdown();
  314.     return 0;
  315. }