Coverage Report

Created: 2025-07-11 06:40

/src/httpd/include/httpd.h
Line
Count
Source (jump to first uncovered line)
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 httpd.h
19
 * @brief HTTP Daemon routines
20
 *
21
 * @defgroup APACHE Apache HTTP Server
22
 *
23
 * Top level group of which all other groups are a member
24
 * @{
25
 *
26
 * @defgroup APACHE_MODS Loadable modules
27
 *           Top level group for modules
28
 * @defgroup APACHE_OS Operating System Specific
29
 * @defgroup APACHE_INTERNAL Internal interfaces
30
 * @defgroup APACHE_CORE Core routines
31
 * @{
32
 * @defgroup APACHE_CORE_DAEMON HTTP Daemon Routine
33
 * @{
34
 */
35
36
#ifndef APACHE_HTTPD_H
37
#define APACHE_HTTPD_H
38
39
/* XXX - We need to push more stuff to other .h files, or even .c files, to
40
 * make this file smaller
41
 */
42
43
/* Headers in which EVERYONE has an interest... */
44
#include "ap_config.h"
45
#include "ap_mmn.h"
46
47
#include "ap_release.h"
48
49
#include "apr.h"
50
#include "apr_version.h"
51
#include "apr_general.h"
52
#include "apr_tables.h"
53
#include "apr_pools.h"
54
#include "apr_time.h"
55
#include "apr_network_io.h"
56
#include "apr_buckets.h"
57
#include "apr_poll.h"
58
#include "apr_thread_proc.h"
59
#include "apr_hash.h"
60
61
#include "os.h"
62
63
#include "ap_regex.h"
64
65
#if APR_HAVE_STDLIB_H
66
#include <stdlib.h>
67
#endif
68
69
/* Note: apr_uri.h is also included, see below */
70
71
#ifdef __cplusplus
72
extern "C" {
73
#endif
74
75
/* ----------------------------- config dir ------------------------------ */
76
77
/** Define this to be the default server home dir. Most things later in this
78
 * file with a relative pathname will have this added.
79
 */
80
#ifndef HTTPD_ROOT
81
#ifdef OS2
82
/** Set default for OS/2 file system */
83
#define HTTPD_ROOT "/os2httpd"
84
#elif defined(WIN32)
85
/** Set default for Windows file system */
86
#define HTTPD_ROOT "/apache"
87
#elif defined (NETWARE)
88
/** Set the default for NetWare */
89
#define HTTPD_ROOT "/apache"
90
#else
91
/** Set for all other OSs */
92
#define HTTPD_ROOT "/usr/local/apache"
93
#endif
94
#endif /* HTTPD_ROOT */
95
96
/*
97
 * --------- You shouldn't have to edit anything below this line ----------
98
 *
99
 * Any modifications to any defaults not defined above should be done in the
100
 * respective configuration file.
101
 *
102
 */
103
104
/**
105
 * Default location of documents.  Can be overridden by the DocumentRoot
106
 * directive.
107
 */
108
#ifndef DOCUMENT_LOCATION
109
#ifdef OS2
110
/* Set default for OS/2 file system */
111
#define DOCUMENT_LOCATION  HTTPD_ROOT "/docs"
112
#else
113
/* Set default for non OS/2 file system */
114
0
#define DOCUMENT_LOCATION  HTTPD_ROOT "/htdocs"
115
#endif
116
#endif /* DOCUMENT_LOCATION */
117
118
/** Maximum number of dynamically loaded modules */
119
#ifndef DYNAMIC_MODULE_LIMIT
120
0
#define DYNAMIC_MODULE_LIMIT 256
121
#endif
122
123
/** Default administrator's address */
124
0
#define DEFAULT_ADMIN "[no address given]"
125
126
/** The name of the log files */
127
#ifndef DEFAULT_ERRORLOG
128
#if defined(OS2) || defined(WIN32)
129
#define DEFAULT_ERRORLOG "logs/error.log"
130
#else
131
0
#define DEFAULT_ERRORLOG "logs/error_log"
132
#endif
133
#endif /* DEFAULT_ERRORLOG */
134
135
/** Define this to be what your per-directory security files are called */
136
#ifndef DEFAULT_ACCESS_FNAME
137
#ifdef OS2
138
/* Set default for OS/2 file system */
139
#define DEFAULT_ACCESS_FNAME "htaccess"
140
#else
141
0
#define DEFAULT_ACCESS_FNAME ".htaccess"
142
#endif
143
#endif /* DEFAULT_ACCESS_FNAME */
144
145
/** The name of the server config file */
146
#ifndef SERVER_CONFIG_FILE
147
#define SERVER_CONFIG_FILE "conf/httpd.conf"
148
#endif
149
150
/** The default path for CGI scripts if none is currently set */
151
#ifndef DEFAULT_PATH
152
0
#define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin"
153
#endif
154
155
/** The path to the suExec wrapper, can be overridden in Configuration */
156
#ifndef SUEXEC_BIN
157
0
#define SUEXEC_BIN  HTTPD_ROOT "/bin/suexec"
158
#endif
159
160
/** The timeout for waiting for messages */
161
#ifndef DEFAULT_TIMEOUT
162
#define DEFAULT_TIMEOUT 60
163
#endif
164
165
/** The timeout for waiting for keepalive timeout until next request */
166
#ifndef DEFAULT_KEEPALIVE_TIMEOUT
167
#define DEFAULT_KEEPALIVE_TIMEOUT 5
168
#endif
169
170
/** The number of requests to entertain per connection */
171
#ifndef DEFAULT_KEEPALIVE
172
0
#define DEFAULT_KEEPALIVE 100
173
#endif
174
175
/*
176
 * Limits on the size of various request items.  These limits primarily
177
 * exist to prevent simple denial-of-service attacks on a server based
178
 * on misuse of the protocol.  The recommended values will depend on the
179
 * nature of the server resources -- CGI scripts and database backends
180
 * might require large values, but most servers could get by with much
181
 * smaller limits than we use below.  The request message body size can
182
 * be limited by the per-dir config directive LimitRequestBody.
183
 *
184
 * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE
185
 * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190.
186
 * These two limits can be lowered or raised by the server config
187
 * directives LimitRequestLine and LimitRequestFieldsize, respectively.
188
 *
189
 * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by
190
 * the server config directive LimitRequestFields.
191
 */
192
193
/** default limit on bytes in Request-Line (Method+URI+HTTP-version) */
194
#ifndef DEFAULT_LIMIT_REQUEST_LINE
195
0
#define DEFAULT_LIMIT_REQUEST_LINE 8190
196
#endif
197
/** default limit on bytes in any one header field  */
198
#ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE
199
0
#define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190
200
#endif
201
/** default limit on number of request header fields */
202
#ifndef DEFAULT_LIMIT_REQUEST_FIELDS
203
0
#define DEFAULT_LIMIT_REQUEST_FIELDS 100
204
#endif
205
/** default/hard limit on number of leading/trailing empty lines */
206
#ifndef DEFAULT_LIMIT_BLANK_LINES
207
0
#define DEFAULT_LIMIT_BLANK_LINES 10
208
#endif
209
210
/**
211
 * The default default character set name to add if AddDefaultCharset is
212
 * enabled.  Overridden with AddDefaultCharsetName.
213
 */
214
0
#define DEFAULT_ADD_DEFAULT_CHARSET_NAME "iso-8859-1"
215
216
/** default HTTP Server protocol */
217
0
#define AP_SERVER_PROTOCOL "HTTP/1.1"
218
219
220
/* ------------------ stuff that modules are allowed to look at ----------- */
221
222
/** Define this to be what your HTML directory content files are called */
223
#ifndef AP_DEFAULT_INDEX
224
#define AP_DEFAULT_INDEX "index.html"
225
#endif
226
227
/** The name of the MIME types file */
228
#ifndef AP_TYPES_CONFIG_FILE
229
#define AP_TYPES_CONFIG_FILE "conf/mime.types"
230
#endif
231
232
/*
233
 * Define the HTML doctype strings centrally.
234
 */
235
/** HTML 2.0 Doctype */
236
#define DOCTYPE_HTML_2_0  "<!DOCTYPE HTML PUBLIC \"-//IETF//" \
237
                          "DTD HTML 2.0//EN\">\n"
238
/** HTML 3.2 Doctype */
239
#define DOCTYPE_HTML_3_2  "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
240
                          "DTD HTML 3.2 Final//EN\">\n"
241
/** HTML 4.0 Strict Doctype */
242
#define DOCTYPE_HTML_4_0S "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
243
                          "DTD HTML 4.0//EN\"\n" \
244
                          "\"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
245
/** HTML 4.0 Transitional Doctype */
246
#define DOCTYPE_HTML_4_0T "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
247
                          "DTD HTML 4.0 Transitional//EN\"\n" \
248
                          "\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n"
249
/** HTML 4.0 Frameset Doctype */
250
#define DOCTYPE_HTML_4_0F "<!DOCTYPE HTML PUBLIC \"-//W3C//" \
251
                          "DTD HTML 4.0 Frameset//EN\"\n" \
252
                          "\"http://www.w3.org/TR/REC-html40/frameset.dtd\">\n"
253
/** HTML 4.01 Doctype */
254
0
#define DOCTYPE_HTML_4_01 "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n"
255
/** HTML 5 Doctype */
256
#define DOCTYPE_HTML_5 "<!DOCTYPE html>\n"
257
/** XHTML 1.0 Strict Doctype */
258
#define DOCTYPE_XHTML_1_0S "<!DOCTYPE html PUBLIC \"-//W3C//" \
259
                           "DTD XHTML 1.0 Strict//EN\"\n" \
260
                           "\"http://www.w3.org/TR/xhtml1/DTD/" \
261
                           "xhtml1-strict.dtd\">\n"
262
/** XHTML 1.0 Transitional Doctype */
263
#define DOCTYPE_XHTML_1_0T "<!DOCTYPE html PUBLIC \"-//W3C//" \
264
                           "DTD XHTML 1.0 Transitional//EN\"\n" \
265
                           "\"http://www.w3.org/TR/xhtml1/DTD/" \
266
                           "xhtml1-transitional.dtd\">\n"
267
/** XHTML 1.0 Frameset Doctype */
268
#define DOCTYPE_XHTML_1_0F "<!DOCTYPE html PUBLIC \"-//W3C//" \
269
                           "DTD XHTML 1.0 Frameset//EN\"\n" \
270
                           "\"http://www.w3.org/TR/xhtml1/DTD/" \
271
                           "xhtml1-frameset.dtd\">"
272
273
/** Internal representation for a HTTP protocol number, e.g., HTTP/1.1 */
274
0
#define HTTP_VERSION(major,minor) (1000*(major)+(minor))
275
/** Major part of HTTP protocol */
276
0
#define HTTP_VERSION_MAJOR(number) ((number)/1000)
277
/** Minor part of HTTP protocol */
278
0
#define HTTP_VERSION_MINOR(number) ((number)%1000)
279
280
/* -------------- Port number for server running standalone --------------- */
281
282
/** default HTTP Port */
283
0
#define DEFAULT_HTTP_PORT       80
284
/** default HTTPS Port */
285
0
#define DEFAULT_HTTPS_PORT      443
286
/**
287
 * Check whether @a port is the default port for the request @a r.
288
 * @param port The port number
289
 * @param r The request
290
 * @see #ap_default_port
291
 */
292
0
#define ap_is_default_port(port,r)      ((port) == ap_default_port(r))
293
/**
294
 * Get the default port for a request (which depends on the scheme).
295
 * @param r The request
296
 */
297
0
#define ap_default_port(r)      ap_run_default_port(r)
298
/**
299
 * Get the scheme for a request.
300
 * @param r The request
301
 */
302
0
#define ap_http_scheme(r)       ap_run_http_scheme(r)
303
304
/** The default string length */
305
0
#define MAX_STRING_LEN HUGE_STRING_LEN
306
307
/** The length of a Huge string */
308
0
#define HUGE_STRING_LEN 8192
309
310
/** The size of the server's internal read-write buffers */
311
0
#define AP_IOBUFSIZE 8192
312
313
/** The max number of regex captures that can be expanded by ap_pregsub */
314
0
#define AP_MAX_REG_MATCH 10
315
316
/**
317
 * APR_HAS_LARGE_FILES introduces the problem of splitting sendfile into
318
 * multiple buckets, no greater than MAX(apr_size_t), and more granular
319
 * than that in case the brigade code/filters attempt to read it directly.
320
 * ### 16mb is an invention, no idea if it is reasonable.
321
 */
322
#define AP_MAX_SENDFILE 16777216  /* 2^24 */
323
324
/**
325
 * MPM child process exit status values
326
 * The MPM parent process may check the status to see if special
327
 * error handling is required.
328
 */
329
/** a normal exit */
330
#define APEXIT_OK               0x0
331
/** A fatal error arising during the server's init sequence */
332
#define APEXIT_INIT             0x2
333
/**  The child died during its init sequence */
334
#define APEXIT_CHILDINIT        0x3
335
/**
336
 *   The child exited due to a resource shortage.
337
 *   The parent should limit the rate of forking until
338
 *   the situation is resolved.
339
 */
340
0
#define APEXIT_CHILDSICK        0x7
341
/**
342
 *     A fatal error, resulting in the whole server aborting.
343
 *     If a child exits with this error, the parent process
344
 *     considers this a server-wide fatal error and aborts.
345
 */
346
0
#define APEXIT_CHILDFATAL       0xf
347
348
#ifndef AP_DECLARE
349
/**
350
 * Stuff marked #AP_DECLARE is part of the API, and intended for use
351
 * by modules. Its purpose is to allow us to add attributes that
352
 * particular platforms or compilers require to every exported function.
353
 */
354
# define AP_DECLARE(type)    type
355
#endif
356
357
#ifndef AP_DECLARE_NONSTD
358
/**
359
 * Stuff marked #AP_DECLARE_NONSTD is part of the API, and intended for
360
 * use by modules.  The difference between #AP_DECLARE and
361
 * #AP_DECLARE_NONSTD is that the latter is required for any functions
362
 * which use varargs or are used via indirect function call.  This
363
 * is to accommodate the two calling conventions in windows dlls.
364
 */
365
# define AP_DECLARE_NONSTD(type)    type
366
#endif
367
#ifndef AP_DECLARE_DATA
368
# define AP_DECLARE_DATA
369
#endif
370
371
#ifndef AP_MODULE_DECLARE
372
# define AP_MODULE_DECLARE(type)    type
373
#endif
374
#ifndef AP_MODULE_DECLARE_NONSTD
375
# define AP_MODULE_DECLARE_NONSTD(type)  type
376
#endif
377
#ifndef AP_MODULE_DECLARE_DATA
378
# define AP_MODULE_DECLARE_DATA
379
#endif
380
381
/**
382
 * @internal
383
 * modules should not use functions marked AP_CORE_DECLARE
384
 */
385
#ifndef AP_CORE_DECLARE
386
# define AP_CORE_DECLARE        AP_DECLARE
387
#endif
388
389
/**
390
 * @internal
391
 * modules should not use functions marked AP_CORE_DECLARE_NONSTD
392
 */
393
394
#ifndef AP_CORE_DECLARE_NONSTD
395
# define AP_CORE_DECLARE_NONSTD AP_DECLARE_NONSTD
396
#endif
397
398
/**
399
 * @defgroup APACHE_APR_STATUS_T HTTPD specific values of apr_status_t
400
 * @{
401
 */
402
#define AP_START_USERERR            (APR_OS_START_USERERR + 2000)
403
#define AP_USERERR_LEN              1000
404
405
/** The function declines to handle the request */
406
#define AP_DECLINED                 (AP_START_USERERR + 0)
407
408
/** @} */
409
410
/**
411
 * @brief The numeric version information is broken out into fields within this
412
 * structure.
413
 */
414
typedef struct {
415
    int major;              /**< major number */
416
    int minor;              /**< minor number */
417
    int patch;              /**< patch number */
418
    const char *add_string; /**< additional string like "-dev" */
419
} ap_version_t;
420
421
/**
422
 * Return httpd's version information in a numeric form.
423
 *
424
 *  @param version Pointer to a version structure for returning the version
425
 *                 information.
426
 */
427
AP_DECLARE(void) ap_get_server_revision(ap_version_t *version);
428
429
/**
430
 * Get the server banner in a form suitable for sending over the
431
 * network, with the level of information controlled by the
432
 * ServerTokens directive.
433
 * @return The server banner
434
 */
435
AP_DECLARE(const char *) ap_get_server_banner(void);
436
437
/**
438
 * Get the server description in a form suitable for local displays,
439
 * status reports, or logging.  This includes the detailed server
440
 * version and information about some modules.  It is not affected
441
 * by the ServerTokens directive.
442
 * @return The server description
443
 */
444
AP_DECLARE(const char *) ap_get_server_description(void);
445
446
/**
447
 * Add a component to the server description and banner strings
448
 * @param pconf The pool to allocate the component from
449
 * @param component The string to add
450
 */
451
AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component);
452
453
/**
454
 * Get the date a time that the server was built
455
 * @return The server build time string
456
 */
457
AP_DECLARE(const char *) ap_get_server_built(void);
458
459
/* non-HTTP status codes returned by hooks */
460
461
2.83k
#define OK           0  /**< Module has handled this stage. */
462
0
#define DECLINED    -1  /**< Module declines to handle */
463
0
#define DONE        -2  /**< Module has served the response completely
464
                         *   - it's safe to die() with no more output
465
                         */
466
0
#define SUSPENDED   -3  /**< Module will handle the remainder of the request.
467
                         *   The core will never invoke the request again */
468
469
/** Returned by the bottom-most filter if no data was written.
470
 *  @see ap_pass_brigade(). */
471
0
#define AP_NOBODY_WROTE         -100
472
/** Returned by the bottom-most filter if no data was read.
473
 *  @see ap_get_brigade(). */
474
0
#define AP_NOBODY_READ          -101
475
/** Returned by any filter if the filter chain encounters an error
476
 *  and has already dealt with the error response.
477
 */
478
0
#define AP_FILTER_ERROR         -102
479
480
/**
481
 * @defgroup HTTP_Status HTTP Status Codes
482
 * @{
483
 */
484
/**
485
 * The size of the static status_lines array in http_protocol.c for
486
 * storing all of the potential response status-lines (a sparse table).
487
 * When adding a new code here add it to status_lines as well.
488
 * A future version should dynamically generate the apr_table_t at startup.
489
 */
490
0
#define RESPONSE_CODES 103
491
492
0
#define HTTP_CONTINUE                        100
493
0
#define HTTP_SWITCHING_PROTOCOLS             101
494
#define HTTP_PROCESSING                      102
495
0
#define HTTP_OK                              200
496
0
#define HTTP_CREATED                         201
497
#define HTTP_ACCEPTED                        202
498
#define HTTP_NON_AUTHORITATIVE               203
499
0
#define HTTP_NO_CONTENT                      204
500
#define HTTP_RESET_CONTENT                   205
501
0
#define HTTP_PARTIAL_CONTENT                 206
502
#define HTTP_MULTI_STATUS                    207
503
#define HTTP_ALREADY_REPORTED                208
504
#define HTTP_IM_USED                         226
505
0
#define HTTP_MULTIPLE_CHOICES                300
506
0
#define HTTP_MOVED_PERMANENTLY               301
507
0
#define HTTP_MOVED_TEMPORARILY               302
508
0
#define HTTP_SEE_OTHER                       303
509
0
#define HTTP_NOT_MODIFIED                    304
510
0
#define HTTP_USE_PROXY                       305
511
0
#define HTTP_TEMPORARY_REDIRECT              307
512
0
#define HTTP_PERMANENT_REDIRECT              308
513
0
#define HTTP_BAD_REQUEST                     400
514
0
#define HTTP_UNAUTHORIZED                    401
515
#define HTTP_PAYMENT_REQUIRED                402
516
0
#define HTTP_FORBIDDEN                       403
517
0
#define HTTP_NOT_FOUND                       404
518
0
#define HTTP_METHOD_NOT_ALLOWED              405
519
0
#define HTTP_NOT_ACCEPTABLE                  406
520
0
#define HTTP_PROXY_AUTHENTICATION_REQUIRED   407
521
0
#define HTTP_REQUEST_TIME_OUT                408
522
#define HTTP_CONFLICT                        409
523
0
#define HTTP_GONE                            410
524
0
#define HTTP_LENGTH_REQUIRED                 411
525
0
#define HTTP_PRECONDITION_FAILED             412
526
0
#define HTTP_REQUEST_ENTITY_TOO_LARGE        413
527
0
#define HTTP_REQUEST_URI_TOO_LARGE           414
528
0
#define HTTP_UNSUPPORTED_MEDIA_TYPE          415
529
0
#define HTTP_RANGE_NOT_SATISFIABLE           416
530
0
#define HTTP_EXPECTATION_FAILED              417
531
0
#define HTTP_IM_A_TEAPOT                     418
532
0
#define HTTP_MISDIRECTED_REQUEST             421
533
0
#define HTTP_UNPROCESSABLE_ENTITY            422
534
0
#define HTTP_LOCKED                          423
535
0
#define HTTP_FAILED_DEPENDENCY               424
536
0
#define HTTP_TOO_EARLY                       425
537
0
#define HTTP_UPGRADE_REQUIRED                426
538
0
#define HTTP_PRECONDITION_REQUIRED           428
539
0
#define HTTP_TOO_MANY_REQUESTS               429
540
0
#define HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE 431
541
0
#define HTTP_UNAVAILABLE_FOR_LEGAL_REASONS   451
542
0
#define HTTP_INTERNAL_SERVER_ERROR           500
543
0
#define HTTP_NOT_IMPLEMENTED                 501
544
0
#define HTTP_BAD_GATEWAY                     502
545
0
#define HTTP_SERVICE_UNAVAILABLE             503
546
0
#define HTTP_GATEWAY_TIME_OUT                504
547
0
#define HTTP_VERSION_NOT_SUPPORTED           505
548
0
#define HTTP_VARIANT_ALSO_VARIES             506
549
0
#define HTTP_INSUFFICIENT_STORAGE            507
550
0
#define HTTP_LOOP_DETECTED                   508
551
0
#define HTTP_NOT_EXTENDED                    510
552
0
#define HTTP_NETWORK_AUTHENTICATION_REQUIRED 511
553
554
/** is the status code informational */
555
0
#define ap_is_HTTP_INFO(x)         (((x) >= 100)&&((x) < 200))
556
/** is the status code OK ?*/
557
0
#define ap_is_HTTP_SUCCESS(x)      (((x) >= 200)&&((x) < 300))
558
/** is the status code a redirect */
559
0
#define ap_is_HTTP_REDIRECT(x)     (((x) >= 300)&&((x) < 400))
560
/** is the status code a error (client or server) */
561
0
#define ap_is_HTTP_ERROR(x)        (((x) >= 400)&&((x) < 600))
562
/** is the status code a client error  */
563
#define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500))
564
/** is the status code a server error  */
565
#define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600))
566
/** is the status code a (potentially) valid response code?  */
567
0
#define ap_is_HTTP_VALID_RESPONSE(x) (((x) >= 100)&&((x) < 600))
568
569
/** should the status code drop the connection */
570
#define ap_status_drops_connection(x) \
571
0
                                   (((x) == HTTP_BAD_REQUEST)           || \
572
0
                                    ((x) == HTTP_REQUEST_TIME_OUT)      || \
573
0
                                    ((x) == HTTP_LENGTH_REQUIRED)       || \
574
0
                                    ((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \
575
0
                                    ((x) == HTTP_REQUEST_URI_TOO_LARGE) || \
576
0
                                    ((x) == HTTP_INTERNAL_SERVER_ERROR) || \
577
0
                                    ((x) == HTTP_SERVICE_UNAVAILABLE) || \
578
0
                                    ((x) == HTTP_NOT_IMPLEMENTED))
579
580
/** does the status imply header only response (i.e. never w/ a body)? */
581
0
#define AP_STATUS_IS_HEADER_ONLY(x) ((x) == HTTP_NO_CONTENT || \
582
0
                                     (x) == HTTP_NOT_MODIFIED)
583
/** @} */
584
585
/**
586
 * @defgroup Methods List of Methods recognized by the server
587
 * @ingroup APACHE_CORE_DAEMON
588
 * @{
589
 *
590
 * @brief Methods recognized (but not necessarily handled) by the server.
591
 *
592
 * These constants are used in bit shifting masks of size int, so it is
593
 * unsafe to have more methods than bits in an int.  HEAD == M_GET.
594
 * This list must be tracked by the list in http_protocol.c in routine
595
 * ap_method_name_of().
596
 *
597
 */
598
599
0
#define M_GET                   0       /** RFC 2616: HTTP */
600
0
#define M_PUT                   1       /*  :             */
601
0
#define M_POST                  2
602
0
#define M_DELETE                3
603
0
#define M_CONNECT               4
604
0
#define M_OPTIONS               5
605
0
#define M_TRACE                 6       /** RFC 2616: HTTP */
606
0
#define M_PATCH                 7       /** RFC 5789: PATCH Method for HTTP */
607
0
#define M_PROPFIND              8       /** RFC 2518: WebDAV */
608
0
#define M_PROPPATCH             9       /*  :               */
609
0
#define M_MKCOL                 10
610
0
#define M_COPY                  11
611
0
#define M_MOVE                  12
612
0
#define M_LOCK                  13
613
0
#define M_UNLOCK                14      /** RFC 2518: WebDAV */
614
0
#define M_VERSION_CONTROL       15      /** RFC 3253: WebDAV Versioning */
615
0
#define M_CHECKOUT              16      /*  :                          */
616
0
#define M_UNCHECKOUT            17
617
0
#define M_CHECKIN               18
618
0
#define M_UPDATE                19
619
0
#define M_LABEL                 20
620
0
#define M_REPORT                21
621
0
#define M_MKWORKSPACE           22
622
0
#define M_MKACTIVITY            23
623
0
#define M_BASELINE_CONTROL      24
624
0
#define M_MERGE                 25
625
/* Additional methods must be registered by the implementor, we have only
626
 * room for 64 bit-wise methods available, so do not squander them (more of
627
 * the above methods should probably move here)
628
 */
629
/* #define M_BREW                  nn */     /** RFC 2324: HTCPCP/1.0 */
630
/* #define M_WHEN                  nn */     /** RFC 2324: HTCPCP/1.0 */
631
0
#define M_INVALID               26      /** invalid method value terminates the
632
                                         *  listed ap_method_registry_init()
633
                                         */
634
635
/**
636
 * METHODS needs to be equal to the number of bits
637
 * we are using for limit masks.
638
 */
639
#define METHODS     64
640
641
/**
642
 * The type used for method masks.
643
 */
644
typedef apr_uint64_t ap_method_mask_t;
645
/**
646
 * The method mask bit to shift for anding with a bitmask.
647
 */
648
0
#define AP_METHOD_BIT ((ap_method_mask_t)1)
649
650
/** @see ap_method_list_t */
651
typedef struct ap_method_list_t ap_method_list_t;
652
653
/**
654
 * @struct ap_method_list_t
655
 * @brief  Structure for handling HTTP methods.
656
 *
657
 * Methods known to the server are accessed via a bitmask shortcut;
658
 * extension methods are handled by an array.
659
 */
660
struct ap_method_list_t {
661
    /** The bitmask used for known methods */
662
    ap_method_mask_t method_mask;
663
    /** the array used for extension methods */
664
    apr_array_header_t *method_list;
665
};
666
/** @} */
667
668
/**
669
 * @defgroup bnotes Binary notes recognized by the server
670
 * @ingroup APACHE_CORE_DAEMON
671
 * @{
672
 *
673
 * @brief Binary notes recognized by the server.
674
 */
675
676
/**
677
 * The type used for request binary notes.
678
 */
679
typedef apr_uint64_t ap_request_bnotes_t;
680
681
/**
682
 * These constants represent bitmasks for notes associated with this
683
 * request. There are space for 64 bits in the apr_uint64_t.
684
 *
685
 */
686
#define AP_REQUEST_STRONG_ETAG (1u << 0)
687
#define AP_REQUEST_TRUSTED_CT  (1u << 1)
688
689
/**
690
 * This is a convenience macro to ease with getting specific request
691
 * binary notes.
692
 */
693
#define AP_REQUEST_GET_BNOTE(r, mask) \
694
0
    ((mask) & ((r)->bnotes))
695
696
/**
697
 * This is a convenience macro to ease with setting specific request
698
 * binary notes.
699
 */
700
#define AP_REQUEST_SET_BNOTE(r, mask, val) \
701
0
    (r)->bnotes = (((r)->bnotes & ~(mask)) | (val))
702
703
/**
704
 * Returns true if the strong etag flag is set for this request.
705
 */
706
#define AP_REQUEST_IS_STRONG_ETAG(r) \
707
0
        AP_REQUEST_GET_BNOTE((r), AP_REQUEST_STRONG_ETAG)
708
/** @} */
709
710
/**
711
 * Returns true if the content-type field is from a trusted source
712
 */
713
#define AP_REQUEST_IS_TRUSTED_CT(r) \
714
0
    (!!AP_REQUEST_GET_BNOTE((r), AP_REQUEST_TRUSTED_CT))
715
/** @} */
716
717
/**
718
 * @defgroup module_magic Module Magic mime types
719
 * @{
720
 */
721
/** Magic for mod_cgi[d] */
722
#define CGI_MAGIC_TYPE "application/x-httpd-cgi"
723
/** Magic for mod_include */
724
#define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html"
725
/** Magic for mod_include */
726
#define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3"
727
/** Magic for mod_dir */
728
#define DIR_MAGIC_TYPE "httpd/unix-directory"
729
/** Default for r->handler if no content-type set by type_checker */
730
0
#define AP_DEFAULT_HANDLER_NAME ""
731
#define AP_IS_DEFAULT_HANDLER_NAME(x) (*x == '\0')
732
733
/** @} */
734
/* Just in case your linefeed isn't the one the other end is expecting. */
735
#if !APR_CHARSET_EBCDIC
736
/** linefeed */
737
0
#define LF 10
738
/** carriage return */
739
0
#define CR 13
740
/** carriage return /Line Feed Combo */
741
0
#define CRLF "\015\012"
742
#else /* APR_CHARSET_EBCDIC */
743
/* For platforms using the EBCDIC charset, the transition ASCII->EBCDIC is done
744
 * in the buff package (bread/bputs/bwrite).  Everywhere else, we use
745
 * "native EBCDIC" CR and NL characters. These are therefore
746
 * defined as
747
 * '\r' and '\n'.
748
 */
749
#define CR '\r'
750
#define LF '\n'
751
#define CRLF "\r\n"
752
#endif /* APR_CHARSET_EBCDIC */
753
/** Useful for common code with either platform charset. */
754
0
#define CRLF_ASCII "\015\012"
755
0
#define ZERO_ASCII "\060"
756
757
/**
758
 * @defgroup values_request_rec_body Possible values for request_rec.read_body
759
 * @{
760
 * Possible values for request_rec.read_body (set by handling module):
761
 */
762
763
/** Send 413 error if message has any body */
764
0
#define REQUEST_NO_BODY          0
765
/** Send 411 error if body without Content-Length */
766
0
#define REQUEST_CHUNKED_ERROR    1
767
/** If chunked, remove the chunks for me. */
768
0
#define REQUEST_CHUNKED_DECHUNK  2
769
/** @} // values_request_rec_body */
770
771
/**
772
 * @defgroup values_request_rec_used_path_info Possible values for request_rec.used_path_info
773
 * @ingroup APACHE_CORE_DAEMON
774
 * @{
775
 * Possible values for request_rec.used_path_info:
776
 */
777
778
/** Accept the path_info from the request */
779
0
#define AP_REQ_ACCEPT_PATH_INFO    0
780
/** Return a 404 error if path_info was given */
781
0
#define AP_REQ_REJECT_PATH_INFO    1
782
/** Module may chose to use the given path_info */
783
0
#define AP_REQ_DEFAULT_PATH_INFO   2
784
785
/** @} // values_request_rec_used_path_info */
786
787
788
/*
789
 * Things which may vary per file-lookup WITHIN a request ---
790
 * e.g., state of MIME config.  Basically, the name of an object, info
791
 * about the object, and any other info we may have which may need to
792
 * change as we go poking around looking for it (e.g., overridden by
793
 * .htaccess files).
794
 *
795
 * Note how the default state of almost all these things is properly
796
 * zero, so that allocating it with pcalloc does the right thing without
797
 * a whole lot of hairy initialization... so long as we are willing to
798
 * make the (fairly) portable assumption that the bit pattern of a NULL
799
 * pointer is, in fact, zero.
800
 */
801
802
/**
803
 * @brief This represents the result of calling htaccess; these are cached for
804
 * each request.
805
 */
806
struct htaccess_result {
807
    /** the directory to which this applies */
808
    const char *dir;
809
    /** the overrides allowed for the .htaccess file */
810
    int override;
811
    /** the override options allowed for the .htaccess file */
812
    int override_opts;
813
    /** Table of allowed directives for override */
814
    apr_table_t *override_list;
815
    /** the configuration directives */
816
    struct ap_conf_vector_t *htaccess;
817
    /** the next one, or NULL if no more; N.B. never change this */
818
    const struct htaccess_result *next;
819
};
820
821
/* The following four types define a hierarchy of activities, so that
822
 * given a request_rec r you can write r->connection->server->process
823
 * to get to the process_rec.  While this reduces substantially the
824
 * number of arguments that various hooks require beware that in
825
 * threaded versions of the server you must consider multiplexing
826
 * issues.  */
827
828
829
/** A structure that represents one process */
830
typedef struct process_rec process_rec;
831
/** A structure that represents a virtual server */
832
typedef struct server_rec server_rec;
833
/** A structure that represents one connection */
834
typedef struct conn_rec conn_rec;
835
/** A structure that represents one slave connection */
836
typedef struct conn_slave_rec conn_slave_rec;
837
/** A structure that represents the current request */
838
typedef struct request_rec request_rec;
839
/** A structure that represents the status of the current connection */
840
typedef struct conn_state_t conn_state_t;
841
842
/* ### would be nice to not include this from httpd.h ... */
843
/* This comes after we have defined the request_rec type */
844
#include "apr_uri.h"
845
846
/**
847
 * @brief A structure that represents one process
848
 */
849
struct process_rec {
850
    /** Global pool. Cleared upon normal exit */
851
    apr_pool_t *pool;
852
    /** Configuration pool. Cleared upon restart */
853
    apr_pool_t *pconf;
854
    /** The program name used to execute the program */
855
    const char *short_name;
856
    /** The command line arguments */
857
    const char * const *argv;
858
    /** Number of command line arguments passed to the program */
859
    int argc;
860
};
861
862
/**
863
 * @brief A structure that represents the current request
864
 */
865
struct request_rec {
866
    /** The pool associated with the request */
867
    apr_pool_t *pool;
868
    /** The connection to the client */
869
    conn_rec *connection;
870
    /** The virtual host for this request */
871
    server_rec *server;
872
873
    /** Pointer to the redirected request if this is an external redirect */
874
    request_rec *next;
875
    /** Pointer to the previous request if this is an internal redirect */
876
    request_rec *prev;
877
878
    /** Pointer to the main request if this is a sub-request
879
     * (see http_request.h) */
880
    request_rec *main;
881
882
    /* Info about the request itself... we begin with stuff that only
883
     * protocol.c should ever touch...
884
     */
885
    /** First line of request */
886
    char *the_request;
887
    /** HTTP/0.9, "simple" request (e.g. GET /foo\n w/no headers) */
888
    int assbackwards;
889
    /** A proxy request (calculated during post_read_request/translate_name)
890
     *  possible values PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE,
891
     *                  PROXYREQ_RESPONSE
892
     */
893
    int proxyreq;
894
    /** HEAD request, as opposed to GET */
895
    int header_only;
896
    /** Protocol version number of protocol; 1.1 = 1001 */
897
    int proto_num;
898
    /** Protocol string, as given to us, or HTTP/0.9 */
899
    const char *protocol;
900
    /** Host, as set by full URI or Host: header.
901
     *  For literal IPv6 addresses, this does NOT include the surrounding [ ]
902
     */
903
    const char *hostname;
904
905
    /** Time when the request started */
906
    apr_time_t request_time;
907
908
    /** Status line, if set by script */
909
    const char *status_line;
910
    /** Status line */
911
    int status;
912
913
    /* Request method, two ways; also, protocol, etc..  Outside of protocol.c,
914
     * look, but don't touch.
915
     */
916
917
    /** M_GET, M_POST, etc. */
918
    int method_number;
919
    /** Request method (eg. GET, HEAD, POST, etc.) */
920
    const char *method;
921
922
    /**
923
     *  'allowed' is a bitvector of the allowed methods.
924
     *
925
     *  A handler must ensure that the request method is one that
926
     *  it is capable of handling.  Generally modules should DECLINE
927
     *  any request methods they do not handle.  Prior to aborting the
928
     *  handler like this the handler should set r->allowed to the list
929
     *  of methods that it is willing to handle.  This bitvector is used
930
     *  to construct the "Allow:" header required for OPTIONS requests,
931
     *  and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes.
932
     *
933
     *  Since the default_handler deals with OPTIONS, all modules can
934
     *  usually decline to deal with OPTIONS.  TRACE is always allowed,
935
     *  modules don't need to set it explicitly.
936
     *
937
     *  Since the default_handler will always handle a GET, a
938
     *  module which does *not* implement GET should probably return
939
     *  HTTP_METHOD_NOT_ALLOWED.  Unfortunately this means that a Script GET
940
     *  handler can't be installed by mod_actions.
941
     */
942
    ap_method_mask_t allowed;
943
    /** Array of extension methods */
944
    apr_array_header_t *allowed_xmethods;
945
    /** List of allowed methods */
946
    ap_method_list_t *allowed_methods;
947
948
    /** byte count in stream is for body */
949
    apr_off_t sent_bodyct;
950
    /** body byte count, for easy access */
951
    apr_off_t bytes_sent;
952
    /** Last modified time of the requested resource */
953
    apr_time_t mtime;
954
955
    /* HTTP/1.1 connection-level features */
956
957
    /** The Range: header */
958
    const char *range;
959
    /** The "real" content length */
960
    apr_off_t clength;
961
    /** sending chunked transfer-coding */
962
    int chunked;
963
964
    /** Method for reading the request body
965
     * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY,
966
     *  REQUEST_CHUNKED_DECHUNK, etc...) */
967
    int read_body;
968
    /** reading chunked transfer-coding */
969
    int read_chunked;
970
    /** is client waiting for a 100 response? */
971
    unsigned expecting_100;
972
    /** The optional kept body of the request. */
973
    apr_bucket_brigade *kept_body;
974
    /** For ap_body_to_table(): parsed body */
975
    /* XXX: ap_body_to_table has been removed. Remove body_table too or
976
     * XXX: keep it to reintroduce ap_body_to_table without major bump? */
977
    apr_table_t *body_table;
978
    /** Remaining bytes left to read from the request body */
979
    apr_off_t remaining;
980
    /** Number of bytes that have been read  from the request body */
981
    apr_off_t read_length;
982
983
    /* MIME header environments, in and out.  Also, an array containing
984
     * environment variables to be passed to subprocesses, so people can
985
     * write modules to add to that environment.
986
     *
987
     * The difference between headers_out and err_headers_out is that the
988
     * latter are printed even on error, and persist across internal redirects
989
     * (so the headers printed for ErrorDocument handlers will have them).
990
     *
991
     * The 'notes' apr_table_t is for notes from one module to another, with no
992
     * other set purpose in mind...
993
     */
994
995
    /** MIME header environment from the request */
996
    apr_table_t *headers_in;
997
    /** MIME header environment for the response */
998
    apr_table_t *headers_out;
999
    /** MIME header environment for the response, printed even on errors and
1000
     * persist across internal redirects */
1001
    apr_table_t *err_headers_out;
1002
    /** Array of environment variables to be used for sub processes */
1003
    apr_table_t *subprocess_env;
1004
    /** Notes from one module to another */
1005
    apr_table_t *notes;
1006
1007
    /* content_type, handler, content_encoding, and all content_languages
1008
     * MUST be lowercased strings.  They may be pointers to static strings;
1009
     * they should not be modified in place.
1010
     */
1011
    /** The content-type for the current request */
1012
    const char *content_type;   /* Break these out --- we dispatch on 'em */
1013
    /** The handler string that we use to call a handler function */
1014
    const char *handler;        /* What we *really* dispatch on */
1015
1016
    /** How to encode the data */
1017
    const char *content_encoding;
1018
    /** Array of strings representing the content languages */
1019
    apr_array_header_t *content_languages;
1020
1021
    /** variant list validator (if negotiated) */
1022
    char *vlist_validator;
1023
1024
    /** If an authentication check was made, this gets set to the user name. */
1025
    char *user;
1026
    /** If an authentication check was made, this gets set to the auth type. */
1027
    char *ap_auth_type;
1028
1029
    /* What object is being requested (either directly, or via include
1030
     * or content-negotiation mapping).
1031
     */
1032
1033
    /** The URI without any parsing performed */
1034
    char *unparsed_uri;
1035
    /** The path portion of the URI, or "/" if no path provided */
1036
    char *uri;
1037
    /** The filename on disk corresponding to this response */
1038
    char *filename;
1039
    /** The true filename stored in the filesystem, as in the true alpha case
1040
     *  and alias correction, e.g. "Image.jpeg" not "IMAGE$1.JPE" on Windows.
1041
     *  The core map_to_storage canonicalizes r->filename when they mismatch */
1042
    char *canonical_filename;
1043
    /** The PATH_INFO extracted from this request */
1044
    char *path_info;
1045
    /** The QUERY_ARGS extracted from this request */
1046
    char *args;
1047
1048
    /**
1049
     * Flag for the handler to accept or reject path_info on
1050
     * the current request.  All modules should respect the
1051
     * AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO
1052
     * values, while AP_REQ_DEFAULT_PATH_INFO indicates they
1053
     * may follow existing conventions.  This is set to the
1054
     * user's preference upon HOOK_VERY_FIRST of the fixups.
1055
     */
1056
    int used_path_info;
1057
1058
    /** A flag to determine if the eos bucket has been sent yet */
1059
    int eos_sent;
1060
1061
    /* Various other config info which may change with .htaccess files
1062
     * These are config vectors, with one void* pointer for each module
1063
     * (the thing pointed to being the module's business).
1064
     */
1065
1066
    /** Options set in config files, etc. */
1067
    struct ap_conf_vector_t *per_dir_config;
1068
    /** Notes on *this* request */
1069
    struct ap_conf_vector_t *request_config;
1070
1071
    /** Optional request log level configuration. Will usually point
1072
     *  to a server or per_dir config, i.e. must be copied before
1073
     *  modifying */
1074
    const struct ap_logconf *log;
1075
1076
    /** Id to identify request in access and error log. Set when the first
1077
     *  error log entry for this request is generated.
1078
     */
1079
    const char *log_id;
1080
1081
    /**
1082
     * A linked list of the .htaccess configuration directives
1083
     * accessed by this request.
1084
     * N.B. always add to the head of the list, _never_ to the end.
1085
     * that way, a sub request's list can (temporarily) point to a parent's list
1086
     */
1087
    const struct htaccess_result *htaccess;
1088
1089
    /** A list of output filters to be used for this request */
1090
    struct ap_filter_t *output_filters;
1091
    /** A list of input filters to be used for this request */
1092
    struct ap_filter_t *input_filters;
1093
1094
    /** A list of protocol level output filters to be used for this
1095
     *  request */
1096
    struct ap_filter_t *proto_output_filters;
1097
    /** A list of protocol level input filters to be used for this
1098
     *  request */
1099
    struct ap_filter_t *proto_input_filters;
1100
1101
    /** This response can not be cached */
1102
    int no_cache;
1103
    /** There is no local copy of this response */
1104
    int no_local_copy;
1105
1106
    /** Mutex protect callbacks registered with ap_mpm_register_timed_callback
1107
     * from being run before the original handler finishes running
1108
     */
1109
#if APR_HAS_THREADS
1110
    apr_thread_mutex_t *invoke_mtx;
1111
#endif
1112
1113
    /** A struct containing the components of URI */
1114
    apr_uri_t parsed_uri;
1115
    /**  finfo.protection (st_mode) set to zero if no such file */
1116
    apr_finfo_t finfo;
1117
1118
    /** remote address information from conn_rec, can be overridden if
1119
     * necessary by a module.
1120
     * This is the address that originated the request.
1121
     */
1122
    apr_sockaddr_t *useragent_addr;
1123
    char *useragent_ip;
1124
1125
    /** MIME trailer environment from the request */
1126
    apr_table_t *trailers_in;
1127
    /** MIME trailer environment from the response */
1128
    apr_table_t *trailers_out;
1129
1130
    /** Originator's DNS name, if known.  NULL if DNS hasn't been checked,
1131
     *  "" if it has and no address was found.  N.B. Only access this though
1132
     *  ap_get_useragent_host() */
1133
    char *useragent_host;
1134
    /** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
1135
     *  1 yes/success
1136
     *  TODO: 2 bit signed bitfield when this structure is compacted
1137
     */
1138
    int double_reverse;
1139
    /** Mark the request as potentially tainted.  This might become a
1140
     *  bitfield if we identify different taints to be flagged.
1141
     *  Always use ap_request_tainted() to check taint.
1142
     */
1143
    int taint;
1144
    /** Whether the response has been flushed through the network,
1145
     *  relevant at ap_run_log_transaction() time only.
1146
     *  TODO: compact elsewhere
1147
     */
1148
    unsigned int flushed:1;
1149
    /** Request flags associated with this request. Use
1150
     * AP_REQUEST_GET_BNOTE() and AP_REQUEST_SET_BNOTE() to access
1151
     * the elements of this field.
1152
     */
1153
    ap_request_bnotes_t bnotes;
1154
1155
    /** Indicates that the request has a body of unknown length and
1156
     * protocol handlers need to read it, even if only to discard the
1157
     * data. In HTTP/1.1 this is set on chunked transfer encodings, but
1158
     * newer HTTP versions can transfer such bodies by other means. The
1159
     * absence of a "Transfer-Encoding" header is no longer sufficient
1160
     * to conclude that no body is there.
1161
     */
1162
    unsigned int body_indeterminate :1;
1163
    /** Whether a final (status >= 200) RESPONSE BUCKET has been passed down
1164
     * the output filters already. Relevant for ap_die().
1165
     *  TODO: compact elsewhere
1166
     */
1167
    unsigned int final_resp_passed  :1;
1168
};
1169
1170
/**
1171
 * @defgroup ProxyReq Proxy request types
1172
 *
1173
 * Possible values of request_rec->proxyreq. A request could be normal,
1174
 *  proxied or reverse proxied. Normally proxied and reverse proxied are
1175
 *  grouped together as just "proxied", but sometimes it's necessary to
1176
 *  tell the difference between the two, such as for authentication.
1177
 * @{
1178
 */
1179
1180
0
#define PROXYREQ_NONE     0     /**< No proxy */
1181
0
#define PROXYREQ_PROXY    1     /**< Standard proxy */
1182
#define PROXYREQ_REVERSE  2     /**< Reverse proxy */
1183
0
#define PROXYREQ_RESPONSE 3     /**< Origin response */
1184
1185
/* @} */
1186
1187
/**
1188
 * @brief Enumeration of connection keepalive options
1189
 */
1190
typedef enum {
1191
    AP_CONN_UNKNOWN,
1192
    AP_CONN_CLOSE,
1193
    AP_CONN_KEEPALIVE
1194
} ap_conn_keepalive_e;
1195
1196
/* For struct ap_filter and ap_filter_conn_ctx */
1197
#include "util_filter.h"
1198
1199
/**
1200
 * @brief Structure to store things which are per connection
1201
 */
1202
struct conn_rec {
1203
    /** Pool associated with this connection */
1204
    apr_pool_t *pool;
1205
    /** Physical vhost this conn came in on */
1206
    server_rec *base_server;
1207
    /** used by http_vhost.c */
1208
    void *vhost_lookup_data;
1209
1210
    /* Information about the connection itself */
1211
    /** local address */
1212
    apr_sockaddr_t *local_addr;
1213
    /** remote address; this is the end-point of the next hop, for the address
1214
     *  of the request creator, see useragent_addr in request_rec
1215
     */
1216
    apr_sockaddr_t *client_addr;
1217
1218
    /** Client's IP address; this is the end-point of the next hop, for the
1219
     *  IP of the request creator, see useragent_ip in request_rec
1220
     */
1221
    char *client_ip;
1222
    /** Client's DNS name, if known.  NULL if DNS hasn't been checked,
1223
     *  "" if it has and no address was found.  N.B. Only access this though
1224
     * get_remote_host() */
1225
    char *remote_host;
1226
    /** Only ever set if doing rfc1413 lookups.  N.B. Only access this through
1227
     *  get_remote_logname() */
1228
    /* TODO: Remove from request_rec, make local to mod_ident */
1229
    char *remote_logname;
1230
1231
    /** server IP address */
1232
    char *local_ip;
1233
    /** used for ap_get_server_name when UseCanonicalName is set to DNS
1234
     *  (ignores setting of HostnameLookups) */
1235
    char *local_host;
1236
1237
    /** ID of this connection; unique at any point in time */
1238
    long id;
1239
    /** Config vector containing pointers to connections per-server
1240
     *  config structures. */
1241
    struct ap_conf_vector_t *conn_config;
1242
    /** Notes on *this* connection: send note from one module to
1243
     *  another. must remain valid for all requests on this conn */
1244
    apr_table_t *notes;
1245
    /** A list of input filters to be used for this connection */
1246
    struct ap_filter_t *input_filters;
1247
    /** A list of output filters to be used for this connection */
1248
    struct ap_filter_t *output_filters;
1249
    /** handle to scoreboard information for this connection */
1250
    void *sbh;
1251
    /** The bucket allocator to use for all bucket/brigade creations */
1252
    struct apr_bucket_alloc_t *bucket_alloc;
1253
    /** The current state of this connection; may be NULL if not used by MPM */
1254
    conn_state_t *cs;
1255
1256
    /** Are there any filters that clogg/buffer the input stream, breaking
1257
     *  the event mpm.
1258
     */
1259
    unsigned int clogging_input_filters:1;
1260
1261
    /** have we done double-reverse DNS? -1 yes/failure, 0 not yet,
1262
     *  1 yes/success */
1263
    signed int double_reverse:2;
1264
1265
    /** Are we still talking? */
1266
    unsigned aborted;
1267
1268
    /** Are we going to keep the connection alive for another request?
1269
     * @see ap_conn_keepalive_e */
1270
    ap_conn_keepalive_e keepalive;
1271
1272
    /** How many times have we used it? */
1273
    int keepalives;
1274
1275
    /** Optional connection log level configuration. May point to a server or
1276
     *  per_dir config, i.e. must be copied before modifying */
1277
    const struct ap_logconf *log;
1278
1279
    /** Id to identify this connection in error log. Set when the first
1280
     *  error log entry for this connection is generated.
1281
     */
1282
    const char *log_id;
1283
1284
1285
    /** This points to the current thread being used to process this request,
1286
     * over the lifetime of a request, the value may change. Users of the connection
1287
     * record should not rely upon it staying the same between calls that involve
1288
     * the MPM.
1289
     */
1290
#if APR_HAS_THREADS
1291
    apr_thread_t *current_thread;
1292
#endif
1293
1294
    /** Array of slave connections (conn_slave_rec *) for this connection. */
1295
    apr_array_header_t *slaves;
1296
1297
    /** The "real" master connection. NULL if I am the master. */
1298
    conn_rec *master;
1299
1300
    /** context of this connection */
1301
    void *ctx;
1302
1303
    /** Context under which this connection was suspended */
1304
    void *suspended_baton;
1305
1306
    /** Array of requests being handled under this connection. */
1307
    apr_array_header_t *requests;
1308
1309
    /** Filters private/opaque context for this connection */
1310
    struct ap_filter_conn_ctx *filter_conn_ctx;
1311
1312
    /** The minimum level of filter type to allow setaside buckets */
1313
    int async_filter;
1314
1315
    int outgoing;
1316
};
1317
1318
struct conn_slave_rec {
1319
  conn_rec *c;
1320
};
1321
1322
/**
1323
 * Enumeration of connection states
1324
 * The two states CONN_STATE_LINGER_NORMAL and CONN_STATE_LINGER_SHORT may
1325
 * only be set by the MPM. Use CONN_STATE_LINGER outside of the MPM.
1326
 */
1327
typedef enum  {
1328
    CONN_STATE_KEEPALIVE,           /* Kept alive in the MPM (using KeepAliveTimeout) */
1329
    CONN_STATE_PROCESSING,          /* Processed by process_connection hooks */
1330
    CONN_STATE_HANDLER,             /* Processed by the modules handlers */
1331
    CONN_STATE_WRITE_COMPLETION,    /* Flushed by the MPM before entering CONN_STATE_KEEPALIVE */
1332
    CONN_STATE_SUSPENDED,           /* Suspended in the MPM until ap_run_resume_suspended() */
1333
    CONN_STATE_LINGER,              /* MPM flushes then closes the connection with lingering */
1334
    CONN_STATE_LINGER_NORMAL,       /* MPM has started lingering close with normal timeout */
1335
    CONN_STATE_LINGER_SHORT,        /* MPM has started lingering close with short timeout */
1336
1337
    CONN_STATE_ASYNC_WAITIO,        /* Returning this state to the MPM will make it wait for
1338
                                     * the connection to be readable or writable according to
1339
                                     * c->cs->sense (resp. CONN_SENSE_WANT_READ or _WRITE),
1340
                                     * using the configured Timeout */
1341
1342
    CONN_STATE_NUM,                 /* Number of states (keep here before aliases) */
1343
1344
    /* Aliases (legacy) */
1345
    CONN_STATE_CHECK_REQUEST_LINE_READABLE  = CONN_STATE_KEEPALIVE,
1346
    CONN_STATE_READ_REQUEST_LINE            = CONN_STATE_PROCESSING,
1347
} conn_state_e;
1348
1349
typedef enum  {
1350
    CONN_SENSE_DEFAULT,
1351
    CONN_SENSE_WANT_READ,       /* next event must be read */
1352
    CONN_SENSE_WANT_WRITE       /* next event must be write */
1353
} conn_sense_e;
1354
1355
/**
1356
 * @brief A structure to contain connection state information
1357
 */
1358
struct conn_state_t {
1359
    /** Current state of the connection */
1360
    conn_state_e state;
1361
    /** Whether to read instead of write, or write instead of read */
1362
    conn_sense_e sense;
1363
};
1364
1365
/* Per-vhost config... */
1366
1367
/**
1368
 * The address 255.255.255.255, when used as a virtualhost address,
1369
 * will become the "default" server when the ip doesn't match other vhosts.
1370
 */
1371
#define DEFAULT_VHOST_ADDR 0xfffffffful
1372
1373
1374
/**
1375
 * @struct server_addr_rec
1376
 * @brief  A structure to be used for Per-vhost config
1377
 */
1378
typedef struct server_addr_rec server_addr_rec;
1379
struct server_addr_rec {
1380
    /** The next server in the list */
1381
    server_addr_rec *next;
1382
    /** The name given in "<VirtualHost>" */
1383
    char *virthost;
1384
    /** The bound address, for this server */
1385
    apr_sockaddr_t *host_addr;
1386
    /** The bound port, for this server */
1387
    apr_port_t host_port;
1388
};
1389
1390
struct ap_logconf {
1391
    /** The per-module log levels */
1392
    signed char *module_levels;
1393
1394
    /** The log level for this server */
1395
    int level;
1396
};
1397
/**
1398
 * @brief A structure to store information for each virtual server
1399
 */
1400
struct server_rec {
1401
    /** The process this server is running in */
1402
    process_rec *process;
1403
    /** The next server in the list */
1404
    server_rec *next;
1405
1406
    /* Log files --- note that transfer log is now in the modules... */
1407
1408
    /** The name of the error log */
1409
    char *error_fname;
1410
    /** A file descriptor that references the error log */
1411
    apr_file_t *error_log;
1412
    /** The log level configuration */
1413
    struct ap_logconf log;
1414
    /** External error log writer provider */
1415
    struct ap_errorlog_provider *errorlog_provider;
1416
    /** Handle to be passed to external log provider's logging method */
1417
    void *errorlog_provider_handle;
1418
1419
    /* Module-specific configuration for server, and defaults... */
1420
1421
    /** Config vector containing pointers to modules' per-server config
1422
     *  structures. */
1423
    struct ap_conf_vector_t *module_config;
1424
    /** MIME type info, etc., before we start checking per-directory info */
1425
    struct ap_conf_vector_t *lookup_defaults;
1426
1427
    /** The path to the config file that the server was defined in */
1428
    const char *defn_name;
1429
    /** The line of the config file that the server was defined on */
1430
    unsigned defn_line_number;
1431
    /** true if this is the virtual server */
1432
    char is_virtual;
1433
1434
1435
    /* Information for redirects */
1436
1437
    /** for redirects, etc. */
1438
    apr_port_t port;
1439
    /** The server request scheme for redirect responses */
1440
    const char *server_scheme;
1441
1442
    /* Contact information */
1443
1444
    /** The admin's contact information */
1445
    char *server_admin;
1446
    /** The server hostname */
1447
    char *server_hostname;
1448
1449
    /* Transaction handling */
1450
1451
    /** I haven't got a clue */
1452
    server_addr_rec *addrs;
1453
    /** Timeout, as an apr interval, before we give up */
1454
    apr_interval_time_t timeout;
1455
    /** The apr interval we will wait for another request */
1456
    apr_interval_time_t keep_alive_timeout;
1457
    /** Maximum requests per connection */
1458
    int keep_alive_max;
1459
    /** Use persistent connections? */
1460
    int keep_alive;
1461
1462
    /** Normal names for ServerAlias servers */
1463
    apr_array_header_t *names;
1464
    /** Wildcarded names for ServerAlias servers */
1465
    apr_array_header_t *wild_names;
1466
1467
    /** Pathname for ServerPath */
1468
    const char *path;
1469
    /** Length of path */
1470
    int pathlen;
1471
1472
    /** limit on size of the HTTP request line    */
1473
    int limit_req_line;
1474
    /** limit on size of any request header field */
1475
    int limit_req_fieldsize;
1476
    /** limit on number of request header fields  */
1477
    int limit_req_fields;
1478
1479
    /** Opaque storage location */
1480
    void *context;
1481
1482
    /** Whether the keepalive timeout is explicit (1) or
1483
     *  inherited (0) from the base server (either first
1484
     *  server on the same IP:port or main server) */
1485
    unsigned int keep_alive_timeout_set:1;
1486
};
1487
1488
/**
1489
 * @struct ap_sload_t
1490
 * @brief  A structure to hold server load params
1491
 */
1492
typedef struct ap_sload_t ap_sload_t;
1493
struct ap_sload_t {
1494
    /* percentage of process/threads ready/idle (0->100)*/
1495
    int idle;
1496
    /* percentage of process/threads busy (0->100) */
1497
    int busy;
1498
    /* total bytes served */
1499
    apr_off_t bytes_served;
1500
    /* total access count */
1501
    unsigned long access_count;
1502
};
1503
1504
/**
1505
 * @struct ap_loadavg_t
1506
 * @brief  A structure to hold various server loadavg
1507
 */
1508
typedef struct ap_loadavg_t ap_loadavg_t;
1509
struct ap_loadavg_t {
1510
    /* current loadavg, ala getloadavg() */
1511
    float loadavg;
1512
    /* 5 min loadavg */
1513
    float loadavg5;
1514
    /* 15 min loadavg */
1515
    float loadavg15;
1516
};
1517
1518
/**
1519
 * Get the context_document_root for a request. This is a generalization of
1520
 * the document root, which is too limited in the presence of mappers like
1521
 * mod_userdir and mod_alias. The context_document_root is the directory
1522
 * on disk that maps to the context_prefix URI prefix.
1523
 * @param r The request
1524
 * @note For resources that do not map to the file system or for very complex
1525
 * mappings, this information may still be wrong.
1526
 */
1527
AP_DECLARE(const char *) ap_context_document_root(request_rec *r);
1528
1529
/**
1530
 * Get the context_prefix for a request. The context_prefix URI prefix
1531
 * maps to the context_document_root on disk.
1532
 * @param r The request
1533
 */
1534
AP_DECLARE(const char *) ap_context_prefix(request_rec *r);
1535
1536
/** Set context_prefix and context_document_root for a request.
1537
 * @param r The request
1538
 * @param prefix the URI prefix, without trailing slash
1539
 * @param document_root the corresponding directory on disk, without trailing
1540
 * slash
1541
 * @note If one of prefix of document_root is NULL, the corrsponding
1542
 * property will not be changed.
1543
 */
1544
AP_DECLARE(void) ap_set_context_info(request_rec *r, const char *prefix,
1545
                                     const char *document_root);
1546
1547
/** Set per-request document root. This is for mass virtual hosting modules
1548
 * that want to provide the correct DOCUMENT_ROOT value to scripts.
1549
 * @param r The request
1550
 * @param document_root the document root for the request.
1551
 */
1552
AP_DECLARE(void) ap_set_document_root(request_rec *r, const char *document_root);
1553
1554
/**
1555
 * Examine a field value (such as a media-/content-type) string and return
1556
 * it sans any parameters; e.g., strip off any ';charset=foo' and the like.
1557
 * @param p Pool to allocate memory from
1558
 * @param intype The field to examine
1559
 * @return A copy of the field minus any parameters
1560
 */
1561
AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype);
1562
1563
/**
1564
 * Convert a time from an integer into a string in a specified format
1565
 * @param p The pool to allocate memory from
1566
 * @param t The time to convert
1567
 * @param fmt The format to use for the conversion
1568
 * @param gmt Convert the time for GMT?
1569
 * @return The string that represents the specified time
1570
 */
1571
AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt);
1572
1573
/* String handling. The *_nc variants allow you to use non-const char **s as
1574
   arguments (unfortunately C won't automatically convert a char ** to a const
1575
   char **) */
1576
1577
/**
1578
 * Get the characters until the first occurrence of a specified character
1579
 * @param p The pool to allocate memory from
1580
 * @param line The string to get the characters from
1581
 * @param stop The character to stop at
1582
 * @return A copy of the characters up to the first stop character
1583
 */
1584
AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop);
1585
1586
/**
1587
 * Get the characters until the first occurrence of a specified character
1588
 * @param p The pool to allocate memory from
1589
 * @param line The string to get the characters from
1590
 * @param stop The character to stop at
1591
 * @return A copy of the characters up to the first stop character
1592
 * @note This is the same as ap_getword(), except it doesn't use const char **.
1593
 */
1594
AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop);
1595
1596
/**
1597
 * Get the first word from a given string.  A word is defined as all characters
1598
 * up to the first whitespace.
1599
 * @param p The pool to allocate memory from
1600
 * @param line The string to traverse
1601
 * @return The first word in the line
1602
 */
