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->resp_header_len = 0; 29 r->loops_per_request = 0; 30 r->con = con; 31 r->tmp_buf = srv->tmp_buf; 32 33 /* init plugin-specific per-request structures */ 34 r->plugin_ctx = calloc(1, (srv->plugins.used + 1) * sizeof(void *)); 35 force_assert(NULL != r->plugin_ctx); 36 37 r->cond_cache = calloc(srv->config_context->used, sizeof(cond_cache_t)); 38 force_assert(NULL != r->cond_cache); 39 40 #ifdef HAVE_PCRE_H 41 if (srv->config_context->used > 1) {/*(save 128b per con if no conditions)*/ 42 r->cond_match = 43 calloc(srv->config_context->used, sizeof(cond_match_t)); 44 force_assert(NULL != r->cond_match); 45 } 46 #endif 47 } 48 49 50 void 51 request_reset (request_st * const r) 52 { 53 plugins_call_handle_request_reset(r); 54 55 http_response_reset(r); 56 57 r->resp_header_len = 0; 58 r->loops_per_request = 0; 59 60 r->http_method = HTTP_METHOD_UNSET; 61 r->http_version = HTTP_VERSION_UNSET; 62 63 /*con->proto_default_port = 80;*//*set to default in connection_accepted()*/ 64 65 r->http_host = NULL; 66 r->reqbody_length = 0; 67 r->te_chunked = 0; 68 r->rqst_htags = 0; 69 70 r->async_callback = 0; 71 r->error_handler_saved_status = 0; 72 /*r->error_handler_saved_method = HTTP_METHOD_UNSET;*/ 73 /*(error_handler_saved_method value is not valid 74 * unless error_handler_saved_status is set)*/ 75 76 buffer_clear(&r->uri.scheme); 77 78 if (r->rqst_header_len <= BUFFER_MAX_REUSE_SIZE) { 79 r->rqst_headers.used = 0; 80 /* (Note: total header size not recalculated on HANDLER_COMEBACK 81 * even if other request headers changed during processing) 82 * (While this might delay release of larger buffers, it is not 83 * expected to be the general case. For those systems where it 84 * is a typical case, the larger buffers are likely to be reused) */ 85 buffer_clear(&r->target); 86 buffer_clear(&r->pathinfo); 87 /*buffer_clear(&r->target_orig);*/ /* reset later; used by mod_status*/ 88 /*buffer_clear(&r->uri.path);*/ /* reset later; used by mod_status*/ 89 /*buffer_clear(&r->uri.query);*/ /* reset later; used by mod_status*/ 90 /*buffer_clear(&r->uri.authority);*//* reset later; used by mod_status*/ 91 /*buffer_clear(&r->server_name_buf);*//* reset when used */ 92 } 93 else { 94 buffer_reset(&r->target); 95 buffer_reset(&r->pathinfo); 96 /*buffer_reset(&r->target_orig);*/ /* reset later; used by mod_status*/ 97 /*buffer_reset(&r->uri.path);*/ /* reset later; used by mod_status*/ 98 /*buffer_reset(&r->uri.query);*/ /* reset later; used by mod_status*/ 99 /*buffer_clear(&r->uri.authority);*//* reset later; used by mod_status*/ 100 /*buffer_clear(&r->server_name_buf);*//* reset when used */ 101 array_reset_data_strings(&r->rqst_headers); 102 } 103 r->rqst_header_len = 0; 104 if (0 != r->env.used) 105 array_reset_data_strings(&r->env); 106 107 chunkqueue_reset(r->reqbody_queue); 108 109 /* The cond_cache gets reset in response.c */ 110 /* config_cond_cache_reset(r); */ 111 } 112 113 114 void 115 request_free (request_st * const r) 116 { 117 chunkqueue_free(r->reqbody_queue); 118 chunkqueue_free(r->write_queue); 119 chunkqueue_free(r->read_queue); 120 array_free_data(&r->rqst_headers); 121 array_free_data(&r->resp_headers); 122 array_free_data(&r->env); 123 124 free(r->target.ptr); 125 free(r->target_orig.ptr); 126 127 free(r->uri.scheme.ptr); 128 free(r->uri.authority.ptr); 129 free(r->uri.path.ptr); 130 free(r->uri.query.ptr); 131 132 free(r->physical.doc_root.ptr); 133 free(r->physical.path.ptr); 134 free(r->physical.basedir.ptr); 135 free(r->physical.etag.ptr); 136 free(r->physical.rel_path.ptr); 137 138 free(r->pathinfo.ptr); 139 free(r->server_name_buf.ptr); 140 141 free(r->plugin_ctx); 142 free(r->cond_cache); 143 free(r->cond_match); 144 145 /* note: r is not zeroed here and r is not freed here */ 146 } 147