summaryrefslogtreecommitdiff
path: root/src/reqpool.c
diff options
context:
space:
mode:
authorGlenn Strauss <gstrauss@gluelogic.com>2020-08-30 23:40:30 -0400
committerGlenn Strauss <gstrauss@gluelogic.com>2020-10-11 11:43:06 -0400
commit550609c8ae1e3de49029871d332827e2e2cb0406 (patch)
tree4d34d0ab2035ccee22cc2986be360e71fd4f70b0 /src/reqpool.c
parent0905b6f7f93cf516d8ba08e56dd4a0a4a32e6c53 (diff)
downloadlighttpd-git-550609c8ae1e3de49029871d332827e2e2cb0406.tar.gz
[core] request_acquire(), request_release()
continue code abstraction for (request_st *)
Diffstat (limited to 'src/reqpool.c')
-rw-r--r--src/reqpool.c89
1 files changed, 88 insertions, 1 deletions
diff --git a/src/reqpool.c b/src/reqpool.c
index 3b71b815..a473a672 100644
--- a/src/reqpool.c
+++ b/src/reqpool.c
@@ -56,7 +56,6 @@ request_reset (request_st * const r)
http_response_reset(r);
- r->resp_header_len = 0;
r->loops_per_request = 0;
r->h2state = 0; /* H2_STATE_IDLE */
@@ -109,12 +108,63 @@ request_reset (request_st * const r)
array_reset_data_strings(&r->env);
chunkqueue_reset(r->reqbody_queue);
+ /* r->read_queue, r->write_queue are shared with con for HTTP/1.1
+ * but are different than con->read_queue, con->write_queue for HTTP/2
+ * For HTTP/1.1, when r->read_queue == con->read_queue, r->read_queue
+ * is not cleared between requests since it might contain subsequent
+ * requests. (see also request_release()) */
/* The cond_cache gets reset in response.c */
/* config_cond_cache_reset(r); */
}
+#if 0 /* DEBUG_DEV */
+__attribute_cold__
+static void request_plugin_ctx_check(request_st * const r, server * const srv) {
+ /* plugins should have cleaned themselves up */
+ for (uint32_t i = 0, used = srv->plugins.used; i < used; ++i) {
+ plugin *p = ((plugin **)(srv->plugins.ptr))[i];
+ plugin_data_base *pd = p->data;
+ if (!pd) continue;
+ if (NULL == r->plugin_ctx[pd->id]
+ && NULL == r->con->plugin_ctx[pd->id]) continue;
+ log_error(r->conf.errh, __FILE__, __LINE__,
+ "missing cleanup in %s", p->name);
+ r->plugin_ctx[pd->id] = NULL;
+ r->con->plugin_ctx[pd->id] = NULL;
+ }
+}
+#endif
+
+
+void
+request_reset_ex (request_st * const r)
+{
+ #if 0 /* DEBUG_DEV */
+ /* plugins should have cleaned themselves up (id range: [1,used]) */
+ connection * const con = r->con;
+ server * const srv = con->srv;
+ for (uint32_t i = 1; i <= srv->plugins.used; ++i) {
+ if (NULL != r->plugin_ctx[i] || NULL != con->plugin_ctx[i]) {
+ request_plugin_ctx_check(r, srv);
+ break;
+ }
+ }
+ #endif
+
+ buffer_clear(&r->uri.authority);
+ buffer_reset(&r->uri.path);
+ buffer_reset(&r->uri.query);
+ buffer_reset(&r->target_orig);
+ buffer_reset(&r->target); /*(see comments in request_reset())*/
+ buffer_reset(&r->pathinfo); /*(see comments in request_reset())*/
+
+ /* preserve; callers must handle changes */
+ /*r->state = CON_STATE_CONNECT;*/
+}
+
+
void
request_free (request_st * const r)
{
@@ -148,3 +198,40 @@ request_free (request_st * const r)
/* note: r is not zeroed here and r is not freed here */
}
+
+
+void
+request_release (request_st * const r)
+{
+ /* (For HTTP/1.1, r == &con->request, and so request_release() not called)
+ * r->read_queue, r->write_queue are shared with con for HTTP/1.1
+ * but are different than con->read_queue, con->write_queue for HTTP/2
+ * For HTTP/1.1, when r->read_queue == con->read_queue, r->read_queue
+ * is not cleared between requests since it might contain subsequent
+ * requests. (see also request_reset()) */
+ chunkqueue_reset(r->read_queue);
+
+ /*(r->cond_cache and r->cond_match are re-init in h2_init_stream())*/
+
+ request_reset(r);
+ request_reset_ex(r);
+ r->state = CON_STATE_CONNECT;
+
+ /* future: might keep a pool of reusable (request_st *) */
+ request_free(r);
+ free(r);
+}
+
+
+request_st *
+request_acquire (connection * const con)
+{
+ /* future: might keep a pool of reusable (request_st *) */
+ request_st * const r = calloc(1, sizeof(request_st));
+ force_assert(r);
+ request_init(r, con, con->srv);
+
+ r->con = con;
+ r->tmp_buf = con->srv->tmp_buf;
+ return r;
+}