1603
AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line);
1604
1605
/**
1606
 * Get the first word from a given string.  A word is defined as all characters
1607
 * up to the first whitespace.
1608
 * @param p The pool to allocate memory from
1609
 * @param line The string to traverse
1610
 * @return The first word in the line
1611
 * @note The same as ap_getword_white(), except it doesn't use const char**
1612
 */
1613
AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line);
1614
1615
/**
1616
 * Get all characters from the first occurrence of @a stop to the first "\0"
1617
 * @param p The pool to allocate memory from
1618
 * @param line The line to traverse
1619
 * @param stop The character to start at
1620
 * @return A copy of all characters after the first occurrence of the specified
1621
 *         character
1622
 */
1623
AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line,
1624
                                    char stop);
1625
1626
/**
1627
 * Get all characters from the first occurrence of @a stop to the first "\0"
1628
 * @param p The pool to allocate memory from
1629
 * @param line The line to traverse
1630
 * @param stop The character to start at
1631
 * @return A copy of all characters after the first occurrence of the specified
1632
 *         character
1633
 * @note The same as ap_getword_nulls(), except it doesn't use const char **.
1634
 */
1635
AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop);
1636
1637
/**
1638
 * Get the second word in the string paying attention to quoting
1639
 * @param p The pool to allocate from
1640
 * @param line The line to traverse
1641
 * @return A copy of the string
1642
 */
