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