]> granicus.if.org Git - apache/blob - include/http_core.h
* docs/manual/mod/mod_ssl.xml: Flesh out SSLRenegBufferSize
[apache] / include / http_core.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_core.h
19  * @brief CORE HTTP Daemon
20  *
21  * @defgroup APACHE_CORE_HTTPD Core HTTP Daemon
22  * @ingroup  APACHE_CORE
23  * @{
24  */
25
26 #ifndef APACHE_HTTP_CORE_H
27 #define APACHE_HTTP_CORE_H
28
29 #include "apr.h"
30 #include "apr_hash.h"
31 #include "apr_optional.h"
32 #include "util_filter.h"
33 #include "ap_expr.h"
34
35 #include "http_config.h"
36
37 #if APR_HAVE_STRUCT_RLIMIT
38 #include <sys/time.h>
39 #include <sys/resource.h>
40 #endif
41
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 /* ****************************************************************
48  *
49  * The most basic server code is encapsulated in a single module
50  * known as the core, which is just *barely* functional enough to
51  * serve documents, though not terribly well.
52  *
53  * Largely for NCSA back-compatibility reasons, the core needs to
54  * make pieces of its config structures available to other modules.
55  * The accessors are declared here, along with the interpretation
56  * of one of them (allow_options).
57  */
58
59 /**
60  * @defgroup APACHE_CORE_HTTPD_ACESSORS Acessors
61  *
62  * @brief File/Directory Accessor directives
63  *
64  * @{
65  */
66
67 /** No directives */
68 #define OPT_NONE 0
69 /** Indexes directive */
70 #define OPT_INDEXES 1
71 /**  Includes directive */
72 #define OPT_INCLUDES 2
73 /**  FollowSymLinks directive */
74 #define OPT_SYM_LINKS 4
75 /**  ExecCGI directive */
76 #define OPT_EXECCGI 8
77 /**  directive unset */
78 #define OPT_UNSET 16
79 /**  IncludesNOEXEC directive */
80 #define OPT_INCNOEXEC 32
81 /** SymLinksIfOwnerMatch directive */
82 #define OPT_SYM_OWNER 64
83 /** MultiViews directive */
84 #define OPT_MULTI 128
85 /**  All directives */
86 #define OPT_ALL (OPT_INDEXES|OPT_INCLUDES|OPT_SYM_LINKS|OPT_EXECCGI)
87 /** @} */
88
89 /**
90  * @defgroup get_remote_host Remote Host Resolution 
91  * @ingroup APACHE_CORE_HTTPD
92  * @{
93  */
94 /** REMOTE_HOST returns the hostname, or NULL if the hostname
95  * lookup fails.  It will force a DNS lookup according to the
96  * HostnameLookups setting.
97  */
98 #define REMOTE_HOST (0)
99
100 /** REMOTE_NAME returns the hostname, or the dotted quad if the
101  * hostname lookup fails.  It will force a DNS lookup according
102  * to the HostnameLookups setting.
103  */
104 #define REMOTE_NAME (1)
105
106 /** REMOTE_NOLOOKUP is like REMOTE_NAME except that a DNS lookup is
107  * never forced.
108  */
109 #define REMOTE_NOLOOKUP (2)
110
111 /** REMOTE_DOUBLE_REV will always force a DNS lookup, and also force
112  * a double reverse lookup, regardless of the HostnameLookups
113  * setting.  The result is the (double reverse checked) hostname,
114  * or NULL if any of the lookups fail.
115  */
116 #define REMOTE_DOUBLE_REV (3)
117
118 /** @} // get_remote_host */
119
120 /** all of the requirements must be met */
121 #define SATISFY_ALL 0
122 /**  any of the requirements must be met */
123 #define SATISFY_ANY 1
124 /** There are no applicable satisfy lines */
125 #define SATISFY_NOSPEC 2
126
127 /** Make sure we don't write less than 8000 bytes at any one time.
128  */
129 #define AP_MIN_BYTES_TO_WRITE  8000
130
131 /** default maximum of internal redirects */
132 # define AP_DEFAULT_MAX_INTERNAL_REDIRECTS 10
133
134 /** default maximum subrequest nesting level */
135 # define AP_DEFAULT_MAX_SUBREQ_DEPTH 10
136
137 /**
138  * Retrieve the value of Options for this request
139  * @param r The current request
140  * @return the Options bitmask
141  */
142 AP_DECLARE(int) ap_allow_options(request_rec *r);
143
144 /**
145  * Retrieve the value of the AllowOverride for this request
146  * @param r The current request
147  * @return the overrides bitmask
148  */
149 AP_DECLARE(int) ap_allow_overrides(request_rec *r);
150
151 /**
152  * Retrieve the value of the DefaultType directive, or text/plain if not set
153  * @param r The current request
154  * @return The default type
155  */
156 AP_DECLARE(const char *) ap_default_type(request_rec *r);     
157
158 /**
159  * Retrieve the document root for this server
160  * @param r The current request
161  * @warning Don't use this!  If your request went through a Userdir, or 
162  * something like that, it'll screw you.  But it's back-compatible...
163  * @return The document root
164  */
165 AP_DECLARE(const char *) ap_document_root(request_rec *r);
166
167 /**
168  * Lookup the remote client's DNS name or IP address
169  * @ingroup get_remote_host
170  * @param conn The current connection
171  * @param dir_config The directory config vector from the request
172  * @param type The type of lookup to perform.  One of:
173  * <pre>
174  *     REMOTE_HOST returns the hostname, or NULL if the hostname
175  *                 lookup fails.  It will force a DNS lookup according to the
176  *                 HostnameLookups setting.
177  *     REMOTE_NAME returns the hostname, or the dotted quad if the
178  *                 hostname lookup fails.  It will force a DNS lookup according
179  *                 to the HostnameLookups setting.
180  *     REMOTE_NOLOOKUP is like REMOTE_NAME except that a DNS lookup is
181  *                     never forced.
182  *     REMOTE_DOUBLE_REV will always force a DNS lookup, and also force
183  *                   a double reverse lookup, regardless of the HostnameLookups
184  *                   setting.  The result is the (double reverse checked) 
185  *                   hostname, or NULL if any of the lookups fail.
186  * </pre>
187  * @param str_is_ip unless NULL is passed, this will be set to non-zero on output when an IP address 
188  *        string is returned
189  * @return The remote hostname
190  */
191 AP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip);
192
193 /**
194  * Retrieve the login name of the remote user.  Undef if it could not be
195  * determined
196  * @param r The current request
197  * @return The user logged in to the client machine
198  */
199 AP_DECLARE(const char *) ap_get_remote_logname(request_rec *r);
200
201 /* Used for constructing self-referencing URLs, and things like SERVER_PORT,
202  * and SERVER_NAME.
203  */
204 /**
205  * build a fully qualified URL from the uri and information in the request rec
206  * @param p The pool to allocate the URL from
207  * @param uri The path to the requested file
208  * @param r The current request
209  * @return A fully qualified URL
210  */
211 AP_DECLARE(char *) ap_construct_url(apr_pool_t *p, const char *uri, request_rec *r);
212
213 /**
214  * Get the current server name from the request
215  * @param r The current request
216  * @return the server name
217  */
218 AP_DECLARE(const char *) ap_get_server_name(request_rec *r);
219
220 /**
221  * Get the current server port
222  * @param r The current request
223  * @return The server's port
224  */
225 AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r);
226
227 /**
228  * Return the limit on bytes in request msg body 
229  * @param r The current request
230  * @return the maximum number of bytes in the request msg body
231  */
232 AP_DECLARE(apr_off_t) ap_get_limit_req_body(const request_rec *r);
233
234 /**
235  * Return the limit on bytes in XML request msg body
236  * @param r The current request
237  * @return the maximum number of bytes in XML request msg body
238  */
239 AP_DECLARE(size_t) ap_get_limit_xml_body(const request_rec *r);
240
241 /**
242  * Install a custom response handler for a given status
243  * @param r The current request
244  * @param status The status for which the custom response should be used
245  * @param string The custom response.  This can be a static string, a file
246  *               or a URL
247  */
248 AP_DECLARE(void) ap_custom_response(request_rec *r, int status, const char *string);
249
250 /**
251  * Check if the current request is beyond the configured max. number of redirects or subrequests
252  * @param r The current request
253  * @return true (is exceeded) or false
254  */
255 AP_DECLARE(int) ap_is_recursion_limit_exceeded(const request_rec *r);
256
257 /**
258  * Check for a definition from the server command line
259  * @param name The define to check for
260  * @return 1 if defined, 0 otherwise
261  */
262 AP_DECLARE(int) ap_exists_config_define(const char *name);
263 /* FIXME! See STATUS about how */
264 AP_DECLARE_NONSTD(int) ap_core_translate(request_rec *r);
265
266 /* Authentication stuff.  This is one of the places where compatibility
267  * with the old config files *really* hurts; they don't discriminate at
268  * all between different authentication schemes, meaning that we need
269  * to maintain common state for all of them in the core, and make it
270  * available to the other modules through interfaces.
271  */
272
273 /** @see require_line */
274 typedef struct require_line require_line;
275
276 /** 
277  * @brief A structure to keep track of authorization requirements 
278 */
279 struct require_line {
280     /** Where the require line is in the config file. */
281     apr_int64_t method_mask;
282     /** The complete string from the command line */
283     char *requirement;
284 };
285      
286 /**
287  * Return the type of authorization required for this request
288  * @param r The current request
289  * @return The authorization required
290  */
291 AP_DECLARE(const char *) ap_auth_type(request_rec *r);
292
293 /**
294  * Return the current Authorization realm
295  * @param r The current request
296  * @return The current authorization realm
297  */
298 AP_DECLARE(const char *) ap_auth_name(request_rec *r);     
299
300 /**
301  * How the requires lines must be met.
302  * @param r The current request
303  * @return How the requirements must be met.  One of:
304  * <pre>
305  *      SATISFY_ANY    -- any of the requirements must be met.
306  *      SATISFY_ALL    -- all of the requirements must be met.
307  *      SATISFY_NOSPEC -- There are no applicable satisfy lines
308  * </pre>
309  */
310 AP_DECLARE(int) ap_satisfies(request_rec *r);
311
312 /**
313  * Core is also unlike other modules in being implemented in more than
314  * one file... so, data structures are declared here, even though most of
315  * the code that cares really is in http_core.c.  Also, another accessor.
316  */
317 AP_DECLARE_DATA extern module core_module;
318
319 /**
320  * @brief  Per-request configuration 
321 */
322 typedef struct {
323     /** bucket brigade used by getline for look-ahead and 
324      * ap_get_client_block for holding left-over request body */
325     struct apr_bucket_brigade *bb;
326
327     /** an array of per-request working data elements, accessed
328      * by ID using ap_get_request_note()
329      * (Use ap_register_request_note() during initialization
330      * to add elements)
331      */
332     void **notes;
333
334     /** There is a script processor installed on the output filter chain,
335      * so it needs the default_handler to deliver a (script) file into
336      * the chain so it can process it. Normally, default_handler only
337      * serves files on a GET request (assuming the file is actual content),
338      * since other methods are not content-retrieval. This flag overrides
339      * that behavior, stating that the "content" is actually a script and
340      * won't actually be delivered as the response for the non-GET method.
341      */
342     int deliver_script;
343
344     /** Custom response strings registered via ap_custom_response(),
345      * or NULL; check per-dir config if nothing found here
346      */
347     char **response_code_strings; /* from ap_custom_response(), not from
348                                    * ErrorDocument
349                                    */
350     /** Should addition of charset= be suppressed for this request?
351      */
352     int suppress_charset;
353 } core_request_config;
354
355 /* Standard entries that are guaranteed to be accessible via
356  * ap_get_request_note() for each request (additional entries
357  * can be added with ap_register_request_note())
358  */
359 #define AP_NOTE_DIRECTORY_WALK 0
360 #define AP_NOTE_LOCATION_WALK  1
361 #define AP_NOTE_FILE_WALK      2
362 #define AP_NUM_STD_NOTES       3
363
364 /**
365  * Reserve an element in the core_request_config->notes array
366  * for some application-specific data
367  * @return An integer key that can be passed to ap_get_request_note()
368  *         during request processing to access this element for the
369  *         current request.
370  */
371 AP_DECLARE(apr_size_t) ap_register_request_note(void);
372
373 /**
374  * Retrieve a pointer to an element in the core_request_config->notes array
375  * @param r The request
376  * @param note_num  A key for the element: either a value obtained from
377  *        ap_register_request_note() or one of the predefined AP_NOTE_*
378  *        values.
379  * @return NULL if the note_num is invalid, otherwise a pointer to the
380  *         requested note element.
381  * @remark At the start of a request, each note element is NULL.  The
382  *         handle provided by ap_get_request_note() is a pointer-to-pointer
383  *         so that the caller can point the element to some app-specific
384  *         data structure.  The caller should guarantee that any such
385  *         structure will last as long as the request itself.
386  */
387 AP_DECLARE(void **) ap_get_request_note(request_rec *r, apr_size_t note_num);
388
389
390 typedef unsigned char allow_options_t;
391 typedef unsigned char overrides_t;
392
393 /*
394  * Bits of info that go into making an ETag for a file
395  * document.  Why a long?  Because char historically
396  * proved too short for Options, and int can be different
397  * sizes on different platforms.
398  */
399 typedef unsigned long etag_components_t;
400
401 #define ETAG_UNSET 0
402 #define ETAG_NONE  (1 << 0)
403 #define ETAG_MTIME (1 << 1)
404 #define ETAG_INODE (1 << 2)
405 #define ETAG_SIZE  (1 << 3)
406 #define ETAG_BACKWARD (ETAG_MTIME | ETAG_INODE | ETAG_SIZE)
407 #define ETAG_ALL   (ETAG_MTIME | ETAG_INODE | ETAG_SIZE)
408
409 /**
410  * @brief Server Signature Enumeration
411  */
412 typedef enum {
413     srv_sig_unset,
414     srv_sig_off,
415     srv_sig_on,
416     srv_sig_withmail
417 } server_signature_e;
418
419 /** 
420  * @brief Per-directory configuration 
421  */
422 typedef struct {
423     /** path of the directory/regex/etc. see also d_is_fnmatch/absolute below */
424     char *d;
425     /** the number of slashes in d */
426     unsigned d_components;
427
428     /** If (opts & OPT_UNSET) then no absolute assignment to options has
429      * been made.
430      * invariant: (opts_add & opts_remove) == 0
431      * Which said another way means that the last relative (options + or -)
432      * assignment made to each bit is recorded in exactly one of opts_add
433      * or opts_remove.
434      */
435     allow_options_t opts;
436     allow_options_t opts_add;
437     allow_options_t opts_remove;
438     overrides_t override;
439     allow_options_t override_opts;
440     
441     /* MIME typing --- the core doesn't do anything at all with this,
442      * but it does know what to slap on a request for a document which
443      * goes untyped by other mechanisms before it slips out the door...
444      */
445     
446     char *ap_default_type;
447   
448     /* Custom response config. These can contain text or a URL to redirect to.
449      * if response_code_strings is NULL then there are none in the config,
450      * if it's not null then it's allocated to sizeof(char*)*RESPONSE_CODES.
451      * This lets us do quick merges in merge_core_dir_configs().
452      */
453   
454     char **response_code_strings; /* from ErrorDocument, not from
455                                    * ap_custom_response() */
456
457     /* Hostname resolution etc */
458 #define HOSTNAME_LOOKUP_OFF     0
459 #define HOSTNAME_LOOKUP_ON      1
460 #define HOSTNAME_LOOKUP_DOUBLE  2
461 #define HOSTNAME_LOOKUP_UNSET   3
462     unsigned int hostname_lookups : 4;
463
464     unsigned int content_md5 : 2;  /* calculate Content-MD5? */
465
466 #define USE_CANONICAL_NAME_OFF   (0)
467 #define USE_CANONICAL_NAME_ON    (1)
468 #define USE_CANONICAL_NAME_DNS   (2)
469 #define USE_CANONICAL_NAME_UNSET (3)
470     unsigned use_canonical_name : 2;
471
472     /* since is_fnmatch(conf->d) was being called so frequently in
473      * directory_walk() and its relatives, this field was created and
474      * is set to the result of that call.
475      */
476     unsigned d_is_fnmatch : 1;
477
478     /* should we force a charset on any outgoing parameterless content-type?
479      * if so, which charset?
480      */
481 #define ADD_DEFAULT_CHARSET_OFF   (0)
482 #define ADD_DEFAULT_CHARSET_ON    (1)
483 #define ADD_DEFAULT_CHARSET_UNSET (2)
484     unsigned add_default_charset : 2;
485     const char *add_default_charset_name;
486
487     /* System Resource Control */
488 #ifdef RLIMIT_CPU
489     struct rlimit *limit_cpu;
490 #endif
491 #if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS)
492     struct rlimit *limit_mem;
493 #endif
494 #ifdef RLIMIT_NPROC
495     struct rlimit *limit_nproc;
496 #endif
497     apr_off_t limit_req_body;      /* limit on bytes in request msg body */
498     long limit_xml_body;           /* limit on bytes in XML request msg body */
499
500     /* logging options */
501
502     server_signature_e server_signature;
503
504     int loglevel;
505     
506     /* Access control */
507     apr_array_header_t *sec_file;
508     ap_regex_t *r;
509
510     const char *mime_type;       /* forced with ForceType  */
511     const char *handler;         /* forced with SetHandler */
512     const char *output_filters;  /* forced with SetOutputFilters */
513     const char *input_filters;   /* forced with SetInputFilters */
514     int accept_path_info;        /* forced with AcceptPathInfo */
515
516     apr_hash_t *ct_output_filters; /* added with AddOutputFilterByType */
517
518     /*
519      * What attributes/data should be included in ETag generation?
520      */
521     etag_components_t etag_bits;
522     etag_components_t etag_add;
523     etag_components_t etag_remove;
524
525     /*
526      * Run-time performance tuning
527      */
528 #define ENABLE_MMAP_OFF    (0)
529 #define ENABLE_MMAP_ON     (1)
530 #define ENABLE_MMAP_UNSET  (2)
531     unsigned int enable_mmap : 2;  /* whether files in this dir can be mmap'ed */
532
533 #define ENABLE_SENDFILE_OFF    (0)
534 #define ENABLE_SENDFILE_ON     (1)
535 #define ENABLE_SENDFILE_UNSET  (2)
536     unsigned int enable_sendfile : 2;  /* files in this dir can be mmap'ed */
537     unsigned int allow_encoded_slashes : 1; /* URLs may contain %2f w/o being
538                                              * pitched indiscriminately */
539
540 #define USE_CANONICAL_PHYS_PORT_OFF   (0)
541 #define USE_CANONICAL_PHYS_PORT_ON    (1)
542 #define USE_CANONICAL_PHYS_PORT_UNSET (2)
543     unsigned use_canonical_phys_port : 2;
544
545     ap_parse_node_t *condition;   /* Conditionally merge <If> sections */
546 } core_dir_config;
547
548 /* Per-server core configuration */
549
550 typedef struct {
551   
552     char *gprof_dir;
553
554     /* Name translations --- we want the core to be able to do *something*
555      * so it's at least a minimally functional web server on its own (and
556      * can be tested that way).  But let's keep it to the bare minimum:
557      */
558     const char *ap_document_root;
559   
560     /* Access control */
561
562     char *access_name;
563     apr_array_header_t *sec_dir;
564     apr_array_header_t *sec_url;
565
566     /* recursion backstopper */
567     int redirect_limit; /* maximum number of internal redirects */
568     int subreq_limit;   /* maximum nesting level of subrequests */
569
570     const char *protocol;
571     apr_table_t *accf_map;
572
573     /* TRACE control */
574 #define AP_TRACE_UNSET    -1
575 #define AP_TRACE_DISABLE   0
576 #define AP_TRACE_ENABLE    1
577 #define AP_TRACE_EXTENDED  2
578     int trace_enable;
579
580 } core_server_config;
581
582 /* for AddOutputFiltersByType in core.c */
583 void ap_add_output_filters_by_type(request_rec *r);
584
585 /* for http_config.c */
586 void ap_core_reorder_directories(apr_pool_t *, server_rec *);
587
588 /* for mod_perl */
589 AP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config);
590 AP_CORE_DECLARE(void) ap_add_per_url_conf(server_rec *s, void *url_config);
591 AP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config);
592 AP_CORE_DECLARE_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, void *dummy, const char *arg);
593
594 /* Core filters; not exported. */
595 int ap_core_input_filter(ap_filter_t *f, apr_bucket_brigade *b,
596                          ap_input_mode_t mode, apr_read_type_e block,
597                          apr_off_t readbytes);
598 apr_status_t ap_core_output_filter(ap_filter_t *f, apr_bucket_brigade *b);
599
600
601 AP_DECLARE(const char*) ap_get_server_protocol(server_rec* s);
602 AP_DECLARE(void) ap_set_server_protocol(server_rec* s, const char* proto);
603
604 /* ----------------------------------------------------------------------
605  *
606  * Runtime status/management
607  */
608
609 typedef enum {
610     ap_mgmt_type_string,
611     ap_mgmt_type_long,
612     ap_mgmt_type_hash
613 } ap_mgmt_type_e;
614
615 typedef union {
616     const char *s_value;
617     long i_value;
618     apr_hash_t *h_value;
619 } ap_mgmt_value;
620
621 typedef struct {
622     const char *description;
623     const char *name;
624     ap_mgmt_type_e vtype;
625     ap_mgmt_value v;
626 } ap_mgmt_item_t;
627
628 /* Handles for core filters */
629 extern AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle;
630 extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle;
631 extern AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle;
632 extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle;
633
634 /**
635  * This hook provdes a way for modules to provide metrics/statistics about
636  * their operational status.
637  *
638  * @param p A pool to use to create entries in the hash table
639  * @param val The name of the parameter(s) that is wanted. This is
640  *            tree-structured would be in the form ('*' is all the tree,
641  *            'module.*' all of the module , 'module.foo.*', or
642  *            'module.foo.bar' )
643  * @param ht The hash table to store the results. Keys are item names, and
644  *           the values point to ap_mgmt_item_t structures.
645  * @ingroup hooks
646  */
647 AP_DECLARE_HOOK(int, get_mgmt_items,
648                 (apr_pool_t *p, const char * val, apr_hash_t *ht))
649
650 /* ---------------------------------------------------------------------- */
651
652 /* ----------------------------------------------------------------------
653  *
654  * I/O logging with mod_logio
655  */
656
657 APR_DECLARE_OPTIONAL_FN(void, ap_logio_add_bytes_out,
658                         (conn_rec *c, apr_off_t bytes));
659
660 APR_DECLARE_OPTIONAL_FN(void, ap_logio_add_bytes_in,
661                         (conn_rec *c, apr_off_t bytes));
662
663 /* ----------------------------------------------------------------------
664  *
665  * ident lookups with mod_ident
666  */
667
668 APR_DECLARE_OPTIONAL_FN(const char *, ap_ident_lookup,
669                         (request_rec *r));
670
671 /* ----------------------------------------------------------------------
672  *
673  * authorization values with mod_authz_core
674  */
675
676 APR_DECLARE_OPTIONAL_FN(int, authz_some_auth_required, (request_rec *r));
677 APR_DECLARE_OPTIONAL_FN(const char *, authn_ap_auth_type, (request_rec *r));
678 APR_DECLARE_OPTIONAL_FN(const char *, authn_ap_auth_name, (request_rec *r));
679
680 /* ----------------------------------------------------------------------
681  *
682  * authorization values with mod_access_compat
683  */
684
685 APR_DECLARE_OPTIONAL_FN(int, access_compat_ap_satisfies, (request_rec *r));
686
687 /* ---------------------------------------------------------------------- */
688
689 #ifdef __cplusplus
690 }
691 #endif
692
693 #endif  /* !APACHE_HTTP_CORE_H */
694 /** @} */