1643
AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line);
1644
1645
/**
1646
 * Get the second word in the string paying attention to quoting
1647
 * @param p The pool to allocate from
1648
 * @param line The line to traverse
1649
 * @return A copy of the string
1650
 * @note The same as ap_getword_conf(), except it doesn't use const char **.
1651
 */
1652
AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line);
1653
1654
/**
1655
 * Get the second word in the string paying attention to quoting,
1656
 * with {...} supported as well as "..." and '...'
1657
 * @param p The pool to allocate from
1658
 * @param line The line to traverse
1659
 * @return A copy of the string
1660
 */
1661
AP_DECLARE(char *) ap_getword_conf2(apr_pool_t *p, const char **line);
1662
1663
/**
1664
 * Get the second word in the string paying attention to quoting,
1665
 * with {...} supported as well as "..." and '...'
1666
 * @param p The pool to allocate from
1667
 * @param line The line to traverse
1668
 * @return A copy of the string
1669
 * @note The same as ap_getword_conf2(), except it doesn't use const char **.
1670
 */
1671
AP_DECLARE(char *) ap_getword_conf2_nc(apr_pool_t *p, char **line);
1672
1673
/**
1674
 * Check a string for any config define or environment variable construct
1675
 * and replace each of them by the value of that variable, if it exists.
1676
 * The default syntax of the constructs is ${ENV} but can be changed by
1677
 * setting the define::* config defines. If the variable does not exist,
1678
 * leave the ${ENV} construct alone but print a warning.
1679
 * @param p The pool to allocate from
1680
 * @param word The string to check
1681
 * @return The string with the replaced environment variables
1682
 */
