46#if AP_HAS_RESPONSE_BUCKETS
65 if (
resp->status >= 400 &&
f->r->prev) {
86 "h2_c2_filter_notes_out, turning PUSH off");
124 "h2_c2_filter_request_in(%s): adding request bucket",
132 "h2_c2_filter_request_in(%s): adding error bucket %d",
153#define H2_FILTER_LOG(name, c, level, rv, msg, bb) \
155 if (APLOG_C_IS_LEVEL((c),(level))) { \
156 char buffer[4 * 1024]; \
157 apr_size_t len, bmax = sizeof(buffer)/sizeof(buffer[0]); \
158 len = h2_util_bb_print(buffer, bmax, "", "", (bb)); \
159 ap_log_cerror(APLOG_MARK, (level), rv, (c), \
160 "FILTER[%s]: %s %s", \
161 (name), (msg), len? buffer : ""); \
214 }
while (*
e !=
'\0');
396 if (line[0] ==
' ' || line[0] ==
'\t') {
399 while (line[0] ==
' ' || line[0] ==
'\t') {
443 "h2_c2(%s): read response line: %s",
464 "h2_c2(%s): read response, line too long",
470 "h2_c2(%s): read response, incomplete line: %s",
503 for (
i = 0;
i < hlines->
nelts; ++
i) {
508 APLOGNO(02955)
"h2_c2(%s): invalid header[%d] '%s'",
514 while (*
sep ==
' ' || *
sep ==
'\t') {
550 if (response->
status >= 200) {
554 APLOGNO(03197)
"h2_c2(%s): passed response %d",
581 "h2_c2(%s): unable to parse status line: %s",
609 else if (line[0] ==
'\0') {
612 "h2_c2(%s): end of response",
parser->id);
617 "h2_c2(%s): response header %s",
parser->id, line);
638 if (!
f->c->aborted && !
conn_ctx->has_final_response) {
668 while (bb && !
f->c->aborted && !
conn_ctx->has_final_response) {
671 "h2_c2(%s): parsed response",
parser->id);
696 if (!
conn_ctx->has_final_response) {
712 "h2_c2(%s): eoc bucket passed",
conn_ctx->id);
727 "h2_c2(%s): err bucket status=%d",
740 if (response ==
NULL) {
742 "h2_c2(%s): unable to create response",
conn_ctx->id);
761 "h2_c2(%s): headers only, cleanup output brigade",
conn_ctx->id);
816 "h2_c2(%s): added chunk %ld, total %ld",
865 "h2_c2(%s-%d): receiving trailers",
885 "h2_c2(%s-%d): receiving eos",
896 else if (
b->length == 0) {
939 "h2_c2(%s-%d): request input, mode=%d, block=%d, "
940 "readbytes=%ld, exp=%d",
953 "h2_c2(%s-%d): receiving trailers",
1003 "h2_c2(%s-%d): getline: %s",
1012 "h2_c2, unsupported READ mode %d",
mode);
1040 "h2_c2(%s-%d): sending trailers",
const char apr_size_t len
APR general purpose library routines.
apr_size_t const unsigned char unsigned int unsigned int d
#define ap_get_module_config(v, m)
#define AP_BUCKET_IS_EOC(e)
#define HTTP_VERSION(major, minor)
const char * ap_get_server_banner(void)
void ap_remove_input_filter(ap_filter_t *f)
apr_status_t ap_pass_brigade(ap_filter_t *filter, apr_bucket_brigade *bucket)
apr_status_t ap_remove_output_filter_byhandle(ap_filter_t *next, const char *handle)
apr_status_t ap_save_brigade(ap_filter_t *f, apr_bucket_brigade **save_to, apr_bucket_brigade **b, apr_pool_t *p)
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)
int ap_map_http_request_error(apr_status_t rv, int status)
int ap_set_keepalive(request_rec *r)
const char * ap_make_content_type(request_rec *r, const char *type)
#define AP_BUCKET_IS_ERROR(e)
apr_bucket * ap_bucket_error_create(int error, const char *buf, apr_pool_t *p, apr_bucket_alloc_t *list)
#define AP_BUCKET_IS_EOR(e)
apr_bucket * ap_bucket_eor_create(apr_bucket_alloc_t *list, request_rec *r)
void ap_die(int type, request_rec *r)
apr_status_t ap_recent_rfc822_date(char *date_str, apr_time_t t)
#define APR_BUCKET_IS_FLUSH(e)
#define APR_BUCKET_REMOVE(e)
#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_CONCAT(a, b)
#define APR_BRIGADE_EMPTY(b)
#define APR_BRIGADE_SENTINEL(b)
#define APR_BUCKET_IS_EOS(e)
apr_brigade_flush void * ctx
#define APR_BRIGADE_FIRST(b)
#define APR_BUCKET_INSERT_BEFORE(a, b)
#define apr_bucket_destroy(e)
apr_dbd_transaction_t int mode
const char apr_hash_t ** values
#define AP_STATUS_IS_HEADER_ONLY(x)
#define HTTP_INTERNAL_SERVER_ERROR
char * ap_get_list_item(apr_pool_t *p, const char **field)
apr_array_header_t ** result
apr_vformatter_buff_t * c
#define apr_pcalloc(p, size)
#define APR_ARRAY_PUSH(ary, type)
const apr_array_header_t * first
apr_int32_t apr_int32_t apr_int32_t err
#define APR_RFC822_DATE_LEN
#define H2_PUSH_MODE_NOTE
#define H2_HTTP_STATUS_UNSET
apr_OFN_ap_logio_add_bytes_in_t * h2_c_logio_add_bytes_in
#define H2_FILTER_LOG(name, c, level, rv, msg, bb)
static int uniq_field_values(void *d, const char *key, const char *val)
static apr_status_t parse_status(h2_response_parser *parser, char *line)
apr_status_t h2_c2_filter_response_out(ap_filter_t *f, apr_bucket_brigade *bb)
static void fix_vary(request_rec *r)
static h2_headers * create_response(request_rec *r)
static apr_status_t read_and_chunk(ap_filter_t *f, h2_conn_ctx_t *conn_ctx, apr_read_type_e block)
static apr_status_t pass_response(h2_conn_ctx_t *conn_ctx, ap_filter_t *f, h2_response_parser *parser)
static apr_status_t get_line(h2_response_parser *parser, apr_bucket_brigade *bb, char *line, apr_size_t len)
static apr_status_t parse_header(h2_response_parser *parser, char *line)
apr_status_t h2_c2_filter_trailers_out(ap_filter_t *f, apr_bucket_brigade *bb)
apr_status_t h2_c2_filter_request_in(ap_filter_t *f, apr_bucket_brigade *bb, ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes)
static int ser_header(void *ctx, const char *name, const char *value)
static apr_table_t * make_table(h2_response_parser *parser)
static apr_status_t parse_response(h2_response_parser *parser, h2_conn_ctx_t *conn_ctx, ap_filter_t *f, apr_bucket_brigade *bb)
static void make_chunk(conn_rec *c, h2_chunk_filter_t *fctx, apr_bucket_brigade *bb, apr_bucket *first, apr_off_t chunk_len, apr_bucket *tail)
apr_status_t h2_c2_filter_catch_h1_out(ap_filter_t *f, apr_bucket_brigade *bb)
int h2_config_rgeti(request_rec *r, h2_config_var_t var)
int h2_config_sgeti(server_rec *s, h2_config_var_t var)
#define h2_conn_ctx_get(c)
request_rec * h2_create_request_rec(const h2_request *req, conn_rec *c, int no_body)
apr_status_t h2_brigade_copy_length(apr_bucket_brigade *dest, apr_bucket_brigade *src, apr_off_t length)
int h2_util_ignore_resp_header(const char *name)
apr_status_t h2_brigade_concat_length(apr_bucket_brigade *dest, apr_bucket_brigade *src, apr_off_t length)
#define h2_util_bb_log(c, sid, level, tag, bb)
const h2_request * h2_ws_rewrite_request(const h2_request *req, conn_rec *c2, int no_body)
Apache connection library.
#define AP_MERGE_TRAILERS_ENABLE
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.
apr_bucket_brigade * bbchunk
apr_bucket_brigade * saveto
apr_array_header_t * hlines
A structure that represents the current request.
apr_array_header_t * content_languages
const char * content_type
apr_table_t * trailers_in
apr_table_t * err_headers_out
apr_table_t * subprocess_env
apr_table_t * trailers_out
const char * content_encoding
apr_table_t * headers_out
struct ap_conf_vector_t * module_config
ap_input_mode_t
input filtering modes
Apache date-time handling functions.