From a28d3fdf6309fce29d76a825420014921af1d56d Mon Sep 17 00:00:00 2001 From: Stefan Eissing Date: Wed, 19 Dec 2018 12:57:05 +0000 Subject: [PATCH] mod_http2: mergine trunk+2.4.x code divergences back into a single source with proper MMN checks. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1849296 13f79535-47bb-0310-9956-ffa450edef68 --- modules/http2/h2_conn.c | 7 ++++ modules/http2/h2_h2.c | 2 -- modules/http2/h2_request.c | 64 +++++++++++++++++++++++++++++++++ modules/http2/h2_version.h | 4 +-- modules/http2/mod_proxy_http2.c | 5 +++ 5 files changed, 78 insertions(+), 4 deletions(-) diff --git a/modules/http2/h2_conn.c b/modules/http2/h2_conn.c index fd3a2813ad..827217d903 100644 --- a/modules/http2/h2_conn.c +++ b/modules/http2/h2_conn.c @@ -18,6 +18,7 @@ #include #include +#include #include #include @@ -315,8 +316,14 @@ conn_rec *h2_slave_create(conn_rec *master, int slave_id, apr_pool_t *parent) c->notes = apr_table_make(pool, 5); c->input_filters = NULL; c->output_filters = NULL; +#if AP_MODULE_MAGIC_AT_LEAST(20180903, 1) c->filter_conn_ctx = NULL; +#endif c->bucket_alloc = apr_bucket_alloc_create(pool); +#if !AP_MODULE_MAGIC_AT_LEAST(20180720, 1) + c->data_in_input_filters = 0; + c->data_in_output_filters = 0; +#endif /* prevent mpm_event from making wrong assumptions about this connection, * like e.g. using its socket for an async read check. */ c->clogging_input_filters = 1; diff --git a/modules/http2/h2_h2.c b/modules/http2/h2_h2.c index 0e87b03f71..5580cefde1 100644 --- a/modules/http2/h2_h2.c +++ b/modules/http2/h2_h2.c @@ -60,7 +60,6 @@ const char *H2_MAGIC_TOKEN = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"; /******************************************************************************* * The optional mod_ssl functions we need. */ -static APR_OPTIONAL_FN_TYPE(ssl_engine_disable) *opt_ssl_engine_disable; static APR_OPTIONAL_FN_TYPE(ssl_is_https) *opt_ssl_is_https; static APR_OPTIONAL_FN_TYPE(ssl_var_lookup) *opt_ssl_var_lookup; @@ -446,7 +445,6 @@ apr_status_t h2_h2_init(apr_pool_t *pool, server_rec *s) { (void)pool; ap_log_error(APLOG_MARK, APLOG_TRACE1, 0, s, "h2_h2, child_init"); - opt_ssl_engine_disable = APR_RETRIEVE_OPTIONAL_FN(ssl_engine_disable); opt_ssl_is_https = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https); opt_ssl_var_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup); diff --git a/modules/http2/h2_request.c b/modules/http2/h2_request.c index 535c73d2cc..5858f1db96 100644 --- a/modules/http2/h2_request.c +++ b/modules/http2/h2_request.c @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -206,13 +207,75 @@ h2_request *h2_request_clone(apr_pool_t *p, const h2_request *src) return dst; } +#if !AP_MODULE_MAGIC_AT_LEAST(20150222, 13) +static request_rec *my_ap_create_request(conn_rec *c) +{ + apr_pool_t *p; + request_rec *r; + + apr_pool_create(&p, c->pool); + apr_pool_tag(p, "request"); + r = apr_pcalloc(p, sizeof(request_rec)); + AP_READ_REQUEST_ENTRY((intptr_t)r, (uintptr_t)c); + r->pool = p; + r->connection = c; + r->server = c->base_server; + + r->user = NULL; + r->ap_auth_type = NULL; + + r->allowed_methods = ap_make_method_list(p, 2); + + r->headers_in = apr_table_make(r->pool, 5); + r->trailers_in = apr_table_make(r->pool, 5); + r->subprocess_env = apr_table_make(r->pool, 25); + r->headers_out = apr_table_make(r->pool, 12); + r->err_headers_out = apr_table_make(r->pool, 5); + r->trailers_out = apr_table_make(r->pool, 5); + r->notes = apr_table_make(r->pool, 5); + + r->request_config = ap_create_request_config(r->pool); + /* Must be set before we run create request hook */ + + r->proto_output_filters = c->output_filters; + r->output_filters = r->proto_output_filters; + r->proto_input_filters = c->input_filters; + r->input_filters = r->proto_input_filters; + ap_run_create_request(r); + r->per_dir_config = r->server->lookup_defaults; + + r->sent_bodyct = 0; /* bytect isn't for body */ + + r->read_length = 0; + r->read_body = REQUEST_NO_BODY; + + r->status = HTTP_OK; /* Until further notice */ + r->header_only = 0; + r->the_request = NULL; + + /* Begin by presuming any module can make its own path_info assumptions, + * until some module interjects and changes the value. + */ + r->used_path_info = AP_REQ_DEFAULT_PATH_INFO; + + r->useragent_addr = c->client_addr; + r->useragent_ip = c->client_ip; + + return r; +} +#endif + request_rec *h2_request_create_rec(const h2_request *req, conn_rec *c) { int access_status = HTTP_OK; const char *rpath; const char *s; +#if AP_MODULE_MAGIC_AT_LEAST(20150222, 13) request_rec *r = ap_create_request(c); +#else + request_rec *r = my_ap_create_request(c); +#endif r->headers_in = apr_table_clone(r->pool, req->headers); @@ -291,3 +354,4 @@ traceout: } + diff --git a/modules/http2/h2_version.h b/modules/http2/h2_version.h index e15fa757e6..4ddfc9dd91 100644 --- a/modules/http2/h2_version.h +++ b/modules/http2/h2_version.h @@ -27,7 +27,7 @@ * @macro * Version number of the http2 module as c string */ -#define MOD_HTTP2_VERSION "1.11.4-DEV" +#define MOD_HTTP2_VERSION "1.12.0-DEV" /** * @macro @@ -35,7 +35,7 @@ * release. This is a 24 bit number with 8 bits for major number, 8 bits * for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203. */ -#define MOD_HTTP2_VERSION_NUM 0x010b04 +#define MOD_HTTP2_VERSION_NUM 0x010c00 #endif /* mod_h2_h2_version_h */ diff --git a/modules/http2/mod_proxy_http2.c b/modules/http2/mod_proxy_http2.c index 92413090b6..21f8e1d1f9 100644 --- a/modules/http2/mod_proxy_http2.c +++ b/modules/http2/mod_proxy_http2.c @@ -16,6 +16,7 @@ #include +#include #include #include #include "mod_http2.h" @@ -604,7 +605,9 @@ reconnect: /* Still more to do, tear down old conn and start over */ if (ctx->p_conn) { ctx->p_conn->close = 1; +#if AP_MODULE_MAGIC_AT_LEAST(20140207, 2) proxy_run_detach_backend(r, ctx->p_conn); +#endif ap_proxy_release_connection(ctx->proxy_func, ctx->p_conn, ctx->server); ctx->p_conn = NULL; } @@ -623,7 +626,9 @@ cleanup: /* close socket when errors happened or session shut down (EOF) */ ctx->p_conn->close = 1; } +#if AP_MODULE_MAGIC_AT_LEAST(20140207, 2) proxy_run_detach_backend(ctx->rbase, ctx->p_conn); +#endif ap_proxy_release_connection(ctx->proxy_func, ctx->p_conn, ctx->server); ctx->p_conn = NULL; } -- 2.50.1