1683
AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word);
1684
1685
/**
1686
 * Size an HTTP header field list item, as separated by a comma.
1687
 * @param field The field to size
1688
 * @param len The length of the field
1689
 * @return The return value is a pointer to the beginning of the non-empty
1690
 * list item within the original string (or NULL if there is none) and the
1691
 * address of field is shifted to the next non-comma, non-whitespace
1692
 * character.  len is the length of the item excluding any beginning whitespace.
1693
 */
1694
AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len);
1695
1696
/**
1697
 * Retrieve an HTTP header field list item, as separated by a comma,
1698
 * while stripping insignificant whitespace and lowercasing anything not in
1699
 * a quoted string or comment.
1700
 * @param p The pool to allocate from
1701
 * @param field The field to retrieve
1702
 * @return The return value is a new string containing the converted list
1703
 *         item (or NULL if none) and the address pointed to by field is
1704
 *         shifted to the next non-comma, non-whitespace.
1705
 */
1706
AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field);
1707
1708
/**
1709
 * Find an item in canonical form (lowercase, no extra spaces) within
1710
 * an HTTP field value list.
1711
 * @param p The pool to allocate from
1712
 * @param line The field value list to search
1713
 * @param tok The token to search for
1714
 * @return 1 if found, 0 if not found.
1715
 */
