Apache HTTPD
h2_request.c
Go to the documentation of this file.
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#include <assert.h>
18
19#include "apr.h"
20#include "apr_strings.h"
21#include "apr_lib.h"
22#include "apr_strmatch.h"
23
24#include <ap_mmn.h>
25
26#include <httpd.h>
27#include <http_core.h>
28#include <http_connection.h>
29#include <http_protocol.h>
30#include <http_request.h>
31#include <http_log.h>
32#include <http_ssl.h>
33#include <http_vhost.h>
34#include <util_filter.h>
35#include <ap_mpm.h>
36#include <mod_core.h>
37#include <scoreboard.h>
38
39#include "h2_private.h"
40#include "h2_config.h"
41#include "h2_conn_ctx.h"
42#include "h2_push.h"
43#include "h2_request.h"
44#include "h2_util.h"
45
46
48 const char *scheme, const char *authority,
49 const char *path, apr_table_t *header)
50{
51 h2_request *req = apr_pcalloc(pool, sizeof(h2_request));
52
53 req->method = method;
54 req->scheme = scheme;
55 req->authority = authority;
56 req->path = path;
57 req->headers = header? header : apr_table_make(pool, 10);
59
60 return req;
61}
62
63typedef struct {
64 apr_table_t *headers;
67} h1_ctx;
68
69static int set_h1_header(void *ctx, const char *key, const char *value)
70{
71 h1_ctx *x = ctx;
72 int was_added;
73 h2_req_add_header(x->headers, x->pool, key, strlen(key), value, strlen(value), 0, &was_added);
74 return 1;
75}
76
79{
80 h2_request *req;
81 const char *scheme, *authority, *path;
82 h1_ctx x;
83
84 *preq = NULL;
86 : ap_http_scheme(r));
87 authority = apr_pstrdup(pool, r->hostname);
89
90 if (!r->method || !scheme || !r->hostname || !path) {
91 return APR_EINVAL;
92 }
93
94 /* The authority we carry in h2_request is the 'authority' part of
95 * the URL for the request. r->hostname has stripped any port info that
96 * might have been present. Do we need to add it?
97 */
98 if (!ap_strchr_c(authority, ':')) {
99 if (r->parsed_uri.port_str) {
100 /* Yes, it was there, add it again. */
101 authority = apr_pstrcat(pool, authority, ":", r->parsed_uri.port_str, NULL);
102 }
103 else if (!r->parsed_uri.hostname && r->server && r->server->port) {
104 /* If there was no hostname in the parsed URL, the URL was relative.
105 * In that case, we restore port from our server->port, if it
106 * is known and not the default port for the scheme. */
108 if (defport != r->server->port) {
109 /* port info missing and port is not default for scheme: append */
110 authority = apr_psprintf(pool, "%s:%d", authority,
111 (int)r->server->port);
112 }
113 }
114 }
115
116 req = apr_pcalloc(pool, sizeof(*req));
117 req->method = apr_pstrdup(pool, r->method);
118 req->scheme = scheme;
119 req->authority = authority;
120 req->path = path;
121 req->headers = apr_table_make(pool, 10);
123 req->request_time = apr_time_now();
124
125 x.pool = pool;
126 x.headers = req->headers;
129
130 *preq = req;
131 return x.status;
132}
133
135 const char *name, size_t nlen,
136 const char *value, size_t vlen,
137 size_t max_field_len, int *pwas_added)
138{
140
141 *pwas_added = 0;
142 if (nlen <= 0) {
143 return status;
144 }
145
146 if (name[0] == ':') {
147 /* pseudo header, see ch. 8.1.2.3, always should come first */
148 if (!apr_is_empty_table(req->headers)) {
150 APLOGNO(02917)
151 "h2_request: pseudo header after request start");
152 return APR_EGENERAL;
153 }
154
158 }
159 else if (H2_HEADER_SCHEME_LEN == nlen
162 }
163 else if (H2_HEADER_PATH_LEN == nlen
165 req->path = apr_pstrndup(pool, value, vlen);
166 }
167 else if (H2_HEADER_AUTH_LEN == nlen
170 }
171 else if (H2_HEADER_PROTO_LEN == nlen
174 }
175 else {
176 char buffer[32];
177 memset(buffer, 0, 32);
178 strncpy(buffer, name, (nlen > 31)? 31 : nlen);
180 APLOGNO(02954)
181 "h2_request: ignoring unknown pseudo header %s",
182 buffer);
183 }
184 }
185 else {
186 /* non-pseudo header, add to table */
189 }
190
191 return status;
192}
193
195 size_t raw_bytes)
196{
197 /* rfc7540, ch. 8.1.2.3: without :authority, Host: must be there */
198 if (req->authority && !strlen(req->authority)) {
199 req->authority = NULL;
200 }
201 if (!req->authority) {
202 const char *host = apr_table_get(req->headers, "Host");
203 if (!host) {
204 return APR_BADARG;
205 }
206 req->authority = host;
207 }
208 else {
209 apr_table_setn(req->headers, "Host", req->authority);
210 }
211 req->raw_bytes += raw_bytes;
212
213 return APR_SUCCESS;
214}
215
217{
218 h2_request *dst = apr_pmemdup(p, src, sizeof(*dst));
219 dst->method = apr_pstrdup(p, src->method);
220 dst->scheme = apr_pstrdup(p, src->scheme);
221 dst->authority = apr_pstrdup(p, src->authority);
222 dst->path = apr_pstrdup(p, src->path);
223 dst->protocol = apr_pstrdup(p, src->protocol);
224 dst->headers = apr_table_clone(p, src->headers);
225 return dst;
226}
227
228#if !AP_MODULE_MAGIC_AT_LEAST(20120211, 106)
230{
231 apr_pool_t *p;
232 request_rec *r;
233
234 apr_pool_create(&p, c->pool);
235 apr_pool_tag(p, "request");
236 r = apr_pcalloc(p, sizeof(request_rec));
238 r->pool = p;
239 r->connection = c;
240 r->server = c->base_server;
241
242 r->user = NULL;
244
246
253 r->notes = apr_table_make(r->pool, 5);
254
256 /* Must be set before we run create request hook */
257
258 r->proto_output_filters = c->output_filters;
260 r->proto_input_filters = c->input_filters;
264
265 r->sent_bodyct = 0; /* bytect isn't for body */
266
267 r->read_length = 0;
269
270 r->status = HTTP_OK; /* Until further notice */
271 r->header_only = 0;
272 r->the_request = NULL;
273
274 /* Begin by presuming any module can make its own path_info assumptions,
275 * until some module interjects and changes the value.
276 */
278
279 r->useragent_addr = c->client_addr;
280 r->useragent_ip = c->client_ip;
281 return r;
282}
283#endif
284
285#if AP_HAS_RESPONSE_BUCKETS
287{
289 apr_table_t *headers = apr_table_clone(r->pool, req->headers);
290 const char *uri = req->path;
291
294 if (!ap_cstr_casecmp("CONNECT", req->method)) {
295 uri = req->authority;
296 }
298 /* Forward proxying: always absolute uris */
299 uri = apr_psprintf(r->pool, "%s://%s%s",
300 req->scheme, req->authority,
301 req->path ? req->path : "");
302 }
303 else if (req->scheme && ap_cstr_casecmp(req->scheme, "http")
304 && ap_cstr_casecmp(req->scheme, "https")) {
305 /* Client sent a non-http ':scheme', use an absolute URI */
306 uri = apr_psprintf(r->pool, "%s://%s%s",
307 req->scheme, req->authority, req->path ? req->path : "");
308 }
309
310 return ap_bucket_request_create(req->method, uri, "HTTP/2.0", headers,
311 r->pool, c->bucket_alloc);
312}
313#endif
314
315static void assign_headers(request_rec *r, const h2_request *req,
316 int no_body, int is_connect)
317{
318 const char *cl;
319
321
322 if (req->authority && !is_connect) {
323 /* for internal handling, we have to simulate that :authority
324 * came in as Host:, RFC 9113 ch. says that mismatches between
325 * :authority and Host: SHOULD be rejected as malformed. However,
326 * we are more lenient and just replace any Host: if we have
327 * an :authority.
328 */
329 const char *orig_host = apr_table_get(req->headers, "Host");
330 if (orig_host && strcmp(req->authority, orig_host)) {
332 "overwriting 'Host: %s' with :authority: %s'",
333 orig_host, req->authority);
334 apr_table_setn(r->subprocess_env, "H2_ORIGINAL_HOST", orig_host);
335 }
336 apr_table_setn(r->headers_in, "Host", req->authority);
338 "set 'Host: %s' from :authority", req->authority);
339 }
340
341 /* Unless we open a byte stream via CONNECT, apply content-length guards. */
342 if (!is_connect) {
343 cl = apr_table_get(req->headers, "Content-Length");
344 if (no_body) {
345 if (!cl && apr_table_get(req->headers, "Content-Type")) {
346 /* If we have a content-type, but already seen eos, no more
347 * data will come. Signal a zero content length explicitly.
348 */
349 apr_table_setn(req->headers, "Content-Length", "0");
350 }
351 }
352#if !AP_HAS_RESPONSE_BUCKETS
353 else if (!cl) {
354 /* there may be a body and we have internal HTTP/1.1 processing.
355 * If the Content-Length is unspecified, we MUST simulate
356 * chunked Transfer-Encoding.
357 *
358 * HTTP/2 does not need a Content-Length for framing. Ideally
359 * all clients set the EOS flag on the header frame if they
360 * do not intent to send a body. However, forwarding proxies
361 * might just no know at the time and send an empty DATA
362 * frame with EOS much later.
363 */
364 apr_table_mergen(r->headers_in, "Transfer-Encoding", "chunked");
365 }
366#endif /* else AP_HAS_RESPONSE_BUCKETS */
367 }
368}
369
371 int no_body)
372{
374 int is_connect = !ap_cstr_casecmp("CONNECT", req->method);
375
376#if AP_MODULE_MAGIC_AT_LEAST(20120211, 106)
378#else
380#endif
381
382#if AP_MODULE_MAGIC_AT_LEAST(20120211, 107)
385
386 /* Time to populate r with the data we have. */
389 if (req->http_status != H2_HTTP_STATUS_UNSET) {
391 goto die;
392 }
393 else if (is_connect) {
394 /* CONNECT MUST NOT have scheme or path */
395 r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
396 req->method, req->authority);
397 if (req->scheme) {
399 "':scheme: %s' header present in CONNECT request",
400 req->scheme);
402 goto die;
403 }
404 else if (req->path) {
406 "':path: %s' header present in CONNECT request",
407 req->path);
409 goto die;
410 }
411 }
412 else if (req->protocol) {
414 "':protocol: %s' header present in %s request",
415 req->protocol, req->method);
417 goto die;
418 }
420 if (!req->scheme) {
422 "H2ProxyRequests on, but request misses :scheme");
424 goto die;
425 }
426 if (!req->authority) {
428 "H2ProxyRequests on, but request misses :authority");
430 goto die;
431 }
432 r->the_request = apr_psprintf(r->pool, "%s %s://%s%s HTTP/2.0",
433 req->method, req->scheme, req->authority,
434 req->path ? req->path : "");
435 }
436 else if (req->scheme && ap_cstr_casecmp(req->scheme, "http")
437 && ap_cstr_casecmp(req->scheme, "https")) {
438 /* Client sent a ':scheme' pseudo header for something else
439 * than what we have on this connection. Make an absolute URI. */
440 r->the_request = apr_psprintf(r->pool, "%s %s://%s%s HTTP/2.0",
441 req->method, req->scheme, req->authority,
442 req->path ? req->path : "");
443 }
444 else if (req->path) {
445 r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
446 req->method, req->path);
447 }
448 else {
449 /* We should only come here on a request that is errored already.
450 * create a request line that passes parsing, we'll die anyway.
451 */
453 r->the_request = apr_psprintf(r->pool, "%s / HTTP/2.0", req->method);
454 }
455
456 /* Start with r->hostname = NULL, ap_check_request_header() will get it
457 * form Host: header, otherwise we get complains about port numbers.
458 */
459 r->hostname = NULL;
460
461 /* Validate HTTP/1 request and select vhost. */
463 /* we may have switched to another server still */
465 if (req->http_status != H2_HTTP_STATUS_UNSET) {
467 /* Be safe and close the connection */
468 c->keepalive = AP_CONN_CLOSE;
469 }
470 else {
472 }
473 r->status = HTTP_OK;
474 goto die;
475 }
476#else
477 {
478 const char *s;
479
482
483 /* Time to populate r with the data we have. */
485 r->method = apr_pstrdup(r->pool, req->method);
486 /* Provide quick information about the request method as soon as known */
488 if (r->method_number == M_GET && r->method[0] == 'H') {
489 r->header_only = 1;
490 }
491 ap_parse_uri(r, req->path ? req->path : "");
492 r->protocol = (char*)"HTTP/2.0";
493 r->proto_num = HTTP_VERSION(2, 0);
494 r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
495 r->method, req->path ? req->path : "");
496
497 /* Start with r->hostname = NULL, ap_check_request_header() will get it
498 * form Host: header, otherwise we get complains about port numbers.
499 */
500 r->hostname = NULL;
502
503 /* we may have switched to another server */
505
506 s = apr_table_get(r->headers_in, "Expect");
507 if (s && s[0]) {
508 if (ap_cstr_casecmp(s, "100-continue") == 0) {
509 r->expecting_100 = 1;
510 }
511 else {
514 goto die;
515 }
516 }
517 }
518#endif
519
520 /* we may have switched to another server */
522
523 if (req->http_status != H2_HTTP_STATUS_UNSET) {
525 r->status = HTTP_OK;
526 /* Be safe and close the connection */
527 c->keepalive = AP_CONN_CLOSE;
528 goto die;
529 }
530
531 /*
532 * Add the HTTP_IN filter here to ensure that ap_discard_request_body
533 * called by ap_die and by ap_send_error_response works correctly on
534 * status codes that do not cause the connection to be dropped and
535 * in situations where the connection should be kept alive.
536 */
538 NULL, r, r->connection);
539
541 /* Request check post hooks failed. An example of this would be a
542 * request for a vhost where h2 is disabled --> 421.
543 */
545 "h2_request: access_status=%d, request_create failed",
547 goto die;
548 }
549
551 (char *)r->uri, (char *)r->server->defn_name,
552 r->status);
553 return r;
554
555die:
556 if (!r->method) {
557 /* if we fail early, `r` is not properly initialized for error
558 * processing which accesses fields in message generation.
559 * Make a best effort. */
560 if (!r->the_request) {
561 r->the_request = apr_psprintf(r->pool, "%s %s HTTP/2.0",
562 req->method, req->path);
563 }
565 }
567 "ap_die(%d) for %s", access_status, r->the_request);
569
570 /* ap_die() sent the response through the output filters, we must now
571 * end the request with an EOR bucket for stream/pipeline accounting.
572 */
573 {
575#if AP_MODULE_MAGIC_AT_LEAST(20180905, 1)
578 ap_bucket_eor_create(c->bucket_alloc, r));
579 ap_pass_brigade(c->output_filters, eor_bb);
581#else
582 eor_bb = apr_brigade_create(c->pool, c->bucket_alloc);
584 ap_bucket_eor_create(c->bucket_alloc, r));
585 ap_pass_brigade(c->output_filters, eor_bb);
587#endif
588 }
589
590 r = NULL;
592 return NULL;
593}
Module Magic Number.
Apache Multi-Processing Module library.
#define AP_READ_REQUEST_SUCCESS(arg0, arg1, arg2, arg3, arg4)
#define AP_READ_REQUEST_FAILURE(arg0)
#define AP_READ_REQUEST_ENTRY(arg0, arg1)
APR general purpose library routines.
APR Strings library.
APR-UTIL string matching routines.
ap_conf_vector_t * ap_create_request_config(apr_pool_t *p)
Definition config.c:356
request_rec int int apr_table_t const char * path
request_rec * r
#define ap_http_scheme(r)
Definition httpd.h:297
#define HTTP_VERSION(major, minor)
Definition httpd.h:269
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
ap_filter_t * ap_add_input_filter_handle(ap_filter_rec_t *f, void *ctx, request_rec *r, conn_rec *c)
#define APLOGNO(n)
Definition http_log.h:117
#define ap_log_rerror
Definition http_log.h:454
#define APLOG_ERR
Definition http_log.h:67
#define ap_log_cerror
Definition http_log.h:498
#define APLOG_MARK
Definition http_log.h:283
#define ap_log_perror
Definition http_log.h:412
#define APLOG_WARNING
Definition http_log.h:68
#define APLOG_TRACE2
Definition http_log.h:73
#define APLOG_TRACE1
Definition http_log.h:72
#define APLOG_DEBUG
Definition http_log.h:71
int ap_method_number_of(const char *method)
int ap_parse_request_line(request_rec *r)
Definition protocol.c:721
void ap_run_pre_read_request(request_rec *r, conn_rec *c)
Definition protocol.c:2583
ap_method_list_t * ap_make_method_list(apr_pool_t *p, int nelts)
void ap_parse_uri(request_rec *r, const char *uri)
Definition protocol.c:580
request_rec * ap_create_request(conn_rec *c)
Definition protocol.c:1356
int ap_post_read_request(request_rec *r)
Definition protocol.c:1608
int ap_check_request_header(request_rec *r)
Definition protocol.c:1000
apr_bucket * ap_bucket_eor_create(apr_bucket_alloc_t *list, request_rec *r)
Definition eor_bucket.c:68
int ap_run_create_request(request_rec *r)
Definition request.c:98
void ap_die(int type, request_rec *r)
const char * host
Definition http_vhost.h:124
#define APR_EGENERAL
Definition apr_errno.h:313
#define APR_BADARG
Definition apr_errno.h:459
#define APR_EINVAL
Definition apr_errno.h:711
#define APR_BRIGADE_INSERT_TAIL(b, e)
apr_brigade_flush void * ctx
const char * src
Definition apr_encode.h:167
const char * uri
Definition apr_uri.h:159
#define APR_URI_UNP_OMITSITEPART
Definition apr_uri.h:64
#define HTTP_OK
Definition httpd.h:490
#define HTTP_BAD_REQUEST
Definition httpd.h:508
#define HTTP_EXPECTATION_FAILED
Definition httpd.h:525
ap_filter_rec_t * ap_http_input_filter_handle
Definition http_core.c:38
#define M_GET
Definition httpd.h:592
int ap_cstr_casecmp(const char *s1, const char *s2)
Definition util.c:3542
#define ap_strchr_c(s, c)
Definition httpd.h:2353
#define AP_DEBUG_ASSERT(exp)
Definition httpd.h:2283
@ AP_CONN_CLOSE
Definition httpd.h:1145
apr_size_t size
const char int apr_pool_t * pool
Definition apr_cstr.h:84
const char * value
Definition apr_env.h:51
#define APR_SUCCESS
Definition apr_errno.h:225
int apr_status_t
Definition apr_errno.h:44
const char * key
char * buffer
apr_vformatter_buff_t * c
Definition apr_lib.h:175
apr_uint16_t apr_port_t
apr_uint32_t apr_pool_t apr_uint32_t apr_pollset_method_e method
Definition apr_poll.h:195
#define apr_pool_create(newpool, parent)
Definition apr_pools.h:322
#define apr_pcalloc(p, size)
Definition apr_pools.h:465
const char * s
Definition apr_strings.h:95
int int status
#define REQUEST_NO_BODY
Definition httpd.h:746
#define AP_REQ_DEFAULT_PATH_INFO
Definition httpd.h:765
#define H2_HEADER_PROTO
Definition h2.h:81
#define H2_HEADER_PATH
Definition h2.h:79
#define H2_HEADER_AUTH
Definition h2.h:77
#define H2_HEADER_SCHEME_LEN
Definition h2.h:76
#define H2_HEADER_AUTH_LEN
Definition h2.h:78
#define H2_HEADER_METHOD_LEN
Definition h2.h:74
#define H2_HEADER_METHOD
Definition h2.h:73
#define H2_HEADER_PATH_LEN
Definition h2.h:80
#define H2_HEADER_SCHEME
Definition h2.h:75
#define H2_HEADER_PROTO_LEN
Definition h2.h:82
#define H2_HTTP_STATUS_UNSET
Definition h2.h:190
int h2_config_cgeti(conn_rec *c, h2_config_var_t var)
Definition h2_config.c:496
@ H2_CONF_PROXY_REQUESTS
Definition h2_config.h:47
apr_status_t h2_request_rcreate(h2_request **preq, apr_pool_t *pool, request_rec *r)
Definition h2_request.c:77
apr_status_t h2_request_add_header(h2_request *req, apr_pool_t *pool, const char *name, size_t nlen, const char *value, size_t vlen, size_t max_field_len, int *pwas_added)
Definition h2_request.c:134
request_rec * h2_create_request_rec(const h2_request *req, conn_rec *c, int no_body)
Definition h2_request.c:370
static void assign_headers(request_rec *r, const h2_request *req, int no_body, int is_connect)
Definition h2_request.c:315
h2_request * h2_request_create(int id, apr_pool_t *pool, const char *method, const char *scheme, const char *authority, const char *path, apr_table_t *header)
Definition h2_request.c:47
apr_status_t h2_request_end_headers(h2_request *req, apr_pool_t *pool, size_t raw_bytes)
Definition h2_request.c:194
h2_request * h2_request_clone(apr_pool_t *p, const h2_request *src)
Definition h2_request.c:216
static int set_h1_header(void *ctx, const char *key, const char *value)
Definition h2_request.c:69
apr_status_t h2_req_add_header(apr_table_t *headers, apr_pool_t *pool, const char *name, size_t nlen, const char *value, size_t vlen, size_t max_field_len, int *pwas_added)
Definition h2_util.c:1751
Apache connection library.
CORE HTTP Daemon.
Apache Logging library.
HTTP protocol handling.
Apache Request library.
SSL protocol handling.
Virtual Host package.
HTTP Daemon routines.
apr_pool_t * p
Definition md_event.c:32
mod_core private header file
return NULL
Definition mod_so.c:359
Apache scoreboard library.
char * name
char * scheme
Definition apr_uri.h:87
char * hostname
Definition apr_uri.h:95
char * port_str
Definition apr_uri.h:97
Structure to store things which are per connection.
Definition httpd.h:1152
apr_status_t status
Definition h2_request.c:66
apr_pool_t * pool
apr_table_t * headers
const char * method
Definition h2.h:170
const char * authority
Definition h2.h:172
const char * scheme
Definition h2.h:171
int http_status
Definition h2.h:179
const char * path
Definition h2.h:173
apr_table_t * headers
Definition h2.h:175
apr_time_t request_time
Definition h2.h:177
apr_off_t raw_bytes
Definition h2.h:178
const char * protocol
Definition h2.h:174
A structure that represents the current request.
Definition httpd.h:845
char * user
Definition httpd.h:1005
int status
Definition httpd.h:891
char * uri
Definition httpd.h:1016
apr_table_t * trailers_in
Definition httpd.h:1104
struct ap_filter_t * output_filters
Definition httpd.h:1070
char * useragent_ip
Definition httpd.h:1101
int read_body
Definition httpd.h:947
int header_only
Definition httpd.h:875
struct ap_filter_t * proto_input_filters
Definition httpd.h:1079
apr_table_t * notes
Definition httpd.h:985
unsigned expecting_100
Definition httpd.h:951
const char * hostname
Definition httpd.h:883
int used_path_info
Definition httpd.h:1036
char * the_request
Definition httpd.h:866
int method_number
Definition httpd.h:898
apr_pool_t * pool
Definition httpd.h:847
apr_sockaddr_t * useragent_addr
Definition httpd.h:1100
apr_time_t request_time
Definition httpd.h:886
apr_uri_t parsed_uri
Definition httpd.h:1092
conn_rec * connection
Definition httpd.h:849
ap_method_list_t * allowed_methods
Definition httpd.h:926
apr_table_t * err_headers_out
Definition httpd.h:981
struct ap_filter_t * proto_output_filters
Definition httpd.h:1076
int proto_num
Definition httpd.h:877
struct ap_filter_t * input_filters
Definition httpd.h:1072
struct ap_conf_vector_t * request_config
Definition httpd.h:1049
apr_table_t * headers_in
Definition httpd.h:976
char * protocol
Definition httpd.h:879
apr_off_t read_length
Definition httpd.h:961
apr_table_t * subprocess_env
Definition httpd.h:983
apr_off_t sent_bodyct
Definition httpd.h:929
server_rec * server
Definition httpd.h:851
struct ap_conf_vector_t * per_dir_config
Definition httpd.h:1047
const char * method
Definition httpd.h:900
apr_table_t * trailers_out
Definition httpd.h:1106
char * ap_auth_type
Definition httpd.h:1007
apr_table_t * headers_out
Definition httpd.h:978
const char * defn_name
Definition httpd.h:1346
struct ap_conf_vector_t * lookup_defaults
Definition httpd.h:1343
apr_port_t port
Definition httpd.h:1356
Apache filter library.
void ap_update_vhost_from_headers(request_rec *r)
Definition vhost.c:1168