28#define APR_WANT_STRFUNC
29#define APR_WANT_MEMFUNC
148 if (
ctx->state == BODY_CHUNK_END
149 ||
ctx->state == BODY_CHUNK_END_LF) {
151 if (strict && (
ctx->state != BODY_CHUNK_END_LF)) {
157 ctx->state = BODY_CHUNK;
159 else if (
c ==
CR &&
ctx->state == BODY_CHUNK_END) {
160 ctx->state = BODY_CHUNK_END_LF;
173 if (
ctx->state == BODY_CHUNK) {
182 ctx->state = BODY_CHUNK_PART;
191 if (strict && (
ctx->state != BODY_CHUNK_LF)) {
197 if (
ctx->remaining) {
198 ctx->state = BODY_CHUNK_DATA;
201 ctx->state = BODY_CHUNK_TRAILER;
204 else if (
ctx->state == BODY_CHUNK_LF) {
211 ctx->state = BODY_CHUNK_LF;
214 ctx->state = BODY_CHUNK_EXT;
216 else if (
ctx->state == BODY_CHUNK_EXT) {
225 else if (
c ==
' ' ||
c ==
'\t') {
230 ctx->state = BODY_CHUNK_CR;
231 if (++
ctx->chunk_bws > 10) {
235 else if (
ctx->state == BODY_CHUNK_CR) {
241 else if (
ctx->state == BODY_CHUNK_PART) {
245 if (!
ctx->remaining &&
c ==
'0') {
251 if (
ctx->chunkbits < 0) {
256 if (
c >=
'0' &&
c <=
'9') {
259 else if (
c >=
'A' &&
c <=
'F') {
262 else if (
c >=
'a' &&
c <=
'f') {
271 if (
ctx->remaining < 0) {
318 "Error while reading HTTP trailer: %i%s%s",
362 ctx->state = BODY_NONE;
370 if (!
f->r->proxyreq) {
382 ctx->state = BODY_CHUNK;
392 "Unknown Transfer-Encoding: %s; "
393 "using read-until-close",
tenc);
401 "Unknown Transfer-Encoding: %s",
tenc);
407 ctx->state = BODY_LENGTH;
416 "Invalid Content-Length");
424 if (
ctx->limit &&
ctx->limit <
ctx->remaining) {
427 " is larger than the configured limit"
465 && (
ctx->state == BODY_CHUNK
466 || (
ctx->state == BODY_LENGTH &&
ctx->remaining > 0))
468 && !(
ctx->eos_sent ||
f->r->eos_sent ||
f->r->bytes_sent)) {
470 ctx->state = BODY_NONE;
473 else if (!
ctx->seen_data) {
477 f->r->status_line =
NULL;
489 f->r->expecting_100 = 0;
505 switch (
ctx->state) {
507 case BODY_CHUNK_PART:
512 case BODY_CHUNK_END_LF: {
546 f->r->server->limit_req_fieldsize, strict);
550 "Error reading/parsing chunk %s ",
567 if (
ctx->state == BODY_CHUNK_TRAILER) {
577 case BODY_CHUNK_DATA: {
596 &&
ctx->remaining > 0) {
614 if (
ctx->state != BODY_NONE) {
616 if (
ctx->remaining > 0) {
623 else if (
ctx->state == BODY_CHUNK_DATA) {
625 ctx->state = BODY_CHUNK_END;
638 if (
ctx->limit <
ctx->limit_used) {
640 APLOGNO(01591)
"Read content length of "
643 ctx->limit_used,
ctx->limit);
653 if (
ctx->state == BODY_LENGTH &&
ctx->remaining == 0) {
661 case BODY_CHUNK_TRAILER: {
681 "Unexpected body state (%i)", (
int)
ctx->state);
698 const char *
name,
const char **
val)
700 const char *pos, *
end;
703 if (
name[0] ==
'\0') {
705 "Empty response header name, aborting request");
717 "Response header name '%s' contains invalid "
718 "characters, aborting request",
723 for (pos = *
val; *pos; pos =
end) {
729 "Response header '%s' value of '%s' contains "
730 "invalid characters, aborting request",
760 for (
i = 0;
i < headers->
nelts; ++
i) {
823#if APR_CHARSET_EBCDIC
839 v->iov_len =
sizeof(
": ") - 1;
845 v->iov_len =
sizeof(
CRLF) - 1;
898 }
while (*
e !=
'\0');
940 if (elts->
nelts == 0) {
946 sizeof(
struct iovec));
957 vec_next->iov_len =
sizeof(
": ") - 1;
978#if APR_CHARSET_EBCDIC
1090 vec[1].iov_base = (
void *)
" ";
1091 vec[1].iov_len =
sizeof(
" ") - 1;
1094 vec[3].iov_base = (
void *)
CRLF;
1095 vec[3].iov_len =
sizeof(
CRLF) - 1;
1096#if APR_CHARSET_EBCDIC
1142 "Response sent with status %d%s",
1208 "TRACE denied by server configuration");
1221 "TRACE with a request body is not allowed");
1230 "Extended TRACE request bodies cannot exceed 64k\n");
1255 "Extended TRACE request bodies cannot exceed 64k\n");
1269#if APR_CHARSET_EBCDIC
1283 apr_table_do((
int (*) (
void *,
const char *,
const char *))
1325 else if (
ctx->headers_sent) {
1539 ctx->headers_sent = 1;
1731 "Unknown Transfer-Encoding %s",
tenc);
1736 "chunked Transfer-Encoding forbidden: %s",
r->
uri);
1746 "Invalid Content-Length '%s'",
lenp);
1754 "%s with body is not allowed for %s",
r->
method,
r->
uri);
1758 if (limit_req_body > 0 && (
r->
remaining > limit_req_body)) {
1903 if (!
ctx->first_error) {
1933 if (
ctx->seen_eoc) {
1943 if (
ctx->first_error) {
Symbol export macros and hook functions.
#define AP_DECLARE_NONSTD(type)
const char apr_size_t len
APR-UTIL Buckets/Bucket Brigades.
APR general purpose library routines.
apr_size_t const unsigned char unsigned int unsigned int d
APR Standard Headers Support.
apr_bucket * ap_bucket_eoc_create(apr_bucket_alloc_t *list)
#define APLOG_USE_MODULE(foo)
#define ap_get_module_config(v, m)
#define AP_BUCKET_IS_EOC(e)
#define AP_SERVER_PROTOCOL
#define HTTP_VERSION(major, minor)
const char * ap_get_server_banner(void)
#define AP_CORE_DECLARE_NONSTD
#define ap_xlate_proto_to_ascii(x, y)
#define ap_xlate_proto_from_ascii(x, y)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
ap_filter_t * ap_add_output_filter(const char *name, void *ctx, request_rec *r, conn_rec *c)
apr_status_t ap_get_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
void ap_remove_output_filter(ap_filter_t *f)
apr_off_t ap_get_limit_req_body(const request_rec *r)
#define ap_get_core_module_config(v)
int ap_map_http_request_error(apr_status_t rv, int status)
void ap_send_interim_response(request_rec *r, int send_headers)
apr_status_t ap_http_header_filter(ap_filter_t *f, apr_bucket_brigade *b)
int ap_set_keepalive(request_rec *r)
int ap_should_client_block(request_rec *r)
void ap_set_content_length(request_rec *r, apr_off_t length)
const char * ap_make_content_type(request_rec *r, const char *type)
void ap_set_content_type_ex(request_rec *r, const char *ct, int trusted)
#define AP_BUCKET_IS_ERROR(e)
long ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz)
const char * ap_get_status_line(int status)
int ap_setup_client_block(request_rec *r, int read_policy)
int ap_discard_request_body(request_rec *r)
void ap_get_mime_headers(request_rec *r)
apr_bucket * ap_bucket_error_create(int error, const char *buf, apr_pool_t *p, apr_bucket_alloc_t *list)
void ap_die(int type, request_rec *r)
apr_status_t ap_recent_rfc822_date(char *date_str, apr_time_t t)
#define APR_STATUS_IS_EAGAIN(s)
#define APR_BUCKET_REMOVE(e)
#define APR_BRIGADE_LAST(b)
#define APR_BUCKET_IS_METADATA(e)
#define APR_BRIGADE_INSERT_TAIL(b, e)
apr_file_t apr_off_t start
#define APR_BRIGADE_INSERT_HEAD(b, e)
#define APR_BUCKET_NEXT(e)
#define APR_BRIGADE_EMPTY(b)
#define APR_BRIGADE_SENTINEL(b)
#define apr_bucket_delete(e)
#define APR_BUCKET_IS_EOS(e)
apr_brigade_flush void * ctx
#define APR_BRIGADE_FIRST(b)
#define apr_bucket_read(e, str, len, block)
apr_pool_t apr_dbd_t apr_dbd_results_t ** res
apr_dbd_transaction_t int mode
const char apr_hash_t ** values
apr_memcache_server_t * server
#define HTTP_LENGTH_REQUIRED
#define HTTP_REQUEST_TIME_OUT
#define AP_STATUS_IS_HEADER_ONLY(x)
#define HTTP_INTERNAL_SERVER_ERROR
#define HTTP_METHOD_NOT_ALLOWED
#define HTTP_REQUEST_ENTITY_TOO_LARGE
#define HTTP_NOT_IMPLEMENTED
#define ap_is_HTTP_SUCCESS(x)
#define ap_status_drops_connection(x)
int ap_send_http_trace(request_rec *r)
apr_status_t ap_http_filter(ap_filter_t *f, apr_bucket_brigade *b, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
void ap_basic_http_header(request_rec *r, apr_bucket_brigade *bb)
apr_status_t ap_http_outerror_filter(ap_filter_t *f, apr_bucket_brigade *b)
const char const char int ap_is_chunked(apr_pool_t *p, const char *line)
const char * ap_scan_http_token(const char *ptr)
int ap_cstr_casecmp(const char *s1, const char *s2)
char * ap_escape_logitem(apr_pool_t *p, const char *str)
char * ap_get_list_item(apr_pool_t *p, const char **field)
#define AP_DEBUG_ASSERT(exp)
const char * ap_scan_vchar_obstext(const char *ptr)
const char * ap_scan_http_field_content(const char *ptr)
int ap_parse_strict_length(apr_off_t *len, const char *str)
#define PROXYREQ_RESPONSE
void const char apr_status_t(* cleanup)(void *))
apr_vformatter_buff_t * c
#define apr_pcalloc(p, size)
#define APR_ARRAY_IDX(ary, i, type)
#define APR_RFC822_DATE_LEN
#define REQUEST_CHUNKED_ERROR
#define REQUEST_CHUNKED_DECHUNK
Apache connection library.
#define AP_TRACE_EXTENDED
#define AP_MERGE_TRAILERS_ENABLE
#define AP_HTTP_CONFORMANCE_UNSAFE
static apr_status_t parse_chunk_size(http_ctx_t *ctx, const char *buffer, apr_size_t len, int linelimit, int strict)
static int uniq_field_values(void *d, const char *key, const char *val)
static apr_status_t send_all_header_fields(header_struct *h, const request_rec *r)
static int check_headers_table(apr_table_t *t, struct check_header_ctx *ctx)
static void terminate_header(apr_bucket_brigade *bb)
static int check_headers_recursion(request_rec *r)
struct http_filter_ctx http_ctx_t
static int check_header(struct check_header_ctx *ctx, const char *name, const char **val)
static void basic_http_header_check(request_rec *r, const char **protocol)
static apr_status_t bail_out_on_error(http_ctx_t *ctx, ap_filter_t *f, int http_error)
static int form_header_field(header_struct *h, const char *fieldname, const char *fieldval)
static void fixup_vary(request_rec *r)
static void basic_http_header(request_rec *r, apr_bucket_brigade *bb, const char *protocol)
static apr_status_t read_chunked_trailers(http_ctx_t *ctx, ap_filter_t *f, apr_bucket_brigade *b, int merge)
static APR_INLINE int check_headers(request_rec *r)
static apr_status_t validate_status_line(request_rec *r)
mod_core private header file
A bucket referring to an HTTP error.
The representation of a filter chain.
apr_bucket_alloc_t * bucket_alloc
Structure to store things which are per connection.
ap_conn_keepalive_e keepalive
struct apr_bucket_alloc_t * bucket_alloc
Per-request configuration.
enum http_filter_ctx::@17 state
A structure that represents the current request.
apr_array_header_t * content_languages
const char * content_type
apr_table_t * trailers_in
struct ap_filter_t * output_filters
apr_table_t * err_headers_out
struct ap_filter_t * input_filters
struct ap_conf_vector_t * request_config
apr_table_t * subprocess_env
const char * content_encoding
apr_table_t * headers_out
struct ap_conf_vector_t * module_config
Utilities for EBCDIC conversion.
ap_input_mode_t
input filtering modes
Apache date-time handling functions.