1716
AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok);
1717
1718
/**
1719
 * Do a weak ETag comparison within an HTTP field value list.
1720
 * @param p The pool to allocate from
1721
 * @param line The field value list to search
1722
 * @param tok The token to search for
1723
 * @return 1 if found, 0 if not found.
1724
 */
1725
AP_DECLARE(int) ap_find_etag_weak(apr_pool_t *p, const char *line, const char *tok);
1726
1727
/**
1728
 * Do a strong ETag comparison within an HTTP field value list.
1729
 * @param p The pool to allocate from
1730
 * @param line The field value list to search
1731
 * @param tok The token to search for
1732
 * @return 1 if found, 0 if not found.
1733
 */
1734
AP_DECLARE(int) ap_find_etag_strong(apr_pool_t *p, const char *line, const char *tok);
1735
1736
/* Scan a string for field content chars, as defined by RFC7230 section 3.2
1737
 * including VCHAR/obs-text, as well as HT and SP
1738
 * @param ptr The string to scan
1739
 * @return A pointer to the first (non-HT) ASCII ctrl character.
1740
 * @note lws and trailing whitespace are scanned, the caller is responsible
1741
 * for trimming leading and trailing whitespace
1742
 */
1743
AP_DECLARE(const char *) ap_scan_http_field_content(const char *ptr);
1744
1745
/* Scan a string for token characters, as defined by RFC7230 section 3.2.6 
1746
 * @param ptr The string to scan
1747
 * @return A pointer to the first non-token character.
1748
 */
1749
AP_DECLARE(const char *) ap_scan_http_token(const char *ptr);
1750
1751
/* Scan a string for visible ASCII (0x21-0x7E) or obstext (0x80+)
1752
 * and return a pointer to the first SP/CTL/NUL character encountered.
1753
 * @param ptr The string to scan
1754
 * @return A pointer to the first SP/CTL character.
1755
 */
1756
AP_DECLARE(const char *) ap_scan_vchar_obstext(const char *ptr);
1757
1758
/**
1759
 * Retrieve an array of tokens in the format "1#token" defined in RFC2616. Only
1760
 * accepts ',' as a delimiter, does not accept quoted strings, and errors on
1761
 * any separator.
1762
 * @param p The pool to allocate from
1763
 * @param tok The line to read tokens from
1764
 * @param tokens Pointer to an array of tokens. If not NULL, must be an array
1765
 *    of char*, otherwise it will be allocated on @a p when a token is found
1766
 * @param skip_invalid If true, when an invalid separator is encountered, it
1767
 *    will be ignored.
1768
 * @return NULL on success, an error string otherwise.
1769
 * @remark *tokens may be NULL on output if NULL in input and no token is found
1770
 */
1771
AP_DECLARE(const char *) ap_parse_token_list_strict(apr_pool_t *p, const char *tok,
1772
                                                    apr_array_header_t **tokens,
1773
                                                    int skip_invalid);
1774
1775
/**
1776
 * Retrieve a token, spacing over it and adjusting the pointer to
1777
 * the first non-white byte afterwards.  Note that these tokens
1778
 * are delimited by semis and commas and can also be delimited
1779
 * by whitespace at the caller's option.
1780
 * @param p The pool to allocate from
1781
 * @param accept_line The line to retrieve the token from (adjusted afterwards)
1782
 * @param accept_white Is it delimited by whitespace
1783
 * @return the token
1784
 */
1785
AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white);
1786
1787
/**
1788
 * Find http tokens, see the definition of token from RFC2068
1789
 * @param p The pool to allocate from
1790
 * @param line The line to find the token
1791
 * @param tok The token to find
1792
 * @return 1 if the token is found, 0 otherwise
1793
 */
1794
AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok);
1795
1796
/**
1797
 * find http tokens from the end of the line
1798
 * @param p The pool to allocate from
1799
 * @param line The line to find the token
1800
 * @param tok The token to find
1801
 * @return 1 if the token is found, 0 otherwise
1802
 */
1803
AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok);
1804
1805
/**
1806
 * Check for an Absolute URI syntax
1807
 * @param u The string to check
1808
 * @return 1 if URI, 0 otherwise
1809
 */
1810
AP_DECLARE(int) ap_is_url(const char *u);
1811
1812
/**
1813
 * Unescape a string
1814
 * @param url The string to unescape
1815
 * @return 0 on success, non-zero otherwise
1816
 */
1817
AP_DECLARE(int) ap_unescape_all(char *url);
1818
1819
/**
1820
 * Unescape a URL
1821
 * @param url The url to unescape
1822
 * @return 0 on success, non-zero otherwise
1823
 * @deprecated Replaced by apr_unescape_url() in APR
1824
 */
1825
AP_DECLARE(int) ap_unescape_url(char *url);
1826
1827
/**
1828
 * Unescape a URL, but leaving %2f (slashes) escaped
1829
 * @param url The url to unescape
1830
 * @param decode_slashes Whether or not slashes should be decoded
1831
 * @return 0 on success, non-zero otherwise
1832
 * @deprecated Replaced by apr_unescape_url() in APR
1833
 */
1834
AP_DECLARE(int) ap_unescape_url_keep2f(char *url, int decode_slashes);
1835
1836
0
#define AP_UNESCAPE_URL_KEEP_UNRESERVED (1u << 0)
1837
0
#define AP_UNESCAPE_URL_FORBID_SLASHES  (1u << 1)
1838
0
#define AP_UNESCAPE_URL_KEEP_SLASHES    (1u << 2)
1839
1840
/**
1841
 * Unescape a URL, with options
1842
 * @param url The url to unescape
1843
 * @param flags Bitmask of AP_UNESCAPE_URL_* flags
1844
 * @return 0 on success, non-zero otherwise
1845
 */
1846
AP_DECLARE(int) ap_unescape_url_ex(char *url, unsigned int flags);
1847
1848
/**
1849
 * Unescape an application/x-www-form-urlencoded string
1850
 * @param query The query to unescape
1851
 * @return 0 on success, non-zero otherwise
1852
 * @deprecated Replaced by apr_unescape_url() in APR
1853
 */
1854
AP_DECLARE(int) ap_unescape_urlencoded(char *query);
1855
1856
/**
1857
 * Convert all double slashes to single slashes, except where significant
1858
 * to the filesystem on the current platform.
1859
 * @param name The string to convert, assumed to be a filesystem path
1860
 */
