xref: /lighttpd1.4/src/reqpool.c (revision 70b1af06)
1 /*
2  * reqpool - request objects
3  *
4  * Copyright(c) 2020 Glenn Strauss gstrauss()gluelogic.com  All rights reserved
5  * License: BSD 3-clause (same as lighttpd)
6  */
7 #include "first.h"
8 #include "reqpool.h"
9 
10 #include <stdlib.h>
11 
12 #include "base.h"
13 #include "buffer.h"
14 #include "chunk.h"
15 #include "plugin.h"
16 #include "plugin_config.h"
17 #include "request.h"
18 #include "response.h"
19 
20 
21 void
22 request_init (request_st * const r, connection * const con, server * const srv)
23 {
24     r->write_queue = chunkqueue_init();
25     r->read_queue = chunkqueue_init();
26     r->reqbody_queue = chunkqueue_init();
27 
28     r->http_method = HTTP_METHOD_UNSET;
29     r->http_version = HTTP_VERSION_UNSET;
30     r->resp_header_len = 0;
31     r->loops_per_request = 0;
32     r->con = con;
33     r->tmp_buf = srv->tmp_buf;
34 
35     /* init plugin-specific per-request structures */
36     r->plugin_ctx = calloc(1, (srv->plugins.used + 1) * sizeof(void *));
37     force_assert(NULL != r->plugin_ctx);
38 
39     r->cond_cache = calloc(srv->config_context->used, sizeof(cond_cache_t));
40     force_assert(NULL != r->cond_cache);
41 
42   #ifdef HAVE_PCRE_H
43     if (srv->config_context->used > 1) {/*(save 128b per con if no conditions)*/
44         r->cond_match =
45           calloc(srv->config_context->used, sizeof(cond_match_t));
46         force_assert(NULL != r->cond_match);
47     }
48   #endif
49 }
50 
51 
52 void
53 request_reset (request_st * const r)
54 {
55     plugins_call_handle_request_reset(r);
56 
57     http_response_reset(r);
58 
59     r->resp_header_len = 0;
60     r->loops_per_request = 0;
61 
62     r->h2state = 0; /* H2_STATE_IDLE */
63     r->h2id = 0;
64     r->http_method = HTTP_METHOD_UNSET;
65     r->http_version = HTTP_VERSION_UNSET;
66 
67     /*con->proto_default_port = 80;*//*set to default in connection_accepted()*/
68 
69     r->http_host = NULL;
70     r->reqbody_length = 0;
71     r->te_chunked = 0;
72     r->rqst_htags = 0;
73 
74     r->async_callback = 0;
75     r->error_handler_saved_status = 0;
76     /*r->error_handler_saved_method = HTTP_METHOD_UNSET;*/
77     /*(error_handler_saved_method value is not valid
78      * unless error_handler_saved_status is set)*/
79 
80     buffer_clear(&r->uri.scheme);
81 
82     if (r->rqst_header_len <= BUFFER_MAX_REUSE_SIZE) {
83         r->rqst_headers.used = 0;
84         /* (Note: total header size not recalculated on HANDLER_COMEBACK
85          *  even if other request headers changed during processing)
86          * (While this might delay release of larger buffers, it is not
87          *  expected to be the general case.  For those systems where it
88          *  is a typical case, the larger buffers are likely to be reused) */
89         buffer_clear(&r->target);
90         buffer_clear(&r->pathinfo);
91         /*buffer_clear(&r->target_orig);*/  /* reset later; used by mod_status*/
92         /*buffer_clear(&r->uri.path);*/     /* reset later; used by mod_status*/
93         /*buffer_clear(&r->uri.query);*/    /* reset later; used by mod_status*/
94         /*buffer_clear(&r->uri.authority);*//* reset later; used by mod_status*/
95         /*buffer_clear(&r->server_name_buf);*//* reset when used */
96     }
97     else {
98         buffer_reset(&r->target);
99         buffer_reset(&r->pathinfo);
100         /*buffer_reset(&r->target_orig);*/  /* reset later; used by mod_status*/
101         /*buffer_reset(&r->uri.path);*/     /* reset later; used by mod_status*/
102         /*buffer_reset(&r->uri.query);*/    /* reset later; used by mod_status*/
103         /*buffer_clear(&r->uri.authority);*//* reset later; used by mod_status*/
104         /*buffer_clear(&r->server_name_buf);*//* reset when used */
105         array_reset_data_strings(&r->rqst_headers);
106     }
107     r->rqst_header_len = 0;
108     if (0 != r->env.used)
109         array_reset_data_strings(&r->env);
110 
111     chunkqueue_reset(r->reqbody_queue);
112 
113     /* The cond_cache gets reset in response.c */
114     /* config_cond_cache_reset(r); */
115 }
116 
117 
118 void
119 request_free (request_st * const r)
120 {
121     chunkqueue_free(r->reqbody_queue);
122     chunkqueue_free(r->write_queue);
123     chunkqueue_free(r->read_queue);
124     array_free_data(&r->rqst_headers);
125     array_free_data(&r->resp_headers);
126     array_free_data(&r->env);
127 
128     free(r->target.ptr);
129     free(r->target_orig.ptr);
130 
131     free(r->uri.scheme.ptr);
132     free(r->uri.authority.ptr);
133     free(r->uri.path.ptr);
134     free(r->uri.query.ptr);
135 
136     free(r->physical.doc_root.ptr);
137     free(r->physical.path.ptr);
138     free(r->physical.basedir.ptr);
139     free(r->physical.etag.ptr);
140     free(r->physical.rel_path.ptr);
141 
142     free(r->pathinfo.ptr);
143     free(r->server_name_buf.ptr);
144 
145     free(r->plugin_ctx);
146     free(r->cond_cache);
147     free(r->cond_match);
148 
149     /* note: r is not zeroed here and r is not freed here */
150 }
151