| diff --git a/CMakeLists.txt b/CMakeLists.txt |
| index 676727f1..833fbf70 100644 |
| --- a/CMakeLists.txt |
| +++ b/CMakeLists.txt |
| @@ -200,7 +200,7 @@ endif() |
| if (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR (${CLANG})) |
| set(GNUC 1) |
| endif() |
| -if (("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") OR (${CLANG})) |
| +if (("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") OR ("${CMAKE_C_SIMULATE_ID}" STREQUAL "MSVC")) |
| set(MSVC 1) |
| endif() |
| |
| diff --git a/buffer.c b/buffer.c |
| index 3524b350..e5d97458 100644 |
| --- a/buffer.c |
| +++ b/buffer.c |
| @@ -2204,9 +2204,9 @@ evbuffer_expand(struct evbuffer *buf, size_t datlen) |
| #define IOV_LEN_TYPE unsigned long |
| #endif |
| #endif |
| -#define NUM_READ_IOVEC 4 |
| +#define NUM_READ_IOVEC 8 |
| |
| -#define EVBUFFER_MAX_READ 4096 |
| +#define EVBUFFER_MAX_READ (128 * 1024) |
| |
| /** Helper function to figure out which space to use for reading data into |
| an evbuffer. Internal use only. |
| diff --git a/bufferevent_async.c b/bufferevent_async.c |
| index 40c7c5e8..c1624878 100644 |
| --- a/bufferevent_async.c |
| +++ b/bufferevent_async.c |
| @@ -275,7 +275,7 @@ bev_async_consider_reading(struct bufferevent_async *beva) |
| } |
| at_most = read_high - cur_size; |
| } else { |
| - at_most = 16384; /* FIXME totally magic. */ |
| + at_most = 128 * 1024; /* FIXME totally magic. */ |
| } |
| |
| /* XXXX This over-commits. */ |
| diff --git a/bufferevent_ratelim.c b/bufferevent_ratelim.c |
| index 25874968..9bc2b577 100644 |
| --- a/bufferevent_ratelim.c |
| +++ b/bufferevent_ratelim.c |
| @@ -179,7 +179,7 @@ ev_token_bucket_cfg_free(struct ev_token_bucket_cfg *cfg) |
| } |
| |
| /* Default values for max_single_read & max_single_write variables. */ |
| -#define MAX_SINGLE_READ_DEFAULT 16384 |
| +#define MAX_SINGLE_READ_DEFAULT (128 * 1024) |
| #define MAX_SINGLE_WRITE_DEFAULT 16384 |
| |
| #define LOCK_GROUP(g) EVLOCK_LOCK((g)->lock, 0) |
| diff --git a/http-internal.h b/http-internal.h |
| index feaf436d..9f9b5ab5 100644 |
| --- a/http-internal.h |
| +++ b/http-internal.h |
| @@ -167,6 +167,8 @@ struct evhttp { |
| void *gencbarg; |
| struct bufferevent* (*bevcb)(struct event_base *, void *); |
| void *bevcbarg; |
| + int (*newreqcb)(struct evhttp_request *req, void *); |
| + void *newreqcbarg; |
| |
| struct event_base *base; |
| }; |
| diff --git a/http.c b/http.c |
| index 04f089bc..53951cba 100644 |
| --- a/http.c |
| +++ b/http.c |
| @@ -3975,6 +3975,14 @@ evhttp_set_bevcb(struct evhttp *http, |
| http->bevcbarg = cbarg; |
| } |
| |
| +void |
| +evhttp_set_newreqcb(struct evhttp *http, |
| + int (*cb)(struct evhttp_request *, void *), void *cbarg) |
| +{ |
| + http->newreqcb = cb; |
| + http->newreqcbarg = cbarg; |
| +} |
| + |
| /* |
| * Request related functions |
| */ |
| @@ -4036,6 +4044,8 @@ evhttp_request_free(struct evhttp_request *req) |
| req->flags |= EVHTTP_REQ_NEEDS_FREE; |
| return; |
| } |
| + if (req->on_free_cb) |
| + (*req->on_free_cb)(req, req->on_free_cb_arg); |
| |
| if (req->remote_host != NULL) |
| mm_free(req->remote_host); |
| @@ -4116,6 +4126,15 @@ evhttp_request_set_on_complete_cb(struct evhttp_request *req, |
| req->on_complete_cb_arg = cb_arg; |
| } |
| |
| +void |
| +evhttp_request_set_on_free_cb(struct evhttp_request *req, |
| + void (*cb)(struct evhttp_request *, void *), void *cb_arg) |
| +{ |
| + req->on_free_cb = cb; |
| + req->on_free_cb_arg = cb_arg; |
| +} |
| + |
| + |
| /* |
| * Allows for inspection of the request URI |
| */ |
| @@ -4307,10 +4326,15 @@ evhttp_associate_new_request_with_connection(struct evhttp_connection *evcon) |
| */ |
| req->userdone = 1; |
| |
| - TAILQ_INSERT_TAIL(&evcon->requests, req, next); |
| - |
| req->kind = EVHTTP_REQUEST; |
| |
| + if (http->newreqcb && http->newreqcb(req, http->newreqcbarg) == -1) { |
| + evhttp_request_free(req); |
| + return (-1); |
| + } |
| + |
| + TAILQ_INSERT_TAIL(&evcon->requests, req, next); |
| + |
| |
| evhttp_start_read_(evcon); |
| |
| diff --git a/include/event2/http.h b/include/event2/http.h |
| index 2a41303e..e80bab9a 100644 |
| --- a/include/event2/http.h |
| +++ b/include/event2/http.h |
| @@ -298,6 +298,20 @@ EVENT2_EXPORT_SYMBOL |
| void evhttp_set_bevcb(struct evhttp *http, |
| struct bufferevent *(*cb)(struct event_base *, void *), void *arg); |
| |
| +/** |
| + Set a callback which allows the user to note or throttle incoming requests. |
| + The requests are not populated with HTTP level information. They |
| + are just associated to a connection. |
| + If the callback returns -1, the associated connection is terminated |
| + and the request is closed. |
| + @param http the evhttp server object for which to set the callback |
| + @param cb the callback to invoke for incoming connections |
| + @param arg an context argument for the callback |
| + */ |
| +EVENT2_EXPORT_SYMBOL |
| +void evhttp_set_newreqcb(struct evhttp *http, |
| + int (*cb)(struct evhttp_request*, void *), void *arg); |
| + |
| /** |
| Adds a virtual host to the http server. |
| |
| @@ -624,6 +638,20 @@ EVENT2_EXPORT_SYMBOL |
| void evhttp_request_set_on_complete_cb(struct evhttp_request *req, |
| void (*cb)(struct evhttp_request *, void *), void *cb_arg); |
| |
| +/** |
| + * Set a callback to be called on request free. |
| + * |
| + * The callback function will be called just before the evhttp_request object |
| + * is destroyed. |
| + * |
| + * @param req a request object |
| + * @param cb callback function that will be called before request free |
| + * @param cb_arg an additional context argument for the callback |
| + */ |
| +EVENT2_EXPORT_SYMBOL |
| +void evhttp_request_set_on_free_cb(struct evhttp_request *req, |
| + void (*cb)(struct evhttp_request *, void *), void *cb_arg); |
| + |
| /** Frees the request object and removes associated events. */ |
| EVENT2_EXPORT_SYMBOL |
| void evhttp_request_free(struct evhttp_request *req); |
| diff --git a/include/event2/http_struct.h b/include/event2/http_struct.h |
| index 4bf5b1ff..0762cabd 100644 |
| --- a/include/event2/http_struct.h |
| +++ b/include/event2/http_struct.h |
| @@ -142,6 +142,12 @@ struct { |
| */ |
| void (*on_complete_cb)(struct evhttp_request *, void *); |
| void *on_complete_cb_arg; |
| + |
| + /* |
| + * Free callback - called just before the request is freed. |
| + */ |
| + void (*on_free_cb)(struct evhttp_request *, void *); |
| + void *on_free_cb_arg; |
| }; |
| |
| #ifdef __cplusplus |