static void http_readcb(struct bufferevent *bev, void *arg) { const char *what = "This is funny"; event_debug(("%s: %s\n", __func__, EVBUFFER_DATA(bev->input))); if (evbuffer_find(bev->input, (const unsigned char*) what, strlen(what)) != NULL) { struct evhttp_request *req = evhttp_request_new(NULL, NULL); enum message_read_status done; req->kind = EVHTTP_RESPONSE; done = evhttp_parse_firstline(req, bev->input); if (done != ALL_DATA_READ) goto out; done = evhttp_parse_headers(req, bev->input); if (done != ALL_DATA_READ) goto out; if (done == 1 && evhttp_find_header(req->input_headers, "Content-Type") != NULL) test_ok++; out: evhttp_request_free(req); bufferevent_disable(bev, EV_READ); if (base) event_base_loopexit(base, NULL); else event_loopexit(NULL); } }
int source_callback_helper(struct evhttp_request *req, void *arg){ if ((size_t)BOUNDARY_LENGTH > EVBUFFER_LENGTH(req->input_buffer)){ return 0; } if (DEBUG) fprintf(stdout, "source_callback\n"); // enum message_read_status done; evhttp_clear_headers(req->input_headers); evhttp_parse_headers(req, req->input_buffer); char *content_len; content_len = (char *) evhttp_find_header(req->input_headers, "Content-Length"); if (!content_len){return 0; // drain buffer? // exit? } int len = atoi(content_len); size_t len_size; len_size = (size_t)len; if (DEBUG) fprintf(stdout, "received content_length:%d buffer has:%d\n", (int)len, (int)EVBUFFER_LENGTH(req->input_buffer)); struct global_data *client_data = (struct global_data *)arg; char *data = calloc(len, sizeof(char *)); evbuffer_remove(req->input_buffer, data, len); if (DEBUG)fprintf(stdout, "data has %d bytes\n", (int)strlen(data)); if (DEBUG)fprintf(stdout, "data=%s\n", data); (*client_data->cb)(data, client_data->cbarg); free(data); // empty buffer // -- if ((size_t)BOUNDARY_LENGTH <= EVBUFFER_LENGTH(req->input_buffer) ){ evbuffer_drain(req->input_buffer, (size_t)BOUNDARY_LENGTH); } return 1; }
void source_callback (struct evhttp_request *req, void *arg){ if (DEBUG) fprintf(stdout, "source_callback\n"); // enum message_read_status done; evhttp_clear_headers(req->input_headers); evhttp_parse_headers(req, req->input_buffer); char *content_len; content_len = (char *) evhttp_find_header(req->input_headers, "Content-Length"); if (!content_len){return;} int len = atoi(content_len); size_t len_size; len_size = (size_t)len; if (DEBUG) fprintf(stdout, "received content_length:%d buffer has:%d\n", len, EVBUFFER_LENGTH(req->input_buffer)); struct global_data *client_data = (struct global_data *)arg; struct evhttp_request *evhttp_target_request = NULL; evhttp_target_request = evhttp_request_new(http_post_done, NULL); evhttp_add_header(evhttp_target_request->output_headers, "Host", client_data->target_address); char *data = calloc(len, sizeof(char *)); evbuffer_remove(req->input_buffer, data, len); if (DEBUG)fprintf(stdout, "data has %d bytes\n", strlen(data)); if (DEBUG)fprintf(stdout, "data=%s\n", data); // empty buffer evbuffer_drain(req->input_buffer, EVBUFFER_LENGTH(req->input_buffer)); // write to output buffer int flag = (*client_data->cb)(data, evhttp_target_request->output_buffer, &client_data->target_path, client_data->cbarg); free(data); if (!flag){return;} // don't make the request if (evhttp_make_request(client_data->evhttp_target_connection, evhttp_target_request, EVHTTP_REQ_POST, client_data->target_path) == -1) { fprintf(stdout, "FAILED make_request\n"); exit(1); } }
void stream_request_readcb(struct bufferevent *bev, void *arg) { struct evhttp_request *req; struct StreamRequest *sr = (struct StreamRequest *)arg; _DEBUG("stream_request_readcb()\n"); switch (sr->state) { case read_firstline: req = evhttp_request_new(NULL, NULL); req->kind = EVHTTP_RESPONSE; // 1 is the constant ALL_DATA_READ in http-internal.h if (evhttp_parse_firstline(req, EVBUFFER_INPUT(bev)) == 1) { sr->state = read_headers; } evhttp_request_free(req); // dont break, try to parse the headers too case read_headers: req = evhttp_request_new(NULL, NULL); req->kind = EVHTTP_RESPONSE; // 1 is the constant ALL_DATA_READ in http-internal.h if (evhttp_parse_headers(req, EVBUFFER_INPUT(bev)) == 1) { if (sr->header_cb) { sr->header_cb(sr->bev, req->input_headers, sr->arg); } sr->state = read_body; } evhttp_request_free(req); break; case read_body: if (sr->read_cb) { sr->read_cb(sr->bev, sr->arg); } break; } }
static void http_chunked_errorcb(struct bufferevent *bev, short what, void *arg) { if (!test_ok) goto out; test_ok = -1; if ((what & EVBUFFER_EOF) != 0) { struct evhttp_request *req = evhttp_request_new(NULL, NULL); const char *header; enum message_read_status done; req->kind = EVHTTP_RESPONSE; done = evhttp_parse_firstline(req, EVBUFFER_INPUT(bev)); if (done != ALL_DATA_READ) goto out; done = evhttp_parse_headers(req, EVBUFFER_INPUT(bev)); if (done != ALL_DATA_READ) goto out; header = evhttp_find_header(req->input_headers, "Transfer-Encoding"); if (header == NULL || strcmp(header, "chunked")) goto out; header = evhttp_find_header(req->input_headers, "Connection"); if (header == NULL || strcmp(header, "close")) goto out; header = evbuffer_readline(EVBUFFER_INPUT(bev)); if (header == NULL) goto out; /* 13 chars */ if (strcmp(header, "d")) goto out; free((char*)header); if (strncmp((char *)EVBUFFER_DATA(EVBUFFER_INPUT(bev)), "This is funny", 13)) goto out; evbuffer_drain(EVBUFFER_INPUT(bev), 13 + 2); header = evbuffer_readline(EVBUFFER_INPUT(bev)); if (header == NULL) goto out; /* 18 chars */ if (strcmp(header, "12")) goto out; free((char *)header); if (strncmp((char *)EVBUFFER_DATA(EVBUFFER_INPUT(bev)), "but not hilarious.", 18)) goto out; evbuffer_drain(EVBUFFER_INPUT(bev), 18 + 2); header = evbuffer_readline(EVBUFFER_INPUT(bev)); if (header == NULL) goto out; /* 8 chars */ if (strcmp(header, "8")) goto out; free((char *)header); if (strncmp((char *)EVBUFFER_DATA(EVBUFFER_INPUT(bev)), "bwv 1052.", 8)) goto out; evbuffer_drain(EVBUFFER_INPUT(bev), 8 + 2); header = evbuffer_readline(EVBUFFER_INPUT(bev)); if (header == NULL) goto out; /* 0 chars */ if (strcmp(header, "0")) goto out; free((char *)header); test_ok = 2; } out: event_loopexit(NULL); }