1861
AP_DECLARE(void) ap_no2slash(char *name)
1862
                 AP_FN_ATTR_NONNULL_ALL;
1863
/**
1864
 * Convert all double slashes to single slashes, except where significant
1865
 * to the filesystem on the current platform.
1866
 * @param name The string to convert
1867
 * @param is_fs_path if set to 0, the significance of any double-slashes is 
1868
 *        ignored.
1869
 */
1870
AP_DECLARE(void) ap_no2slash_ex(char *name, int is_fs_path)
1871
                 AP_FN_ATTR_NONNULL_ALL;
1872
1873
0
#define AP_NORMALIZE_ALLOW_RELATIVE     (1u <<  0)
1874
0
#define AP_NORMALIZE_NOT_ABOVE_ROOT     (1u <<  1)
1875
0
#define AP_NORMALIZE_DECODE_UNRESERVED  (1u <<  2)
1876
0
#define AP_NORMALIZE_MERGE_SLASHES      (1u <<  3)
1877
#define AP_NORMALIZE_DROP_PARAMETERS    (0) /* deprecated */
1878
1879
/**
1880
 * Remove all ////, /./ and /xx/../ substrings from a path, and more
1881
 * depending on passed in flags.
1882
 * @param path The path to normalize
1883
 * @param flags bitmask of AP_NORMALIZE_* flags
1884
 * @return non-zero on success
1885
 */
1886
AP_DECLARE(int) ap_normalize_path(char *path, unsigned int flags)
1887
                AP_FN_ATTR_NONNULL((1));
1888
1889
/**
1890
 * Remove all ./ and xx/../ substrings from a file name. Also remove
1891
 * any leading ../ or /../ substrings.
1892
 * @param name the file name to parse
1893
 */
1894
AP_DECLARE(void) ap_getparents(char *name)
1895
                 AP_FN_ATTR_NONNULL_ALL;
1896
1897
/**
1898
 * Escape a path segment, as defined in RFC 1808
1899
 * @param p The pool to allocate from
1900
 * @param s The path to convert
1901
 * @return The converted URL
1902
 * @deprecated Replaced by apr_pescape_path_segment() in APR
1903
 */
1904
AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s)
1905
                   AP_FN_ATTR_NONNULL_ALL;
1906
1907
/**
1908
 * Escape a path segment, as defined in RFC 1808, to a preallocated buffer.
1909
 * @param c The preallocated buffer to write to
1910
 * @param s The path to convert
1911
 * @return The converted URL (c)
1912
 * @deprecated Replaced by apr_escape_path_segment() in APR
1913
 */
1914
AP_DECLARE(char *) ap_escape_path_segment_buffer(char *c, const char *s)
1915
                   AP_FN_ATTR_NONNULL_ALL;
1916
1917
/**
1918
 * convert an OS path to a URL in an OS dependent way.
1919
 * @param p The pool to allocate from
1920
 * @param path The path to convert
1921
 * @param partial if set, assume that the path will be appended to something
1922
 *        with a '/' in it (and thus does not prefix "./").
1923
 * @return The converted URL, with one byte of extra space after the NUL
1924
 *         to allow the caller to add a trailing '/'. 
1925
 * @deprecated Replaced by apr_pescape_path() in APR
1926
 */
1927
AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial)
1928
                   AP_FN_ATTR_NONNULL_ALL;
1929
1930
/** @see ap_os_escape_path */
1931
0
#define ap_escape_uri(ppool,path) ap_os_escape_path(ppool,path,1)
1932
1933
/**
1934
 * Escape a string as application/x-www-form-urlencoded
1935
 * @param p The pool to allocate from
1936
 * @param s The path to convert
1937
 * @return The converted URL
1938
 * @deprecated Replaced by apr_pescape_url() in APR
1939
 */
1940
AP_DECLARE(char *) ap_escape_urlencoded(apr_pool_t *p, const char *s)
1941
                   AP_FN_ATTR_NONNULL_ALL;
1942
1943
/**
1944
 * Escape a string as application/x-www-form-urlencoded, to a preallocated buffer
1945
 * @param c The preallocated buffer to write to
1946
 * @param s The path to convert
1947
 * @return The converted URL (c)
1948
 * @deprecated Replaced by apr_escape_url() in APR
1949
 */
1950
AP_DECLARE(char *) ap_escape_urlencoded_buffer(char *c, const char *s)
1951
                   AP_FN_ATTR_NONNULL_ALL;
1952
1953
/**
1954
 * Escape an html string
1955
 * @param p The pool to allocate from
1956
 * @param s The html to escape
1957
 * @return The escaped string
1958
 * @deprecated Replaced by apr_pescape_entity() in APR
1959
 */
1960
0
#define ap_escape_html(p,s) ap_escape_html2(p,s,0)
1961
/**
1962
 * Escape an html string
1963
 * @param p The pool to allocate from
1964
 * @param s The html to escape
1965
 * @param toasc Whether to escape all non-ASCII chars to \&\#nnn;
1966
 * @return The escaped string
1967
 * @deprecated Replaced by apr_pescape_entity() in APR
1968
 */
1969
AP_DECLARE(char *) ap_escape_html2(apr_pool_t *p, const char *s, int toasc)
1970
                   AP_FN_ATTR_NONNULL_ALL;
1971
1972
/**
1973
 * Escape a string for logging
1974
 * @param p The pool to allocate from
1975
 * @param str The string to escape
1976
 * @return The escaped string
1977
 * @deprecated Replaced by apr_pescape_echo() in APR
1978
 */
1979
AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str)
1980
                   AP_FN_ATTR_NONNULL((1));
1981
1982
/**
1983
 * Escape a string for logging into the error log (without a pool)
1984
 * @param dest The buffer to write to
1985
 * @param source The string to escape
1986
 * @param buflen The buffer size for the escaped string (including "\0")
1987
 * @return The len of the escaped string (always < maxlen)
1988
 * @deprecated Replaced by apr_escape_echo() in APR
1989
 */
1990
AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source,
1991
                                               apr_size_t buflen)
1992
                       AP_FN_ATTR_NONNULL((1));
1993
1994
/**
1995
 * Construct a full hostname
1996
 * @param p The pool to allocate from
1997
 * @param hostname The hostname of the server
1998
 * @param port The port the server is running on
1999
 * @param r The current request
2000
 * @return The server's hostname
2001
 */
2002
AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname,
2003
                                    apr_port_t port, const request_rec *r)
2004
                   AP_FN_ATTR_NONNULL((1,4));
2005
2006
/**
2007
 * Escape a shell command
2008
 * @param p The pool to allocate from
2009
 * @param s The command to escape
2010
 * @return The escaped shell command
2011
 * @deprecated Replaced with apr_escape_shell() in APR
2012
 */
2013
AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s)
2014
                   AP_FN_ATTR_NONNULL_ALL;
2015
2016
/**
2017
 * Count the number of directories in a path
2018
 * @param path The path to count
2019
 * @return The number of directories
2020
 */
2021
AP_DECLARE(int) ap_count_dirs(const char *path)
2022
                AP_FN_ATTR_NONNULL_ALL;
2023
2024
/**
2025
 * Copy at most @a n leading directories of @a s into @a d. @a d
2026
 * should be at least as large as @a s plus 1 extra byte
2027
 *
2028
 * @param d The location to copy to
2029
 * @param s The location to copy from
2030
 * @param n The number of directories to copy
2031
 * @return value is the ever useful pointer to the trailing "\0" of d
2032
 * @note on platforms with drive letters, n = 0 returns the "/" root,
2033
 * whereas n = 1 returns the "d:/" root.  On all other platforms, n = 0
2034
 * returns the empty string.  */
2035
AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n)
2036
                   AP_FN_ATTR_NONNULL_ALL;
2037
2038
/**
2039
 * Return the parent directory name (including trailing /) of the file
2040
 * @a s
2041
 * @param p The pool to allocate from
2042
 * @param s The file to get the parent of
2043
 * @return A copy of the file's parent directory
2044
 */
2045
AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s)
2046
                   AP_FN_ATTR_NONNULL_ALL;
2047
2048
/**
2049
 * Given a directory and filename, create a single path from them.  This
2050
 * function is smart enough to ensure that there is a single '/' between the
2051
 * directory and file names
2052
 * @param a The pool to allocate from
2053
 * @param dir The directory name
2054
 * @param f The filename
2055
 * @return A copy of the full path, with one byte of extra space after the NUL
2056
 *         to allow the caller to add a trailing '/'.
2057
 * @note Never consider using this function if you are dealing with filesystem
2058
 * names that need to remain canonical, unless you are merging an apr_dir_read
2059
 * path and returned filename.  Otherwise, the result is not canonical.
2060
 */
2061
AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f)
2062
                   AP_FN_ATTR_NONNULL_ALL;
2063
2064
/**
2065
 * Test if the given path has an absolute path.
2066
 * @param p The pool to allocate from
2067
 * @param dir The directory name
2068
 * @note The converse is not necessarily true, some OS's (Win32/OS2/Netware) have
2069
 * multiple forms of absolute paths.  This only reports if the path is absolute
2070
 * in a canonical sense.
2071
 */
2072
AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir)
2073
                AP_FN_ATTR_NONNULL_ALL;
2074
2075
/**
2076
 * Does the provided string contain wildcard characters?  This is useful
2077
 * for determining if the string should be passed to strcmp_match or to strcmp.
2078
 * The only wildcard characters recognized are '?' and '*'
2079
 * @param str The string to check
2080
 * @return 1 if the string has wildcards, 0 otherwise
2081
 */
2082
AP_DECLARE(int) ap_is_matchexp(const char *str)
2083
                AP_FN_ATTR_NONNULL_ALL;
2084
2085
/**
2086
 * Determine if a string matches a pattern containing the wildcards '?' or '*'
2087
 * @param str The string to check
2088
 * @param expected The pattern to match against
2089
 * @return 0 if the two strings match, 1 otherwise
2090
 */
2091
AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected)
2092
                AP_FN_ATTR_NONNULL_ALL;
2093
2094
/**
2095
 * Determine if a string matches a pattern containing the wildcards '?' or '*',
2096
 * ignoring case
2097
 * @param str The string to check
2098
 * @param expected The pattern to match against
2099
 * @return 0 if the two strings match, 1 otherwise
2100
 */
2101
AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected)
2102
                AP_FN_ATTR_NONNULL_ALL;
2103
2104
/**
2105
 * Find the first occurrence of the substring s2 in s1, regardless of case
2106
 * @param s1 The string to search
2107
 * @param s2 The substring to search for
2108
 * @return A pointer to the beginning of the substring
2109
 * @remark See apr_strmatch() for a faster alternative
2110
 */
2111
AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2)
2112
                   AP_FN_ATTR_NONNULL_ALL;
2113
2114
/**
2115
 * Return a pointer to the location inside of bigstring immediately after prefix
2116
 * @param bigstring The input string
2117
 * @param prefix The prefix to strip away
2118
 * @return A pointer relative to bigstring after prefix
2119
 */
2120
AP_DECLARE(const char *) ap_stripprefix(const char *bigstring,
2121
                                        const char *prefix)
2122
                         AP_FN_ATTR_NONNULL_ALL;
2123
2124
/**
2125
 * Decode a base64 encoded string into memory allocated from a pool
2126
 * @param p The pool to allocate from
2127
 * @param bufcoded The encoded string
2128
 * @return The decoded string
2129
 * @deprecated Replaced by apr_pbase64_decode() in APR.
2130
 */
2131
AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded);
2132
2133
/**
2134
 * Decode a base64 encoded string into memory allocated from a pool, while
2135
 * ensuring that the input string is in fact valid base64.
2136
 *
2137
 * Unlike ap_pbase64decode(), this function allows encoded NULLs in the input to
2138
 * be retained by the caller, by inspecting the len argument after the call
2139
 * instead of using strlen(). A NULL terminator is still appended to the buffer
2140
 * to facilitate string use (it is not included in len).
2141
 *
2142
 * @param p The pool to allocate from
2143
 * @param encoded The encoded string
2144
 * @param decoded On success, set to the decoded buffer, which is allocated from
2145
 *                p
2146
 * @param len On success, set to the length of the decoded buffer (not including
2147
 *            the terminating NULL byte)
2148
 * @return APR_SUCCESS if the decoding was successful
2149
 */
2150
AP_DECLARE(apr_status_t) ap_pbase64decode_strict(apr_pool_t *p,
2151
                                                 const char *encoded,
2152
                                                 char **decoded,
2153
                                                 apr_size_t *len);
2154
2155
/**
2156
 * Encode a string into memory allocated from a pool in base 64 format
2157
 * @param p The pool to allocate from
2158
 * @param string The plaintext string
2159
 * @return The encoded string
2160
 * @deprecated Replaced by apr_pbase64_encode() in APR.
2161
 */
2162
AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string);
2163
2164
/**
2165
 * Compile a regular expression to be used later. The regex is freed when
2166
 * the pool is destroyed.
2167
 * @param p The pool to allocate from
2168
 * @param pattern the regular expression to compile
2169
 * @param cflags The bitwise or of one or more of the following:
2170
 *   @li REG_EXTENDED - Use POSIX extended Regular Expressions
2171
 *   @li REG_ICASE    - Ignore case
2172
 *   @li REG_NOSUB    - Support for substring addressing of matches
2173
 *       not required
2174
 *   @li REG_NEWLINE  - Match-any-character operators don't match new-line
2175
 * @return The compiled regular expression
2176
 */
2177
AP_DECLARE(ap_regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern,
2178
                                     int cflags);
2179
2180
/**
2181
 * Free the memory associated with a compiled regular expression
2182
 * @param p The pool the regex was allocated from
2183
 * @param reg The regular expression to free
2184
 * @note This function is only necessary if the regex should be cleaned
2185
 * up before the pool
2186
 */
2187
AP_DECLARE(void) ap_pregfree(apr_pool_t *p, ap_regex_t *reg);
2188
2189
/**
2190
 * After performing a successful regex match, you may use this function to
2191
 * perform a series of string substitutions based on subexpressions that were
2192
 * matched during the call to ap_regexec. This function is limited to
2193
 * result strings of 64K. Consider using ap_pregsub_ex() instead.
2194
 * @param p The pool to allocate from
2195
 * @param input An arbitrary string containing $1 through $9.  These are
2196
 *              replaced with the corresponding matched sub-expressions
2197
 * @param source The string that was originally matched to the regex
2198
 * @param nmatch the nmatch returned from ap_pregex
2199
 * @param pmatch the pmatch array returned from ap_pregex
2200
 * @return The substituted string, or NULL on error
2201
 */
2202
AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input,
2203
                              const char *source, apr_size_t nmatch,
2204
                              ap_regmatch_t pmatch[]);
