github.com/krum110487/go-htaccess@v0.0.0-20240316004156-60641c8e7598/tests/data/apache_2_2_34/include/http_request.h (about) 1 /* Licensed to the Apache Software Foundation (ASF) under one or more 2 * contributor license agreements. See the NOTICE file distributed with 3 * this work for additional information regarding copyright ownership. 4 * The ASF licenses this file to You under the Apache License, Version 2.0 5 * (the "License"); you may not use this file except in compliance with 6 * the License. You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /** 18 * @file http_request.h 19 * @brief Apache Request library 20 * 21 * request.c is the code which handles the main line of request 22 * processing, once a request has been read in (finding the right per- 23 * directory configuration, building it if necessary, and calling all 24 * the module dispatch functions in the right order). 25 * 26 * The pieces here which are public to the modules, allow them to learn 27 * how the server would handle some other file or URI, or perhaps even 28 * direct the server to serve that other file instead of the one the 29 * client requested directly. 30 * 31 * There are two ways to do that. The first is the sub_request mechanism, 32 * which handles looking up files and URIs as adjuncts to some other 33 * request (e.g., directory entries for multiviews and directory listings); 34 * the lookup functions stop short of actually running the request, but 35 * (e.g., for includes), a module may call for the request to be run 36 * by calling run_sub_req. The space allocated to create sub_reqs can be 37 * reclaimed by calling destroy_sub_req --- be sure to copy anything you care 38 * about which was allocated in its apr_pool_t elsewhere before doing this. 39 */ 40 41 #ifndef APACHE_HTTP_REQUEST_H 42 #define APACHE_HTTP_REQUEST_H 43 44 #include "apr_hooks.h" 45 #include "util_filter.h" 46 47 #ifdef __cplusplus 48 extern "C" { 49 #endif 50 51 #define AP_SUBREQ_NO_ARGS 0 52 #define AP_SUBREQ_MERGE_ARGS 1 53 54 /** 55 * An internal handler used by the ap_process_request, all subrequest mechanisms 56 * and the redirect mechanism. 57 * @param r The request, subrequest or internal redirect to pre-process 58 * @return The return code for the request 59 */ 60 AP_DECLARE(int) ap_process_request_internal(request_rec *r); 61 62 /** 63 * Create a subrequest from the given URI. This subrequest can be 64 * inspected to find information about the requested URI 65 * @param new_uri The URI to lookup 66 * @param r The current request 67 * @param next_filter The first filter the sub_request should use. If this is 68 * NULL, it defaults to the first filter for the main request 69 * @return The new request record 70 */ 71 AP_DECLARE(request_rec *) ap_sub_req_lookup_uri(const char *new_uri, 72 const request_rec *r, 73 ap_filter_t *next_filter); 74 75 /** 76 * Create a subrequest for the given file. This subrequest can be 77 * inspected to find information about the requested file 78 * @param new_file The file to lookup 79 * @param r The current request 80 * @param next_filter The first filter the sub_request should use. If this is 81 * NULL, it defaults to the first filter for the main request 82 * @return The new request record 83 */ 84 AP_DECLARE(request_rec *) ap_sub_req_lookup_file(const char *new_file, 85 const request_rec *r, 86 ap_filter_t *next_filter); 87 /** 88 * Create a subrequest for the given apr_dir_read result. This subrequest 89 * can be inspected to find information about the requested file 90 * @param finfo The apr_dir_read result to lookup 91 * @param r The current request 92 * @param subtype What type of subrequest to perform, one of; 93 * <PRE> 94 * AP_SUBREQ_NO_ARGS ignore r->args and r->path_info 95 * AP_SUBREQ_MERGE_ARGS merge r->args and r->path_info 96 * </PRE> 97 * @param next_filter The first filter the sub_request should use. If this is 98 * NULL, it defaults to the first filter for the main request 99 * @return The new request record 100 * @note The apr_dir_read flags value APR_FINFO_MIN|APR_FINFO_NAME flag is the 101 * minimum recommended query if the results will be passed to apr_dir_read. 102 * The file info passed must include the name, and must have the same relative 103 * directory as the current request. 104 */ 105 AP_DECLARE(request_rec *) ap_sub_req_lookup_dirent(const apr_finfo_t *finfo, 106 const request_rec *r, 107 int subtype, 108 ap_filter_t *next_filter); 109 /** 110 * Create a subrequest for the given URI using a specific method. This 111 * subrequest can be inspected to find information about the requested URI 112 * @param method The method to use in the new subrequest 113 * @param new_uri The URI to lookup 114 * @param r The current request 115 * @param next_filter The first filter the sub_request should use. If this is 116 * NULL, it defaults to the first filter for the main request 117 * @return The new request record 118 */ 119 AP_DECLARE(request_rec *) ap_sub_req_method_uri(const char *method, 120 const char *new_uri, 121 const request_rec *r, 122 ap_filter_t *next_filter); 123 /** 124 * An output filter to strip EOS buckets from sub-requests. This always 125 * has to be inserted at the end of a sub-requests filter stack. 126 * @param f The current filter 127 * @param bb The brigade to filter 128 * @return status code 129 */ 130 AP_CORE_DECLARE_NONSTD(apr_status_t) ap_sub_req_output_filter(ap_filter_t *f, 131 apr_bucket_brigade *bb); 132 133 /** 134 * Run the handler for the subrequest 135 * @param r The subrequest to run 136 * @return The return code for the subrequest 137 */ 138 AP_DECLARE(int) ap_run_sub_req(request_rec *r); 139 140 /** 141 * Free the memory associated with a subrequest 142 * @param r The subrequest to finish 143 */ 144 AP_DECLARE(void) ap_destroy_sub_req(request_rec *r); 145 146 /* 147 * Then there's the case that you want some other request to be served 148 * as the top-level request INSTEAD of what the client requested directly. 149 * If so, call this from a handler, and then immediately return OK. 150 */ 151 152 /** 153 * Redirect the current request to some other uri 154 * @param new_uri The URI to replace the current request with 155 * @param r The current request 156 */ 157 AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r); 158 159 /** 160 * This function is designed for things like actions or CGI scripts, when 161 * using AddHandler, and you want to preserve the content type across 162 * an internal redirect. 163 * @param new_uri The URI to replace the current request with. 164 * @param r The current request 165 */ 166 AP_DECLARE(void) ap_internal_redirect_handler(const char *new_uri, request_rec *r); 167 168 /** 169 * Redirect the current request to a sub_req, merging the pools 170 * @param sub_req A subrequest created from this request 171 * @param r The current request 172 * @note the sub_req's pool will be merged into r's pool, be very careful 173 * not to destroy this subrequest, it will be destroyed with the main request! 174 */ 175 AP_DECLARE(void) ap_internal_fast_redirect(request_rec *sub_req, request_rec *r); 176 177 /** 178 * Can be used within any handler to determine if any authentication 179 * is required for the current request 180 * @param r The current request 181 * @return 1 if authentication is required, 0 otherwise 182 */ 183 AP_DECLARE(int) ap_some_auth_required(request_rec *r); 184 185 /** 186 * Determine if the current request is the main request or a subrequest 187 * @param r The current request 188 * @return 1 if this is the main request, 0 otherwise 189 */ 190 AP_DECLARE(int) ap_is_initial_req(request_rec *r); 191 192 /** 193 * Function to set the r->mtime field to the specified value if it's later 194 * than what's already there. 195 * @param r The current request 196 * @param dependency_mtime Time to set the mtime to 197 */ 198 AP_DECLARE(void) ap_update_mtime(request_rec *r, apr_time_t dependency_mtime); 199 200 /** 201 * Add one or more methods to the list permitted to access the resource. 202 * Usually executed by the content handler before the response header is 203 * sent, but sometimes invoked at an earlier phase if a module knows it 204 * can set the list authoritatively. Note that the methods are ADDED 205 * to any already permitted unless the reset flag is non-zero. The 206 * list is used to generate the Allow response header field when it 207 * is needed. 208 * @param r The pointer to the request identifying the resource. 209 * @param reset Boolean flag indicating whether this list should 210 * completely replace any current settings. 211 * @param ... A NULL-terminated list of strings, each identifying a 212 * method name to add. 213 * @return None. 214 */ 215 AP_DECLARE(void) ap_allow_methods(request_rec *r, int reset, ...); 216 217 /** 218 * Add one or more methods to the list permitted to access the resource. 219 * Usually executed by the content handler before the response header is 220 * sent, but sometimes invoked at an earlier phase if a module knows it 221 * can set the list authoritatively. Note that the methods are ADDED 222 * to any already permitted unless the reset flag is non-zero. The 223 * list is used to generate the Allow response header field when it 224 * is needed. 225 * @param r The pointer to the request identifying the resource. 226 * @param reset Boolean flag indicating whether this list should 227 * completely replace any current settings. 228 * @param ... A list of method identifiers, from the "M_" series 229 * defined in httpd.h, terminated with a value of -1 230 * (e.g., "M_GET, M_POST, M_OPTIONS, -1") 231 * @return None. 232 */ 233 AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...); 234 235 #define MERGE_ALLOW 0 236 #define REPLACE_ALLOW 1 237 238 #ifdef CORE_PRIVATE 239 /** 240 * Function called by main.c to handle first-level request 241 * @param r The current request 242 */ 243 void ap_process_request(request_rec *); 244 245 /** 246 * Kill the current request 247 * @param type Why the request is dieing 248 * @param r The current request 249 */ 250 AP_DECLARE(void) ap_die(int type, request_rec *r); 251 #endif 252 253 /* Hooks */ 254 255 /** 256 * Gives modules a chance to create their request_config entry when the 257 * request is created. 258 * @param r The current request 259 * @ingroup hooks 260 */ 261 AP_DECLARE_HOOK(int,create_request,(request_rec *r)) 262 263 /** 264 * This hook allow modules an opportunity to translate the URI into an 265 * actual filename. If no modules do anything special, the server's default 266 * rules will be followed. 267 * @param r The current request 268 * @return OK, DECLINED, or HTTP_... 269 * @ingroup hooks 270 */ 271 AP_DECLARE_HOOK(int,translate_name,(request_rec *r)) 272 273 /** 274 * This hook allow modules to set the per_dir_config based on their own 275 * context (such as "<Proxy>" sections) and responds to contextless requests 276 * such as TRACE that need no security or filesystem mapping. 277 * based on the filesystem. 278 * @param r The current request 279 * @return DONE (or HTTP_) if this contextless request was just fulfilled 280 * (such as TRACE), OK if this is not a file, and DECLINED if this is a file. 281 * The core map_to_storage (HOOK_RUN_REALLY_LAST) will directory_walk 282 * and file_walk the r->filename. 283 * 284 * @ingroup hooks 285 */ 286 AP_DECLARE_HOOK(int,map_to_storage,(request_rec *r)) 287 288 /** 289 * This hook is used to analyze the request headers, authenticate the user, 290 * and set the user information in the request record (r->user and 291 * r->ap_auth_type). This hook is only run when Apache determines that 292 * authentication/authorization is required for this resource (as determined 293 * by the 'Require' directive). It runs after the access_checker hook, and 294 * before the auth_checker hook. 295 * 296 * @param r The current request 297 * @return OK, DECLINED, or HTTP_... 298 * @ingroup hooks 299 */ 300 AP_DECLARE_HOOK(int,check_user_id,(request_rec *r)) 301 302 /** 303 * Allows modules to perform module-specific fixing of header fields. This 304 * is invoked just before any content-handler 305 * @param r The current request 306 * @return OK, DECLINED, or HTTP_... 307 * @ingroup hooks 308 */ 309 AP_DECLARE_HOOK(int,fixups,(request_rec *r)) 310 311 /** 312 * This routine is called to determine and/or set the various document type 313 * information bits, like Content-type (via r->content_type), language, et 314 * cetera. 315 * @param r the current request 316 * @return OK, DECLINED, or HTTP_... 317 * @ingroup hooks 318 */ 319 AP_DECLARE_HOOK(int,type_checker,(request_rec *r)) 320 321 /** 322 * This hook is used to apply additional access control to this resource. 323 * It runs *before* a user is authenticated, so this hook is really to 324 * apply additional restrictions independent of a user. It also runs 325 * independent of 'Require' directive usage. 326 * 327 * @param r the current request 328 * @return OK, DECLINED, or HTTP_... 329 * @ingroup hooks 330 */ 331 AP_DECLARE_HOOK(int,access_checker,(request_rec *r)) 332 333 /** 334 * This hook is used to check to see if the resource being requested 335 * is available for the authenticated user (r->user and r->ap_auth_type). 336 * It runs after the access_checker and check_user_id hooks. Note that 337 * it will *only* be called if Apache determines that access control has 338 * been applied to this resource (through a 'Require' directive). 339 * 340 * @param r the current request 341 * @return OK, DECLINED, or HTTP_... 342 * @ingroup hooks 343 */ 344 AP_DECLARE_HOOK(int,auth_checker,(request_rec *r)) 345 346 /** 347 * This hook allows modules to insert filters for the current request 348 * @param r the current request 349 * @ingroup hooks 350 */ 351 AP_DECLARE_HOOK(void,insert_filter,(request_rec *r)) 352 353 AP_DECLARE(int) ap_location_walk(request_rec *r); 354 AP_DECLARE(int) ap_directory_walk(request_rec *r); 355 AP_DECLARE(int) ap_file_walk(request_rec *r); 356 357 #ifdef __cplusplus 358 } 359 #endif 360 361 #endif /* !APACHE_HTTP_REQUEST_H */