int process_ipp_tag( Connection *conn, char tag_type ) { static char prev_name[1025]; char name[1025], value[1025]; int set; short int len; memset( name, 0, sizeof( name ) ); memset( value, 0, sizeof( value ) ); if( getshort_conn( conn, &len ) ) conn->ipp->data_left-=2; if( len < 1024 ) { if( len == 0 ) { strcpy( name, prev_name ); set = 1; } else { if( !read_conn( conn, name, len ) ) { return 0; } conn->ipp->data_left -= len; set = 0; } if( getshort_conn( conn, &len ) ) conn->ipp->data_left -= 2; if( len < 1024 ) if( read_conn( conn, value, len ) ) { conn->ipp->data_left -= len; ipp_add_tag( conn->ipp, tag_type, name, value, len, set ); strcpy( prev_name, name ); return 1; } } return 0; }
static void test_mg_download(void) { char *p1, *p2, ebuf[100]; int len1, len2, port = atoi(HTTPS_PORT); struct mg_connection *conn; struct mg_context *ctx; ASSERT((ctx = mg_start(event_handler, NULL, OPTIONS)) != NULL); ASSERT(mg_download(NULL, port, 0, ebuf, sizeof(ebuf), "") == NULL); ASSERT(mg_download("localhost", 0, 0, ebuf, sizeof(ebuf), "") == NULL); ASSERT(mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "") == NULL); // Fetch nonexistent file, should see 404 ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s", "GET /gimbec HTTP/1.0\r\n\r\n")) != NULL); ASSERT(strcmp(conn->request_info.uri, "404") == 0); mg_close_connection(conn); // Fetch mongoose.c, should succeed ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s", "GET /mongoose.c HTTP/1.0\r\n\r\n")) != NULL); ASSERT(!strcmp(conn->request_info.uri, "200")); ASSERT((p1 = read_conn(conn, &len1)) != NULL); ASSERT((p2 = read_file("mongoose.c", &len2)) != NULL); ASSERT(len1 == len2); ASSERT(memcmp(p1, p2, len1) == 0); free(p1), free(p2); mg_close_connection(conn); // Fetch in-memory file, should succeed. ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s", "GET /blah HTTP/1.1\r\n\r\n")) != NULL); ASSERT((p1 = read_conn(conn, &len1)) != NULL); ASSERT(len1 == (int) strlen(inmemory_file_data)); ASSERT(memcmp(p1, inmemory_file_data, len1) == 0); free(p1); mg_close_connection(conn); // Test SSL redirect, IP address ASSERT((conn = mg_download("localhost", atoi(HTTP_PORT), 0, ebuf, sizeof(ebuf), "%s", "GET /foo HTTP/1.1\r\n\r\n")) != NULL); ASSERT(strcmp(conn->request_info.uri, "302") == 0); ASSERT(strcmp(mg_get_header(conn, "Location"), "https://127.0.0.1:" HTTPS_PORT "/foo") == 0); mg_close_connection(conn); // Test SSL redirect, Host: ASSERT((conn = mg_download("localhost", atoi(HTTP_PORT), 0, ebuf, sizeof(ebuf), "%s", "GET /foo HTTP/1.1\r\nHost: a.b:77\n\n")) != NULL); ASSERT(strcmp(conn->request_info.uri, "302") == 0); ASSERT(strcmp(mg_get_header(conn, "Location"), "https://a.b:" HTTPS_PORT "/foo") == 0); mg_close_connection(conn); mg_stop(ctx); }
void main_loop(void) { int i, n, timeout = 250; struct connection *conn; ufds = must_calloc(thread_limit, sizeof(struct pollfd)); for (i = 0; i < thread_limit; ++i) ufds[i].fd = -1; while (head || outstanding) { start_next_comic(); n = poll(ufds, thread_limit, timeout); if (n < 0) { my_perror("poll"); continue; } if (n == 0) { timeout_connections(); if (!start_next_comic()) /* Once we have all the comics * started, increase the timeout * period. */ timeout = 1000; continue; } for (conn = comics; conn; conn = conn->next) if (!conn->poll) continue; else if (conn->poll->revents & POLLOUT) { if (!conn->connected) check_connect(conn); else { time(&conn->access); write_request(conn); } } else if (conn->poll->revents & POLLIN) { /* This check is needed for openssl */ if (!conn->connected) check_connect(conn); else read_conn(conn); } } free(ufds); }
int main(int argc, char *argv[]) { char *env; int i, n, timeout = 250; struct connection *conn; method = "HEAD"; while ((i = getopt(argc, argv, "hp:t:vT:")) != -1) switch ((char)i) { case 'h': usage(0); case 'p': set_proxy(optarg); break; case 't': thread_limit = strtol(optarg, NULL, 0); break; case 'v': verbose++; break; case 'T': read_timeout = strtol(optarg, NULL, 0); break; default: usage(1); } if (optind < argc) while (optind < argc) read_link_file(argv[optind++]); else read_urls(stdin); /* set_proxy will not use this if proxy already set */ env = getenv("COMICS_PROXY"); if (env) set_proxy(env); if (thread_limit == 0) { printf("You must allow at least one thread\n"); exit(1); } if (thread_limit > n_comics) thread_limit = n_comics; #ifdef _WIN32 win32_init(); #else signal(SIGTERM, dump_outstanding); signal(SIGHUP, dump_outstanding); #endif npoll = thread_limit + 1; /* add one for stdin */ ufds = must_calloc(npoll, sizeof(struct pollfd)); for (i = 0; i < npoll; ++i) ufds[i].fd = -1; while (head || outstanding) { start_next_comic(); n = poll(ufds, npoll, timeout); if (n < 0) { my_perror("poll"); continue; } if (n == 0) { timeout_connections(); if (!start_next_comic()) /* Once we have all the comics * started, increase the timeout * period. */ timeout = 1000; continue; } for (conn = comics; conn; conn = conn->next) if (!conn->poll) continue; else if (conn->poll->revents & POLLOUT) { if (!conn->connected) check_connect(conn); else { time(&conn->access); write_request(conn); } } else if (conn->poll->revents & POLLIN) { /* This check is needed for openssl */ if (!conn->connected) check_connect(conn); else read_conn(conn); } } out_results(comics, 0); return n_comics != gotit; }
static void test_mg_download(void) { char *p1, *p2, ebuf[100]; int len1, len2, port = atoi(HTTPS_PORT); struct mg_connection *conn; struct mg_context *ctx; ASSERT((ctx = mg_start(OPTIONS, event_handler, NULL)) != NULL); ASSERT(mg_download(NULL, port, 0, ebuf, sizeof(ebuf), "%s", "") == NULL); ASSERT(mg_download("localhost", 0, 0, ebuf, sizeof(ebuf), "%s", "") == NULL); ASSERT(mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s", "") == NULL); // Fetch nonexistent file, should see 404 ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s", "GET /gimbec HTTP/1.0\r\n\r\n")) != NULL); ASSERT(strcmp(conn->request_info.uri, "404") == 0); mg_close_connection(conn); ASSERT((conn = mg_download("google.com", 443, 1, ebuf, sizeof(ebuf), "%s", "GET / HTTP/1.0\r\n\r\n")) != NULL); mg_close_connection(conn); // POST with "Content-Length: 0", must not block ASSERT((conn = mg_download("localhost", atoi(HTTPS_PORT), 1, ebuf, sizeof(ebuf), "%s", "POST /zerolen HTTP/1.1\r\n" "Content-Lengh: 0\r\n\r\n ")) != NULL); ASSERT((p1 = read_conn(conn, &len1)) != NULL); ASSERT(len1 = 2); ASSERT(memcmp(p1, "ok", 2) == 0); mg_close_connection(conn); // Fetch main.c, should succeed ASSERT((conn = mg_download("localhost", port, 1, ebuf, sizeof(ebuf), "%s", "GET /main.c HTTP/1.0\r\n\r\n")) != NULL); ASSERT(!strcmp(conn->request_info.uri, "200")); ASSERT((p1 = read_conn(conn, &len1)) != NULL); ASSERT((p2 = read_file("main.c", &len2)) != NULL); ASSERT(len1 == len2); ASSERT(memcmp(p1, p2, len1) == 0); free(p1), free(p2); mg_close_connection(conn); // Test SSL redirect, IP address ASSERT((conn = mg_download("localhost", atoi(HTTP_PORT), 0, ebuf, sizeof(ebuf), "%s", "GET /foo HTTP/1.1\r\n\r\n")) != NULL); ASSERT(strcmp(conn->request_info.uri, "302") == 0); ASSERT(strcmp(mg_get_header(conn, "Location"), "https://127.0.0.1:" HTTPS_PORT "/foo") == 0); mg_close_connection(conn); // Test SSL redirect, Host: ASSERT((conn = mg_download("localhost", atoi(HTTP_PORT), 0, ebuf, sizeof(ebuf), "%s", "GET /foo HTTP/1.1\r\nHost: a.b:77\n\n")) != NULL); ASSERT(strcmp(conn->request_info.uri, "302") == 0); ASSERT(strcmp(mg_get_header(conn, "Location"), "https://a.b:" HTTPS_PORT "/foo") == 0); mg_close_connection(conn); mg_stop(ctx); }