#include #include #include #include #include #include #include #include #include #ifdef USE_SSL #include #endif /* USE_SSL */ typedef struct _invoke_spec { cp_httpclient *client; char *uri; } invoke_spec; static char *url_re_lit = "^(http(s)?:\\/\\/)?([^:\\/]+)(\\:[0-9]{1,5})?(\\/.*)?$"; regex_t url_re; invoke_spec *parse_prm(char *prm) { cp_httpclient *client; regmatch_t rm[6]; invoke_spec *spec = NULL; cp_string *host; int ssl; int port; cp_string *uri; if (regexec(&url_re, prm, 6, rm, 0)) { printf("can\'t parse url: %s\n", prm); return NULL; } ssl = rm[2].rm_so != -1; host = cp_string_create(&prm[rm[3].rm_so], rm[3].rm_eo - rm[3].rm_so); if (rm[4].rm_so != -1) port = atoi(&prm[rm[4].rm_so + 1]); else port = ssl ? 443 : 80; if (rm[5].rm_so != -1) uri = cp_string_create(&prm[rm[5].rm_so], rm[5].rm_eo - rm[5].rm_so); else uri = cp_string_create("/", 1); printf("host: %s\n", cp_string_tocstr(host)); printf("port: %d\n", port); printf("uri: %s\n", cp_string_tocstr(uri)); printf("ssl: %s\n", ssl ? "yes" : "no"); if (ssl) client = cp_httpclient_create_ssl(cp_string_tocstr(host), port, "test/cacert.pem", "test", SSL_VERIFY_NONE); else client = cp_httpclient_create(cp_string_tocstr(host), port); cp_string_destroy(host); spec = calloc(1, sizeof(invoke_spec)); spec->client = client; spec->uri = uri->data; free(uri); return spec; } int *ids; int results = 0; void write_result(cp_httpclient_result *res) { char filename[80]; int id; id = *(int *) res->id; if (res->result != CP_HTTP_RESULT_SUCCESS) { fprintf(stderr, "request %d: error\n", id); } else { sprintf(filename, "tha-%d.html", id); cp_string_write_file(res->response->content, filename); } results++; } int main(int argc, char *argv[]) { int i, rcc; invoke_spec **spec; int num = argc - 1; if (argc < 2) { printf("do this: %s \"url\"\n", argv[0]); return 1; } if ((rcc = regcomp(&url_re, url_re_lit, REG_EXTENDED | REG_ICASE)) != 0) { char errbuf[0x100]; regerror(rcc, &url_re, errbuf, 0x100); printf("regex error: %s\n", errbuf); return 2; } cp_log_init("test_httpclient.log", LOG_LEVEL_DEBUG); cp_httpclient_init(); spec = malloc(num * sizeof(invoke_spec)); ids = malloc(num * sizeof(int)); for (i = 0; i < num; i++) { spec[i] = parse_prm(argv[i + 1]); ids[i] = i; } for (i = 0; i < num; i++) cp_httpclient_fetch_nb(spec[i]->client, spec[i]->uri, &ids[i], write_result, 1); /* wait for transfers to exit */ while (results < num) poll(NULL, 0, 200); for (i = 0; i < num; i++) { cp_httpclient_destroy(spec[i]->client); free(spec[i]->uri); free(spec[i]); } free(spec); free(ids); cp_httpclient_shutdown(); cp_log_close(); regfree(&url_re); return 0; }