2205
2206
/**
2207
 * After performing a successful regex match, you may use this function to
2208
 * perform a series of string substitutions based on subexpressions that were
2209
 * matched during the call to ap_regexec
2210
 * @param p The pool to allocate from
2211
 * @param result where to store the result, will be set to NULL on error
2212
 * @param input An arbitrary string containing $1 through $9.  These are
2213
 *              replaced with the corresponding matched sub-expressions
2214
 * @param source The string that was originally matched to the regex
2215
 * @param nmatch the nmatch returned from ap_pregex
2216
 * @param pmatch the pmatch array returned from ap_pregex
2217
 * @param maxlen the maximum string length to return, 0 for unlimited
2218
 * @return APR_SUCCESS if successful, APR_ENOMEM or other error code otherwise.
2219
 */
2220
AP_DECLARE(apr_status_t) ap_pregsub_ex(apr_pool_t *p, char **result,
2221
                                       const char *input, const char *source,
2222
                                       apr_size_t nmatch,
2223
                                       ap_regmatch_t pmatch[],
2224
                                       apr_size_t maxlen);
2225
2226
/**
2227
 * We want to downcase the type/subtype for comparison purposes
2228
 * but nothing else because ;parameter=foo values are case sensitive.
2229
 * @param s The content-type to convert to lowercase
2230
 */
2231
AP_DECLARE(void) ap_content_type_tolower(char *s);
2232
2233
/**
2234
 * convert a string to all lowercase
2235
 * @param s The string to convert to lowercase
2236
 */
2237
AP_DECLARE(void) ap_str_tolower(char *s);
2238
2239
/**
2240
 * convert a string to all uppercase
2241
 * @param s The string to convert to uppercase
2242
 */
2243
AP_DECLARE(void) ap_str_toupper(char *s);
2244
2245
/**
2246
 * Search a string from left to right for the first occurrence of a
2247
 * specific character
2248
 * @param str The string to search
2249
 * @param c The character to search for
2250
 * @return The index of the first occurrence of c in str
2251
 */
2252
AP_DECLARE(int) ap_ind(const char *str, char c);        /* Sigh... */
2253
2254
/**
2255
 * Search a string from right to left for the first occurrence of a
2256
 * specific character
2257
 * @param str The string to search
2258
 * @param c The character to search for
2259
 * @return The index of the first occurrence of c in str
2260
 */
2261
AP_DECLARE(int) ap_rind(const char *str, char c);
2262
2263
/**
2264
 * Given a string, replace any bare &quot; with \\&quot; .
2265
 * @param p The pool to allocate memory from
2266
 * @param instring The string to search for &quot;
2267
 * @return A copy of the string with escaped quotes
2268
 * @deprecated Replaced by apr_pescape_echo() in APR
2269
 */
2270
AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring);
2271
2272
/**
2273
 * Given a string, append the PID deliminated by delim.
2274
 * Usually used to create a pid-appended filepath name
2275
 * (eg: /a/b/foo -> /a/b/foo.6726). A function, and not
2276
 * a macro, to avoid unistd.h dependency
2277
 * @param p The pool to allocate memory from
2278
 * @param string The string to append the PID to
2279
 * @param delim The string to use to deliminate the string from the PID
2280
 * @return A copy of the string with the PID appended
2281
 */
2282
AP_DECLARE(char *) ap_append_pid(apr_pool_t *p, const char *string,
2283
                                 const char *delim);
2284
2285
/**
2286
 * Parse a length string with decimal characters only, no leading sign nor
2287
 * trailing character, like Content-Length or (Content-)Range headers.
2288
 * @param len The parsed length (apr_off_t)
2289
 * @param str The string to parse
2290
 * @return 1 (success), 0 (failure)
2291
 */
2292
AP_DECLARE(int) ap_parse_strict_length(apr_off_t *len, const char *str);
2293
2294
/**
2295
 * Parse a given timeout parameter string into an apr_interval_time_t value.
2296
 * The unit of the time interval is given as postfix string to the numeric
2297
 * string. Currently the following units are understood (case insensitive):
2298
 *
2299
 * ms    : milliseconds
2300
 * s     : seconds
2301
 * mi[n] : minutes
2302
 * h     : hours
2303
 *
2304
 * If no unit is contained in the given timeout parameter the default_time_unit
2305
 * will be used instead.
2306
 * @param timeout_parameter The string containing the timeout parameter.
2307
 * @param timeout The timeout value to be returned.
2308
 * @param default_time_unit The default time unit to use if none is specified
2309
 * in timeout_parameter.
2310
 * @return Status value indicating whether the parsing was successful or not.
2311
 */
2312
AP_DECLARE(apr_status_t) ap_timeout_parameter_parse(
2313
                                               const char *timeout_parameter,
2314
                                               apr_interval_time_t *timeout,
2315
                                               const char *default_time_unit);
2316
2317
/**
2318
 * Determine if a request has a request body or not.
2319
 *
2320
 * @param r the request_rec of the request
2321
 * @return truth value
2322
 */
2323
AP_DECLARE(int) ap_request_has_body(request_rec *r);
2324
2325
/** Request taint flags.  Only .htaccess defined. */
2326
0
#define AP_TAINT_HTACCESS 0x1
2327
/**
2328
 * Check whether a request is tainted by potentially-untrusted sources.
2329
 *
2330
 * @param r     the request
2331
 * @param flags Taint flags to check
2332
 * @return truth value
2333
 */
2334
AP_DECLARE(int) ap_request_tainted(request_rec *r, int flags);
2335
2336
/**
2337
 * Cleanup a string (mainly to be filesystem safe)
2338
 * We only allow '_' and alphanumeric chars. Non-printable
2339
 * map to 'x' and all others map to '_'
2340
 *
2341
 * @param  p pool to use to allocate dest
2342
 * @param  src string to clean up
2343
 * @param  dest cleaned up, allocated string
2344
 * @return Status value indicating whether the cleaning was successful or not.
2345
 */
2346
AP_DECLARE(apr_status_t) ap_pstr2_alnum(apr_pool_t *p, const char *src,
2347
                                        const char **dest);
2348
2349
/**
2350
 * Cleanup a string (mainly to be filesystem safe)
2351
 * We only allow '_' and alphanumeric chars. Non-printable
2352
 * map to 'x' and all others map to '_'
2353
 *
2354
 * @param  src string to clean up
2355
 * @param  dest cleaned up, pre-allocated string
2356
 * @return Status value indicating whether the cleaning was successful or not.
2357
 */
2358
AP_DECLARE(apr_status_t) ap_str2_alnum(const char *src, char *dest);
2359
2360
/**
2361
 * Structure to store the contents of an HTTP form of the type
2362
 * application/x-www-form-urlencoded.
2363
 *
2364
 * Currently it contains the name as a char* of maximum length
2365
 * HUGE_STRING_LEN, and a value in the form of a bucket brigade
2366
 * of arbitrary length.
2367
 */
2368
typedef struct {
2369
    const char *name;
2370
    apr_bucket_brigade *value;
2371
} ap_form_pair_t;
2372
2373
/**
2374
 * Read the body and parse any form found, which must be of the
2375
 * type application/x-www-form-urlencoded.
2376
 * @param r request containing POSTed form data
2377
 * @param f filter
2378
 * @param ptr returned array of ap_form_pair_t
2379
 * @param num max num of params or -1 for unlimited
2380
 * @param size max size allowed for parsed data
2381
 * @return OK or HTTP error
2382
 */
2383
AP_DECLARE(int) ap_parse_form_data(request_rec *r, struct ap_filter_t *f,
2384
                                   apr_array_header_t **ptr,
2385
                                   apr_size_t num, apr_size_t size);
2386
2387
/* Misc system hackery */
2388
/**
2389
 * Given the name of an object in the file system determine if it is a directory
2390
 * @param p The pool to allocate from
2391
 * @param name The name of the object to check
2392
 * @return 1 if it is a directory, 0 otherwise
2393
 */
2394
AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name);
2395
2396
/**
2397
 * Given the name of an object in the file system determine if it is a directory - this version is symlink aware
2398
 * @param p The pool to allocate from
2399
 * @param name The name of the object to check
2400
 * @return 1 if it is a directory, 0 otherwise
2401
 */
2402
AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name);
2403
2404
#ifdef _OSD_POSIX
2405
extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process);
2406
#endif /* _OSD_POSIX */
2407
2408
/**
2409
 * Determine the local host name for the current machine
2410
 * @param p The pool to allocate from
2411
 * @return A copy of the local host name
2412
 */
2413
char *ap_get_local_host(apr_pool_t *p);
2414
2415
/**
2416
 * Log an assertion to the error log
2417
 * @param szExp The assertion that failed
2418
 * @param szFile The file the assertion is in
2419
 * @param nLine The line the assertion is defined on
2420
 */
2421
AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine)
2422
                            __attribute__((noreturn));
2423
2424
/**
2425
 * @internal Internal Assert function
2426
 */
2427
0
#define ap_assert(exp) ((exp) ? (void)0 : ap_log_assert(#exp,__FILE__,__LINE__))
2428
2429
/**
2430
 * Redefine assert() to something more useful for an Apache...
2431
 *
2432
 * Use ap_assert() if the condition should always be checked.
2433
 * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG
2434
 * is defined.
2435
 */
2436
#ifdef AP_DEBUG
2437
#define AP_DEBUG_ASSERT(exp) ap_assert(exp)
2438
#else
2439
0
#define AP_DEBUG_ASSERT(exp) ((void)0)
2440
#endif
2441
2442
/**
2443
 * @defgroup stopsignal Flags which indicate places where the server should stop for debugging.
2444
 * @{
2445
 * A set of flags which indicate places where the server should raise(SIGSTOP).
2446
 * This is useful for debugging, because you can then attach to that process
2447
 * with gdb and continue.  This is important in cases where one_process
2448
 * debugging isn't possible.
2449
 */
2450
/** stop on a Detach */
2451
#define SIGSTOP_DETACH                  1
2452
/** stop making a child process */
2453
#define SIGSTOP_MAKE_CHILD              2
2454
/** stop spawning a child process */
2455
#define SIGSTOP_SPAWN_CHILD             4
2456
/** stop spawning a child process with a piped log */
2457
#define SIGSTOP_PIPED_LOG_SPAWN         8
2458
/** stop spawning a CGI child process */
2459
#define SIGSTOP_CGI_CHILD               16
2460
2461
/** Macro to get GDB started */
2462
#ifdef DEBUG_SIGSTOP
2463
extern int raise_sigstop_flags;
2464
#define RAISE_SIGSTOP(x)        do { \
2465
        if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\
2466
    } while (0)
2467
#else
2468
#define RAISE_SIGSTOP(x)
2469
#endif
2470
/** @} */
2471
/**
2472
 * Get HTML describing the address and (optionally) admin of the server.
2473
 * @param prefix Text which is prepended to the return value
2474
 * @param r The request_rec
2475
 * @return HTML describing the server, allocated in @a r's pool.
2476
 */
2477
AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r);
2478
2479
  /* The C library has functions that allow const to be silently dropped ...
2480
     these macros detect the drop in maintainer mode, but use the native
2481
     methods for normal builds
2482
2483
     Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs
2484
     to be included before the macros are defined or compilation will fail.
2485
  */
2486
#include <string.h>
2487
2488
AP_DECLARE(char *) ap_strchr(char *s, int c);
2489
AP_DECLARE(const char *) ap_strchr_c(const char *s, int c);
2490
AP_DECLARE(char *) ap_strrchr(char *s, int c);
2491
AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c);
2492
AP_DECLARE(char *) ap_strstr(char *s, const char *c);
2493
AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c);
2494
AP_DECLARE(void *) ap_palloc_debug(apr_pool_t *p, apr_size_t size);
2495
AP_DECLARE(void *) ap_pcalloc_debug(apr_pool_t *p, apr_size_t size);
2496
2497
#ifdef AP_DEBUG
2498
2499
#undef strchr
2500
# define strchr(s, c)  ap_strchr(s,c)
2501
#undef strrchr
2502
# define strrchr(s, c) ap_strrchr(s,c)
2503
#undef strstr
2504
# define strstr(s, c)  ap_strstr(s,c)
2505
2506
#if !defined(AP_DEBUG_NO_ALLOC_POISON) && !APR_POOL_DEBUG
2507
/*
2508
 * ap_palloc_debug initializes allocated memory to non-zero
2509
 */
2510
#define apr_palloc     ap_palloc_debug
2511
/*
2512
 * this is necessary to avoid useless double memset of memory
2513
 * with ap_palloc_debug
2514
 */
2515
#ifdef apr_pcalloc
2516
#undef apr_pcalloc
2517
#endif
2518
#define apr_pcalloc    ap_pcalloc_debug
2519
#endif
2520
2521
#else
2522
2523
/** use this instead of strchr */
2524
0
# define ap_strchr(s, c)     strchr(s, c)
2525
/** use this instead of strchr */
2526
22.9k
# define ap_strchr_c(s, c)   strchr(s, c)
2527
/** use this instead of strrchr */
2528
# define ap_strrchr(s, c)    strrchr(s, c)
2529
/** use this instead of strrchr */
2530
0
# define ap_strrchr_c(s, c)  strrchr(s, c)
2531
/** use this instead of strrstr*/
2532
0
# define ap_strstr(s, c)     strstr(s, c)
2533
/** use this instead of strrstr*/
2534
0
# define ap_strstr_c(s, c)   strstr(s, c)
2535
2536
#endif
2537
2538
/**
2539
 * Generate pseudo random bytes.
2540
 * This is a convenience interface to apr_random. It is cheaper but less
2541
 * secure than apr_generate_random_bytes().
2542
 * @param buf where to store the bytes
2543
 * @param size number of bytes to generate
2544
 * @note ap_random_insecure_bytes() is thread-safe, it uses a mutex on
2545
 *       threaded MPMs.
2546
 */
2547
AP_DECLARE(void) ap_random_insecure_bytes(void *buf, apr_size_t size);
2548
2549
/**
2550
 * Get a pseudo random number in a range.
2551
 * @param min low end of range
2552
 * @param max high end of range
2553
 * @return a number in the range
2554
 */
2555
AP_DECLARE(apr_uint32_t) ap_random_pick(apr_uint32_t min, apr_uint32_t max);
2556
2557
/**
2558
 * Abort with a error message signifying out of memory
2559
 */
2560
AP_DECLARE(void) ap_abort_on_oom(void) __attribute__((noreturn));
2561
2562
/**
2563
 * Wrapper for malloc() that calls ap_abort_on_oom() if out of memory
2564
 * @param size size of the memory block
2565
 * @return pointer to the allocated memory
2566
 * @note ap_malloc may be implemented as a macro
2567
 */
2568
AP_DECLARE(void *) ap_malloc(size_t size)
2569
                    __attribute__((malloc))
2570
                    AP_FN_ATTR_ALLOC_SIZE(1);
