Beispiel #1
0
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);
	}
}
Beispiel #2
0
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);
    }
}
Beispiel #4
0
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;
    }
}
Beispiel #5
0
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);
}