]> granicus.if.org Git - apache/blob - include/http_request.h
A much more innocuous cut-and-paste flaw
[apache] / include / http_request.h
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  * @defgroup APACHE_CORE_REQ Apache Request Processing
22  * @ingroup  APACHE_CORE
23  * @{
24  */
25
26 /*
27  * request.c is the code which handles the main line of request
28  * processing, once a request has been read in (finding the right per-
29  * directory configuration, building it if necessary, and calling all
30  * the module dispatch functions in the right order).
31  *
32  * The pieces here which are public to the modules, allow them to learn
33  * how the server would handle some other file or URI, or perhaps even
34  * direct the server to serve that other file instead of the one the
35  * client requested directly.
36  *
37  * There are two ways to do that.  The first is the sub_request mechanism,
38  * which handles looking up files and URIs as adjuncts to some other
39  * request (e.g., directory entries for multiviews and directory listings);
40  * the lookup functions stop short of actually running the request, but
41  * (e.g., for includes), a module may call for the request to be run
42  * by calling run_sub_req.  The space allocated to create sub_reqs can be
43  * reclaimed by calling destroy_sub_req --- be sure to copy anything you care
44  * about which was allocated in its apr_pool_t elsewhere before doing this.
45  */
46
47 #ifndef APACHE_HTTP_REQUEST_H
48 #define APACHE_HTTP_REQUEST_H
49
50 #include "apr_optional.h"
51 #include "util_filter.h"
52
53 #ifdef __cplusplus
54 extern "C" {
55 #endif
56
57 #define AP_SUBREQ_NO_ARGS 0
58 #define AP_SUBREQ_MERGE_ARGS 1
59
60 /**
61  * An internal handler used by the ap_process_request, all subrequest mechanisms
62  * and the redirect mechanism.
63  * @param r The request, subrequest or internal redirect to pre-process
64  * @return The return code for the request
65  */
66 AP_DECLARE(int) ap_process_request_internal(request_rec *r);
67
68 /**
69  * Create a subrequest from the given URI.  This subrequest can be
70  * inspected to find information about the requested URI
71  * @param new_uri The URI to lookup
72  * @param r The current request
73  * @param next_filter The first filter the sub_request should use.  If this is
74  *                    NULL, it defaults to the first filter for the main request
75  * @return The new request record
76  */
77 AP_DECLARE(request_rec *) ap_sub_req_lookup_uri(const char *new_uri,
78                                                 const request_rec *r,
79                                                 ap_filter_t *next_filter);
80
81 /**
82  * Create a subrequest for the given file.  This subrequest can be
83  * inspected to find information about the requested file
84  * @param new_file The file to lookup
85  * @param r The current request
86  * @param next_filter The first filter the sub_request should use.  If this is
87  *                    NULL, it defaults to the first filter for the main request
88  * @return The new request record
89  */
90 AP_DECLARE(request_rec *) ap_sub_req_lookup_file(const char *new_file,
91                                               const request_rec *r,
92                                               ap_filter_t *next_filter);
93 /**
94  * Create a subrequest for the given apr_dir_read result.  This subrequest
95  * can be inspected to find information about the requested file
96  * @param finfo The apr_dir_read result to lookup
97  * @param r The current request
98  * @param subtype What type of subrequest to perform, one of;
99  * <PRE>
100  *      AP_SUBREQ_NO_ARGS     ignore r->args and r->path_info
101  *      AP_SUBREQ_MERGE_ARGS  merge r->args and r->path_info
102  * </PRE>
103  * @param next_filter The first filter the sub_request should use.  If this is
104  *                    NULL, it defaults to the first filter for the main request
105  * @return The new request record
106  * @note The apr_dir_read flags value APR_FINFO_MIN|APR_FINFO_NAME flag is the
107  * minimum recommended query if the results will be passed to apr_dir_read.
108  * The file info passed must include the name, and must have the same relative
109  * directory as the current request.
110  */
111 AP_DECLARE(request_rec *) ap_sub_req_lookup_dirent(const apr_finfo_t *finfo,
112                                                    const request_rec *r,
113                                                    int subtype,
114                                                    ap_filter_t *next_filter);
115 /**
116  * Create a subrequest for the given URI using a specific method.  This
117  * subrequest can be inspected to find information about the requested URI
118  * @param method The method to use in the new subrequest
119  * @param new_uri The URI to lookup
120  * @param r The current request
121  * @param next_filter The first filter the sub_request should use.  If this is
122  *                    NULL, it defaults to the first filter for the main request
123  * @return The new request record
124  */
125 AP_DECLARE(request_rec *) ap_sub_req_method_uri(const char *method,
126                                                 const char *new_uri,
127                                                 const request_rec *r,
128                                                 ap_filter_t *next_filter);
129 /**
130  * An output filter to strip EOS buckets from sub-requests.  This always
131  * has to be inserted at the end of a sub-requests filter stack.
132  * @param f The current filter
133  * @param bb The brigade to filter
134  * @return status code
135  */
136 AP_CORE_DECLARE_NONSTD(apr_status_t) ap_sub_req_output_filter(ap_filter_t *f,
137                                                         apr_bucket_brigade *bb);
138
139 /**
140  * Run the handler for the subrequest
141  * @param r The subrequest to run
142  * @return The return code for the subrequest
143  */
144 AP_DECLARE(int) ap_run_sub_req(request_rec *r);
145
146 /**
147  * Free the memory associated with a subrequest
148  * @param r The subrequest to finish
149  */
150 AP_DECLARE(void) ap_destroy_sub_req(request_rec *r);
151
152 /**
153  * An output filter to ensure that we avoid passing morphing buckets to
154  * connection filters and in so doing defeat async write completion when
155  * they are set aside. This should be inserted at the end of a request
156  * filter stack.
157  * @param f The current filter
158  * @param bb The brigade to filter
159  * @return status code
160  */
161 AP_CORE_DECLARE_NONSTD(apr_status_t) ap_request_core_filter(ap_filter_t *f,
162                                                             apr_bucket_brigade *bb);
163
164 /*
165  * Then there's the case that you want some other request to be served
166  * as the top-level request INSTEAD of what the client requested directly.
167  * If so, call this from a handler, and then immediately return OK.
168  */
169
170 /**
171  * Redirect the current request to some other uri
172  * @param new_uri The URI to replace the current request with
173  * @param r The current request
174  */
175 AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r);
176
177 /**
178  * This function is designed for things like actions or CGI scripts, when
179  * using AddHandler, and you want to preserve the content type across
180  * an internal redirect.
181  * @param new_uri The URI to replace the current request with.
182  * @param r The current request
183  */
184 AP_DECLARE(void) ap_internal_redirect_handler(const char *new_uri, request_rec *r);
185
186 /**
187  * Redirect the current request to a sub_req, merging the pools
188  * @param sub_req A subrequest created from this request
189  * @param r The current request
190  * @note the sub_req's pool will be merged into r's pool, be very careful
191  * not to destroy this subrequest, it will be destroyed with the main request!
192  */
193 AP_DECLARE(void) ap_internal_fast_redirect(request_rec *sub_req, request_rec *r);
194
195 /**
196  * Can be used within any handler to determine if any authentication
197  * is required for the current request
198  * @param r The current request
199  * @return 1 if authentication is required, 0 otherwise
200  * @bug Behavior changed in 2.4.x refactoring, API no longer usable
201  * @deprecated @see ap_some_authn_required()
202  *
203  */
204 AP_DECLARE(int) ap_some_auth_required(request_rec *r);
205
206 /**
207  * @defgroup APACHE_CORE_REQ_AUTH Access Control for Sub-Requests and
208  *                                Internal Redirects
209  * @ingroup  APACHE_CORE_REQ
210  * @{
211  */
212
213 #define AP_AUTH_INTERNAL_PER_URI  0  /**< Run access control hooks on all
214                                           internal requests with URIs
215                                           distinct from that of initial
216                                           request */
217 #define AP_AUTH_INTERNAL_PER_CONF 1  /**< Run access control hooks only on
218                                           internal requests with
219                                           configurations distinct from
220                                           that of initial request */
221 #define AP_AUTH_INTERNAL_MASK     0x000F  /**< mask to extract internal request
222                                                processing mode */
223
224 /**
225  * Clear flag which determines when access control hooks will be run for
226  * internal requests.
227  */
228 AP_DECLARE(void) ap_clear_auth_internal(void);
229
230 /**
231  * Determine whether access control hooks will be run for all internal
232  * requests with URIs distinct from that of the initial request, or only
233  * those for which different configurations apply than those which applied
234  * to the initial request.  To accomodate legacy external modules which
235  * may expect access control hooks to be run for all internal requests
236  * with distinct URIs, this is the default behaviour unless all access
237  * control hooks and authentication and authorization providers are
238  * registered with AP_AUTH_INTERNAL_PER_CONF.
239  * @param ptemp Pool used for temporary allocations
240  */
241 AP_DECLARE(void) ap_setup_auth_internal(apr_pool_t *ptemp);
242
243 /**
244  * Register an authentication or authorization provider with the global
245  * provider pool.
246  * @param pool The pool to create any storage from
247  * @param provider_group The group to store the provider in
248  * @param provider_name The name for this provider
249  * @param provider_version The version for this provider
250  * @param provider Opaque structure for this provider
251  * @param type Internal request processing mode, either
252  *             AP_AUTH_INTERNAL_PER_URI or AP_AUTH_INTERNAL_PER_CONF
253  * @return APR_SUCCESS if all went well
254  */
255 AP_DECLARE(apr_status_t) ap_register_auth_provider(apr_pool_t *pool,
256                                                    const char *provider_group,
257                                                    const char *provider_name,
258                                                    const char *provider_version,
259                                                    const void *provider,
260                                                    int type);
261
262 /** @} */
263
264 /* Optional functions coming from mod_authn_core and mod_authz_core
265  * that list all registered authn/z providers.
266  */
267 APR_DECLARE_OPTIONAL_FN(apr_array_header_t *, authn_ap_list_provider_names,
268                         (apr_pool_t *ptemp));
269 APR_DECLARE_OPTIONAL_FN(apr_array_header_t *, authz_ap_list_provider_names,
270                         (apr_pool_t *ptemp));
271
272 /**
273  * Determine if the current request is the main request or a subrequest
274  * @param r The current request
275  * @return 1 if this is the main request, 0 otherwise
276  */
277 AP_DECLARE(int) ap_is_initial_req(request_rec *r);
278
279 /**
280  * Function to set the r->mtime field to the specified value if it's later
281  * than what's already there.
282  * @param r The current request
283  * @param dependency_mtime Time to set the mtime to
284  */
285 AP_DECLARE(void) ap_update_mtime(request_rec *r, apr_time_t dependency_mtime);
286
287 /**
288  * Add one or more methods to the list permitted to access the resource.
289  * Usually executed by the content handler before the response header is
290  * sent, but sometimes invoked at an earlier phase if a module knows it
291  * can set the list authoritatively.  Note that the methods are ADDED
292  * to any already permitted unless the reset flag is non-zero.  The
293  * list is used to generate the Allow response header field when it
294  * is needed.
295  * @param   r     The pointer to the request identifying the resource.
296  * @param   reset Boolean flag indicating whether this list should
297  *                completely replace any current settings.
298  * @param   ...   A NULL-terminated list of strings, each identifying a
299  *                method name to add.
300  * @return  None.
301  */
302 AP_DECLARE(void) ap_allow_methods(request_rec *r, int reset, ...)
303                  AP_FN_ATTR_SENTINEL;
304
305 /**
306  * Add one or more methods to the list permitted to access the resource.
307  * Usually executed by the content handler before the response header is
308  * sent, but sometimes invoked at an earlier phase if a module knows it
309  * can set the list authoritatively.  Note that the methods are ADDED
310  * to any already permitted unless the reset flag is non-zero.  The
311  * list is used to generate the Allow response header field when it
312  * is needed.
313  * @param   r     The pointer to the request identifying the resource.
314  * @param   reset Boolean flag indicating whether this list should
315  *                completely replace any current settings.
316  * @param   ...   A list of method identifiers, from the "M_" series
317  *                defined in httpd.h, terminated with a value of -1
318  *                (e.g., "M_GET, M_POST, M_OPTIONS, -1")
319  * @return  None.
320  */
321 AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...);
322
323 #define MERGE_ALLOW 0
324 #define REPLACE_ALLOW 1
325
326 /**
327  * Process a top-level request from a client, and synchronously write
328  * the response to the client
329  * @param r The current request
330  */
331 AP_DECLARE(void) ap_process_request(request_rec *r);
332
333 /* For post-processing after a handler has finished with a request.
334  * (Commonly used after it was suspended)
335  */
336 AP_DECLARE(void) ap_process_request_after_handler(request_rec *r);
337
338 /**
339  * Process a top-level request from a client, allowing some or all of
340  * the response to remain buffered in the core output filter for later,
341  * asynchronous write completion
342  * @param r The current request
343  */
344 void ap_process_async_request(request_rec *r);
345
346 /**
347  * Kill the current request
348  * @param type Why the request is dieing
349  * @param r The current request
350  */
351 AP_DECLARE(void) ap_die(int type, request_rec *r);
352
353 /* Hooks */
354
355 /**
356  * Gives modules a chance to create their request_config entry when the
357  * request is created.
358  * @param r The current request
359  * @ingroup hooks
360  */
361 AP_DECLARE_HOOK(int,create_request,(request_rec *r))
362
363 /**
364  * This hook allow modules an opportunity to translate the URI into an
365  * actual filename.  If no modules do anything special, the server's default
366  * rules will be followed.
367  * @param r The current request
368  * @return OK, DECLINED, or HTTP_...
369  * @ingroup hooks
370  */
371 AP_DECLARE_HOOK(int,translate_name,(request_rec *r))
372
373 /**
374  * This hook allow modules to set the per_dir_config based on their own
375  * context (such as "<Proxy>" sections) and responds to contextless requests
376  * such as TRACE that need no security or filesystem mapping.
377  * based on the filesystem.
378  * @param r The current request
379  * @return DONE (or HTTP_) if this contextless request was just fulfilled
380  * (such as TRACE), OK if this is not a file, and DECLINED if this is a file.
381  * The core map_to_storage (HOOK_RUN_REALLY_LAST) will directory_walk
382  * and file_walk the r->filename.
383  *
384  * @ingroup hooks
385  */
386 AP_DECLARE_HOOK(int,map_to_storage,(request_rec *r))
387
388 /**
389  * This hook is used to analyze the request headers, authenticate the user,
390  * and set the user information in the request record (r->user and
391  * r->ap_auth_type). This hook is only run when Apache determines that
392  * authentication/authorization is required for this resource (as determined
393  * by the 'Require' directive). It runs after the access_checker hook, and
394  * before the auth_checker hook. This hook should be registered with
395  * ap_hook_check_authn().
396  * If "Satisfy any" is in effect, this hook may be skipped.
397  *
398  * @param r The current request
399  * @return OK, DECLINED, or HTTP_...
400  * @ingroup hooks
401  * @see ap_hook_check_authn
402  */
403 AP_DECLARE_HOOK(int,check_user_id,(request_rec *r))
404
405 /**
406  * Allows modules to perform module-specific fixing of header fields.  This
407  * is invoked just before any content-handler
408  * @param r The current request
409  * @return OK, DECLINED, or HTTP_...
410  * @ingroup hooks
411  */
412 AP_DECLARE_HOOK(int,fixups,(request_rec *r))
413
414 /**
415  * This routine is called to determine and/or set the various document type
416  * information bits, like Content-type (via r->content_type), language, et
417  * cetera.
418  * @param r the current request
419  * @return OK, DECLINED, or HTTP_...
420  * @ingroup hooks
421  */
422 AP_DECLARE_HOOK(int,type_checker,(request_rec *r))
423
424 /**
425  * This hook is used to apply additional access control to this resource.
426  * It runs *before* a user is authenticated, so this hook is really to
427  * apply additional restrictions independent of a user. It also runs
428  * independent of 'Require' directive usage. This hook should be registered
429  * with ap_hook_check_access().
430  *
431  * @param r the current request
432  * @return OK, DECLINED, or HTTP_...
433  * @ingroup hooks
434  * @see ap_hook_check_access
435  */
436 AP_DECLARE_HOOK(int,access_checker,(request_rec *r))
437
438 /**
439  * This hook is used to apply additional access control and/or bypass
440  * authentication for this resource. It runs *before* a user is authenticated,
441  * but after the access_checker hook.
442  * This hook should be registered with ap_hook_check_access_ex().
443  * If "Satisfy any" is in effect, this hook may be skipped.
444  *
445  * @param r the current request
446  * @return OK (allow acces), DECLINED (let later modules decide),
447  *         or HTTP_... (deny access)
448  * @ingroup hooks
449  * @see ap_hook_check_access_ex
450  */
451 AP_DECLARE_HOOK(int,access_checker_ex,(request_rec *r))
452
453 /**
454  * This hook is used to check to see if the resource being requested
455  * is available for the authenticated user (r->user and r->ap_auth_type).
456  * It runs after the access_checker and check_user_id hooks. Note that
457  * it will *only* be called if Apache determines that access control has
458  * been applied to this resource (through a 'Require' directive). This
459  * hook should be registered with ap_hook_check_authz().
460  * If "Satisfy any" is in effect, this hook may be skipped.
461  *
462  * @param r the current request
463  * @return OK, DECLINED, or HTTP_...
464  * @ingroup hooks
465  * @see ap_hook_check_authz
466  */
467 AP_DECLARE_HOOK(int,auth_checker,(request_rec *r))
468
469 /**
470  * Register a hook function that will apply additional access control to
471  * the current request.
472  * @param pf An access_checker hook function
473  * @param aszPre A NULL-terminated array of strings that name modules whose
474  *               hooks should precede this one
475  * @param aszSucc A NULL-terminated array of strings that name modules whose
476  *                hooks should succeed this one
477  * @param nOrder An integer determining order before honouring aszPre and
478  *               aszSucc (for example, HOOK_MIDDLE)
479  * @param type Internal request processing mode, either
480  *             AP_AUTH_INTERNAL_PER_URI or AP_AUTH_INTERNAL_PER_CONF
481  */
482 AP_DECLARE(void) ap_hook_check_access(ap_HOOK_access_checker_t *pf,
483                                       const char * const *aszPre,
484                                       const char * const *aszSucc,
485                                       int nOrder, int type);
486
487 /**
488  * Register a hook function that will apply additional access control
489  * and/or bypass authentication for the current request.
490  * @param pf An access_checker_ex hook function
491  * @param aszPre A NULL-terminated array of strings that name modules whose
492  *               hooks should precede this one
493  * @param aszSucc A NULL-terminated array of strings that name modules whose
494  *                hooks should succeed this one
495  * @param nOrder An integer determining order before honouring aszPre and
496  *               aszSucc (for example, HOOK_MIDDLE)
497  * @param type Internal request processing mode, either
498  *             AP_AUTH_INTERNAL_PER_URI or AP_AUTH_INTERNAL_PER_CONF
499  */
500 AP_DECLARE(void) ap_hook_check_access_ex(ap_HOOK_access_checker_ex_t *pf,
501                                          const char * const *aszPre,
502                                          const char * const *aszSucc,
503                                          int nOrder, int type);
504
505
506 /**
507  * Register a hook function that will analyze the request headers,
508  * authenticate the user, and set the user information in the request record.
509  * @param pf A check_user_id hook function
510  * @param aszPre A NULL-terminated array of strings that name modules whose
511  *               hooks should precede this one
512  * @param aszSucc A NULL-terminated array of strings that name modules whose
513  *                hooks should succeed this one
514  * @param nOrder An integer determining order before honouring aszPre and
515  *               aszSucc (for example, HOOK_MIDDLE)
516  * @param type Internal request processing mode, either
517  *             AP_AUTH_INTERNAL_PER_URI or AP_AUTH_INTERNAL_PER_CONF
518  */
519 AP_DECLARE(void) ap_hook_check_authn(ap_HOOK_check_user_id_t *pf,
520                                      const char * const *aszPre,
521                                      const char * const *aszSucc,
522                                      int nOrder, int type);
523
524 /**
525  * Register a hook function that determine if the resource being requested
526  * is available for the currently authenticated user.
527  * @param pf An auth_checker hook function
528  * @param aszPre A NULL-terminated array of strings that name modules whose
529  *               hooks should precede this one
530  * @param aszSucc A NULL-terminated array of strings that name modules whose
531  *                hooks should succeed this one
532  * @param nOrder An integer determining order before honouring aszPre and
533  *               aszSucc (for example, HOOK_MIDDLE)
534  * @param type Internal request processing mode, either
535  *             AP_AUTH_INTERNAL_PER_URI or AP_AUTH_INTERNAL_PER_CONF
536  */
537 AP_DECLARE(void) ap_hook_check_authz(ap_HOOK_auth_checker_t *pf,
538                                      const char * const *aszPre,
539                                      const char * const *aszSucc,
540                                      int nOrder, int type);
541
542 /**
543  * This hook allows modules to insert filters for the current request
544  * @param r the current request
545  * @ingroup hooks
546  */
547 AP_DECLARE_HOOK(void,insert_filter,(request_rec *r))
548
549 /**
550  * This hook allows modules to affect the request immediately after the
551  * per-directory configuration for the request has been generated.
552  * @param r The current request
553  * @return OK (allow acces), DECLINED (let later modules decide),
554  *         or HTTP_... (deny access)
555  * @ingroup hooks
556  */
557 AP_DECLARE_HOOK(int,post_perdir_config,(request_rec *r))
558
559 /**
560  * This hook allows a module to force authn to be required when
561  * processing a request.
562  * This hook should be registered with ap_hook_force_authn().
563  * @param r The current request
564  * @return OK (force authn), DECLINED (let later modules decide)
565  * @ingroup hooks
566  */
567 AP_DECLARE_HOOK(int,force_authn,(request_rec *r))
568
569 /**
570  * This hook allows modules to handle/emulate the apr_stat() calls
571  * needed for directory walk.
572  * @param finfo where to put the stat data
573  * @param r The current request
574  * @param wanted APR_FINFO_* flags to pass to apr_stat()
575  * @return apr_status_t or AP_DECLINED (let later modules decide)
576  * @ingroup hooks
577  */
578 AP_DECLARE_HOOK(apr_status_t,dirwalk_stat,(apr_finfo_t *finfo, request_rec *r, apr_int32_t wanted))
579
580 AP_DECLARE(int) ap_location_walk(request_rec *r);
581 AP_DECLARE(int) ap_directory_walk(request_rec *r);
582 AP_DECLARE(int) ap_file_walk(request_rec *r);
583 AP_DECLARE(int) ap_if_walk(request_rec *r);
584
585 /** End Of REQUEST (EOR) bucket */
586 AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_eor;
587
588 /**
589  * Determine if a bucket is an End Of REQUEST (EOR) bucket
590  * @param e The bucket to inspect
591  * @return true or false
592  */
593 #define AP_BUCKET_IS_EOR(e)         (e->type == &ap_bucket_type_eor)
594
595 /**
596  * Make the bucket passed in an End Of REQUEST (EOR) bucket
597  * @param b The bucket to make into an EOR bucket
598  * @param r The request to destroy when this bucket is destroyed
599  * @return The new bucket, or NULL if allocation failed
600  */
601 AP_DECLARE(apr_bucket *) ap_bucket_eor_make(apr_bucket *b, request_rec *r);
602
603 /**
604  * Create a bucket referring to an End Of REQUEST (EOR). This bucket
605  * holds a pointer to the request_rec, so that the request can be
606  * destroyed right after all of the output has been sent to the client.
607  *
608  * @param list The freelist from which this bucket should be allocated
609  * @param r The request to destroy when this bucket is destroyed
610  * @return The new bucket, or NULL if allocation failed
611  */
612 AP_DECLARE(apr_bucket *) ap_bucket_eor_create(apr_bucket_alloc_t *list,
613                                               request_rec *r);
614
615 /**
616  * Can be used within any handler to determine if any authentication
617  * is required for the current request.  Note that if used with an
618  * access_checker hook, an access_checker_ex hook or an authz provider; the
619  * caller should take steps to avoid a loop since this function is
620  * implemented by calling these hooks.
621  * @param r The current request
622  * @return TRUE if authentication is required, FALSE otherwise
623  */
624 AP_DECLARE(int) ap_some_authn_required(request_rec *r);
625
626 #ifdef __cplusplus
627 }
628 #endif
629
630 #endif  /* !APACHE_HTTP_REQUEST_H */
631 /** @} */