2571
2572
/**
2573
 * Wrapper for calloc() that calls ap_abort_on_oom() if out of memory
2574
 * @param nelem number of elements to allocate memory for
2575
 * @param size size of a single element
2576
 * @return pointer to the allocated memory
2577
 * @note ap_calloc may be implemented as a macro
2578
 */
2579
AP_DECLARE(void *) ap_calloc(size_t nelem, size_t size)
2580
                   __attribute__((malloc))
2581
                   AP_FN_ATTR_ALLOC_SIZE2(1,2);
2582
2583
/**
2584
 * Wrapper for realloc() that calls ap_abort_on_oom() if out of memory
2585
 * @param ptr pointer to the old memory block (or NULL)
2586
 * @param size new size of the memory block
2587
 * @return pointer to the reallocated memory
2588
 * @note ap_realloc may be implemented as a macro
2589
 */
2590
AP_DECLARE(void *) ap_realloc(void *ptr, size_t size)
2591
                   AP_FN_ATTR_WARN_UNUSED_RESULT
2592
                   AP_FN_ATTR_ALLOC_SIZE(2);
2593
2594
#if APR_HAS_THREADS
2595
2596
/* apr_thread_create() wrapper that handles thread pool limits and
2597
 * ap_thread_current() eventually (if not handle by APR already).
2598
 */
2599
AP_DECLARE(apr_status_t) ap_thread_create(apr_thread_t **thread, 
2600
                                          apr_threadattr_t *attr, 
2601
                                          apr_thread_start_t func, 
2602
                                          void *data, apr_pool_t *pool);
2603
2604
/* Make the main() thread ap_thread_current()-able. */
2605
AP_DECLARE(apr_status_t) ap_thread_main_create(apr_thread_t **thread,
2606
                                               apr_pool_t *pool);
2607
2608
#if APR_VERSION_AT_LEAST(1,8,0)
2609
2610
/**
2611
 * Use APR 1.8+ implementation.
2612
 */
2613
#if APR_HAS_THREAD_LOCAL && !defined(AP_NO_THREAD_LOCAL)
2614
#define AP_THREAD_LOCAL                 APR_THREAD_LOCAL
2615
#endif
2616
0
#define ap_thread_current               apr_thread_current
2617
0
#define ap_thread_current_create        apr_thread_current_create
2618
0
#define ap_thread_current_after_fork    apr_thread_current_after_fork
2619
2620
#else /* APR_VERSION_AT_LEAST(1,8,0) */
2621
2622
#if !defined(AP_NO_THREAD_LOCAL)
2623
/**
2624
 * AP_THREAD_LOCAL keyword aliases the compiler's.
2625
 */
2626
#if defined(__cplusplus) && __cplusplus >= 201103L
2627
#define AP_THREAD_LOCAL thread_local
2628
#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112 && \
2629
      (!defined(__GNUC__) || \
2630
      __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))
2631
#define AP_THREAD_LOCAL _Thread_local
2632
#elif defined(__GNUC__) /* works for clang too */
2633
#define AP_THREAD_LOCAL __thread
2634
#elif defined(WIN32) && defined(_MSC_VER)
2635
#define AP_THREAD_LOCAL __declspec(thread)
2636
#endif
2637
#endif /* !defined(AP_NO_THREAD_LOCAL) */
2638
2639
AP_DECLARE(apr_status_t) ap_thread_current_create(apr_thread_t **current,
2640
                                                  apr_threadattr_t *attr,
2641
                                                  apr_pool_t *pool);
2642
AP_DECLARE(void) ap_thread_current_after_fork(void);
2643
AP_DECLARE(apr_thread_t *) ap_thread_current(void);
2644
2645
#endif /* APR_VERSION_AT_LEAST(1,8,0) */
2646
2647
#endif /* APR_HAS_THREADS */
2648
2649
#ifdef AP_THREAD_LOCAL
2650
#define AP_HAS_THREAD_LOCAL 1
2651
#else
2652
#define AP_HAS_THREAD_LOCAL 0
2653
#endif
2654
2655
/**
2656
 * Get server load params
2657
 * @param ld struct to populate: -1 in fields means error
2658
 */
2659
AP_DECLARE(void) ap_get_sload(ap_sload_t *ld)
2660
                 AP_FN_ATTR_NONNULL_ALL;
2661
2662
/**
2663
 * Get server load averages (ala getloadavg)
2664
 * @param ld struct to populate: -1 in fields means error
2665
 */
2666
AP_DECLARE(void) ap_get_loadavg(ap_loadavg_t *ld)
2667
                 AP_FN_ATTR_NONNULL_ALL;
2668
2669
/**
2670
 * Convert binary data into a hex string
2671
 * @param src pointer to the data
2672
 * @param srclen length of the data
2673
 * @param dest pointer to buffer of length (2 * srclen + 1). The resulting
2674
 *        string will be NUL-terminated.
2675
 * @deprecated Replaced by apr_escape_hex() in APR
2676
 */
2677
AP_DECLARE(void) ap_bin2hex(const void *src, apr_size_t srclen, char *dest)
2678
                 AP_FN_ATTR_NONNULL_ALL;
2679
2680
/**
2681
 * Wrapper for @a apr_password_validate() to cache expensive calculations
2682
 * @param r the current request
2683
 * @param username username of the user
2684
 * @param passwd password string
2685
 * @param hash hash string to be passwd to @a apr_password_validate()
2686
 * @return APR_SUCCESS if passwords match, APR_EMISMATCH or error otherwise
2687
 * @note Currently, ap_password_validate() only caches the result of the
2688
 *       most recent call with the same connection as @a r.
2689
 *       In the future, it may also do rate-limiting against brute-force
2690
 *       attacks.
2691
 */
2692
AP_DECLARE(apr_status_t) ap_password_validate(request_rec *r,
2693
                                              const char *username,
2694
                                              const char *passwd,
2695
                                              const char *hash);
2696
2697
/**
2698
 * Short function to execute a command and return the first line of
2699
 * output minus \\r \\n. Useful for "obscuring" passwords via exec calls
2700
 * @param p the pool to allocate from
2701
 * @param cmd the command to execute
2702
 * @param argv the arguments to pass to the cmd
2703
 * @return ptr to characters or NULL on any error
2704
 */
2705
AP_DECLARE(char *) ap_get_exec_line(apr_pool_t *p,
2706
                                    const char *cmd,
2707
                                    const char * const *argv);
2708
2709
2710
0
#define AP_NORESTART APR_OS_START_USEERR + 1
2711
2712
/**
2713
 * Get the first index of the string in the array or -1 if not found. Start
2714
 * searching a start. 
2715
 * @param array The array the check
2716
 * @param s The string to find
2717
 * @param start Start index for search. If start is out of bounds (negative or  
2718
                equal to array length or greater), -1 will be returned.
2719
 * @return index of string in array or -1
2720
 */
2721
AP_DECLARE(int) ap_array_str_index(const apr_array_header_t *array, 
2722
                                   const char *s,
2723
                                   int start);
2724
2725
/**
2726
 * Check if the string is member of the given array by strcmp.
2727
 * @param array The array the check
2728
 * @param s The string to find
2729
 * @return !=0 iff string is member of array (via strcmp)
2730
 */
2731
AP_DECLARE(int) ap_array_str_contains(const apr_array_header_t *array, 
2732
                                      const char *s);
2733
2734
/**
2735
 * Perform a case-insensitive comparison of two strings @a str1 and @a str2,
2736
 * treating upper and lower case values of the 26 standard C/POSIX alphabetic
2737
 * characters as equivalent. Extended latin characters outside of this set
2738
 * are treated as unique octets, irrespective of the current locale.
2739
 *
2740
 * Returns in integer greater than, equal to, or less than 0,
2741
 * according to whether @a str1 is considered greater than, equal to,
2742
 * or less than @a str2.
2743
 *
2744
 * @note Same code as apr_cstr_casecmp, which arrives in APR 1.6
2745
 */
2746
AP_DECLARE(int) ap_cstr_casecmp(const char *s1, const char *s2);
2747
2748
/**
2749
 * Perform a case-insensitive comparison of two strings @a str1 and @a str2,
2750
 * treating upper and lower case values of the 26 standard C/POSIX alphabetic
2751
 * characters as equivalent. Extended latin characters outside of this set
2752
 * are treated as unique octets, irrespective of the current locale.
2753
 *
2754
 * Returns in integer greater than, equal to, or less than 0,
2755
 * according to whether @a str1 is considered greater than, equal to,
2756
 * or less than @a str2.
2757
 *
2758
 * @note Same code as apr_cstr_casecmpn, which arrives in APR 1.6
2759
 */
2760
AP_DECLARE(int) ap_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n);
2761
2762
/**
2763
 * Default flags for ap_dir_*fnmatch().
2764
 */
2765
0
#define AP_DIR_FLAG_NONE      0
2766
2767
/**
2768
 * If set, wildcards that match no files or directories will be ignored, otherwise
2769
 * an error is triggered.
2770
 */
2771
0
#define AP_DIR_FLAG_OPTIONAL  1
2772
2773
/**
2774
 * If set, and the wildcard resolves to a directory, recursively find all files
2775
 * below that directory, otherwise return the directory.
2776
 */
2777
0
#define AP_DIR_FLAG_RECURSIVE 2
2778
2779
/**
2780
 * Structure to provide the state of a directory match.
2781
 */
2782
typedef struct ap_dir_match_t ap_dir_match_t;
2783
2784
/**
2785
 * Concrete structure to provide the state of a directory match.
2786
 */
2787
struct ap_dir_match_t {
2788
    /** Pool to use for allocating the result */
2789
    apr_pool_t *p;
2790
    /** Temporary pool used for directory traversal */
2791
    apr_pool_t *ptemp;
2792
    /** Prefix for log messages */
2793
    const char *prefix;
2794
    /** Callback for each file found that matches the wildcard. Return NULL on success, an error string on error. */
2795
    const char *(*cb)(ap_dir_match_t *w, const char *fname);
2796
    /** Context for the callback */
2797
    void *ctx;
2798
    /** Flags to indicate whether optional or recursive */
2799
    int flags;
2800
    /** Recursion depth safety check */
2801
    unsigned int depth;
2802
};
2803
2804
/**
2805
 * Search for files given a non wildcard filename with non native separators.
2806
 *
2807
 * If the provided filename points at a file, the callback within ap_dir_match_t is
2808
 * triggered for that file, and this function returns the result of the callback.
2809
 *
2810
 * If the provided filename points at a directory, and recursive within ap_dir_match_t
2811
 * is true, the callback will be triggered for every file found recursively beneath
2812
 * that directory, otherwise the callback is triggered once for the directory itself.
2813
 * This function returns the result of the callback.
2814
 *
2815
 * If the provided path points to neither a file nor a directory, and optional within
2816
 * ap_dir_match_t is true, this function returns NULL. If optional within ap_dir_match_t
2817
 * is false, this function will return an error string indicating that the path does not
2818
 * exist.
2819
 *
2820
 * @param w Directory match structure containing callback and context.
2821
 * @param fname The name of the file or directory, with non native separators.
2822
 * @return NULL on success, or a string describing the error.
2823
 */
2824
AP_DECLARE(const char *)ap_dir_nofnmatch(ap_dir_match_t *w, const char *fname)
2825
        __attribute__((nonnull(1,2)));
2826
2827
/**
2828
 * Search for files given a wildcard filename with non native separators.
2829
 *
2830
 * If the filename contains a wildcard, all files and directories that match the wildcard
2831
 * will be returned.
2832
 *
2833
 * ap_dir_nofnmatch() is called for each directory and file found, and the callback
2834
 * within ap_dir_match_t triggered as described above.
2835
 *
2836
 * Wildcards may appear in both directory and file components in the path, and
2837
 * wildcards may appear more than once.
2838
 *
2839
 * @param w Directory match structure containing callback and context.
2840
 * @param path Path prefix for search, with non native separators and no wildcards.
2841
 * @param fname The name of the file or directory, with non native separators and
2842
 * optional wildcards.
2843
 * @return NULL on success, or a string describing the error.
2844
 */
2845
AP_DECLARE(const char *)ap_dir_fnmatch(ap_dir_match_t *w, const char *path,
2846
        const char *fname) __attribute__((nonnull(1,3)));
2847
2848
/**
2849
 * Determine if the final Transfer-Encoding is "chunked".
2850
 *
2851
 * @param p The pool to allocate from
2852
 * @param line the header field-value to scan
2853
 * @return 1 if the last Transfer-Encoding is "chunked", else 0
2854
 */
2855
AP_DECLARE(int) ap_is_chunked(apr_pool_t *p, const char *line);
2856
2857
2858
/**
2859
 * apr_filepath_merge with an allow-list
2860
 * Merge additional file path onto the previously processed rootpath
2861
 * @param newpath the merged paths returned
2862
 * @param rootpath the root file path (NULL uses the current working path)
2863
 * @param addpath the path to add to the root path
2864
 * @param flags the desired APR_FILEPATH_ rules to apply when merging
2865
 * @param p the pool to allocate the new path string from
2866
 * @remark if the flag APR_FILEPATH_TRUENAME is given, and the addpath
2867
 * contains wildcard characters ('*', '?') on platforms that don't support
2868
 * such characters within filenames, the paths will be merged, but the
2869
 * result code will be APR_EPATHWILD, and all further segments will not
2870
 * reflect the true filenames including the wildcard and following segments.
2871
 */
2872
AP_DECLARE(apr_status_t) ap_filepath_merge(char **newpath,
2873
                                             const char *rootpath,
2874
                                             const char *addpath,
2875
                                             apr_int32_t flags,
2876
                                             apr_pool_t *p);
2877
2878
#ifdef WIN32
2879
#define apr_filepath_merge  ap_filepath_merge
2880
#endif
2881
2882
/* Win32/NetWare/OS2 need to check for both forward and back slashes
2883
 * in ap_normalize_path() and ap_escape_url().
2884
 */
2885
#ifdef CASE_BLIND_FILESYSTEM
2886
#define AP_IS_SLASH(s) ((s == '/') || (s == '\\'))
2887
#define AP_SLASHES "/\\"
2888
#else
2889
0
#define AP_IS_SLASH(s) (s == '/')
2890
0
#define AP_SLASHES "/"
2891
#endif
2892
2893
/**
2894
 * Validates the path parameter is safe to pass to stat-like calls.
2895
 * @param path The filesystem path to cehck
2896
 * @param p a pool for temporary allocations
2897
 * @return APR_SUCCESS if the stat-like call should be allowed
2898
 */
2899
AP_DECLARE(apr_status_t) ap_stat_check(const char *path, apr_pool_t *pool);
2900
2901
2902
#ifdef __cplusplus
2903
}
2904
#endif
2905
2906
#endif  /* !APACHE_HTTPD_H */
2907
2908
/** @} //APACHE Daemon      */
2909
/** @} //APACHE Core        */
2910
/** @} //APACHE super group */
2911