From d279bd3bc4e75b22717bc20ddc744d827551cf85 Mon Sep 17 00:00:00 2001 From: Stefan Eissing <icing@apache.org> Date: Mon, 13 Jun 2016 09:58:07 +0000 Subject: [PATCH] Merge of r1747735 from trunk: mod_proxy_http2: properly care for HTTP2 flow control of the frontend connection is HTTP/1.1. [Patch supplied by Evgeny Kotkov] git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1748168 13f79535-47bb-0310-9956-ffa450edef68 --- CHANGES | 3 +++ modules/http2/h2_proxy_session.c | 16 +++++++++++++--- modules/http2/h2_proxy_session.h | 2 +- modules/http2/h2_version.h | 4 ++-- modules/http2/mod_proxy_http2.c | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index ec9512bbd6..e8a4ba66eb 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ Changes with Apache 2.4.21 + *) mod_proxy_http2: properly care for HTTP2 flow control of the frontend + connection is HTTP/1.1. [Patch supplied by Evgeny Kotkov] + *) mod_http2: improved cleanup of connection/streams/tasks to always have deterministic order regardless of event initiating it. Addresses reported crashes due to memory read after free issues. diff --git a/modules/http2/h2_proxy_session.c b/modules/http2/h2_proxy_session.c index 34b584909d..919fe4a4c3 100644 --- a/modules/http2/h2_proxy_session.c +++ b/modules/http2/h2_proxy_session.c @@ -36,6 +36,7 @@ typedef struct h2_proxy_stream { const char *url; request_rec *r; h2_request *req; + int standalone; h2_stream_state_t state; unsigned int suspended : 1; @@ -370,6 +371,12 @@ static int on_data_chunk_recv(nghttp2_session *ngh2, uint8_t flags, stream_id, NGHTTP2_STREAM_CLOSED); return NGHTTP2_ERR_STREAM_CLOSING; } + if (stream->standalone) { + nghttp2_session_consume(ngh2, stream_id, len); + ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, stream->r, + "h2_proxy_session(%s): stream %d, win_update %d bytes", + session->id, stream_id, (int)len); + } return 0; } @@ -576,7 +583,8 @@ static apr_status_t session_start(h2_proxy_session *session) } static apr_status_t open_stream(h2_proxy_session *session, const char *url, - request_rec *r, h2_proxy_stream **pstream) + request_rec *r, int standalone, + h2_proxy_stream **pstream) { h2_proxy_stream *stream; apr_uri_t puri; @@ -588,6 +596,7 @@ static apr_status_t open_stream(h2_proxy_session *session, const char *url, stream->pool = r->pool; stream->url = url; stream->r = r; + stream->standalone = standalone; stream->session = session; stream->state = H2_STREAM_ST_IDLE; @@ -761,12 +770,13 @@ static apr_status_t h2_proxy_session_read(h2_proxy_session *session, int block, } apr_status_t h2_proxy_session_submit(h2_proxy_session *session, - const char *url, request_rec *r) + const char *url, request_rec *r, + int standalone) { h2_proxy_stream *stream; apr_status_t status; - status = open_stream(session, url, r, &stream); + status = open_stream(session, url, r, standalone, &stream); if (status == APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(03381) "process stream(%d): %s %s%s, original: %s", diff --git a/modules/http2/h2_proxy_session.h b/modules/http2/h2_proxy_session.h index 52be5c6b37..7f0a194097 100644 --- a/modules/http2/h2_proxy_session.h +++ b/modules/http2/h2_proxy_session.h @@ -89,7 +89,7 @@ h2_proxy_session *h2_proxy_session_setup(const char *id, proxy_conn_rec *p_conn, h2_proxy_request_done *done); apr_status_t h2_proxy_session_submit(h2_proxy_session *s, const char *url, - request_rec *r); + request_rec *r, int standalone); /** * Perform a step in processing the proxy session. Will return aftert diff --git a/modules/http2/h2_version.h b/modules/http2/h2_version.h index 8fac3beb1f..2b9ef754e6 100644 --- a/modules/http2/h2_version.h +++ b/modules/http2/h2_version.h @@ -26,7 +26,7 @@ * @macro * Version number of the http2 module as c string */ -#define MOD_HTTP2_VERSION "1.5.8" +#define MOD_HTTP2_VERSION "1.5.9" /** * @macro @@ -34,7 +34,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 0x010508 +#define MOD_HTTP2_VERSION_NUM 0x010509 #endif /* mod_h2_h2_version_h */ diff --git a/modules/http2/mod_proxy_http2.c b/modules/http2/mod_proxy_http2.c index d551f24e81..7dfee7083a 100644 --- a/modules/http2/mod_proxy_http2.c +++ b/modules/http2/mod_proxy_http2.c @@ -258,7 +258,7 @@ static apr_status_t add_request(h2_proxy_session *session, request_rec *r) url = apr_table_get(r->notes, H2_PROXY_REQ_URL_NOTE); apr_table_setn(r->notes, "proxy-source-port", apr_psprintf(r->pool, "%hu", ctx->p_conn->connection->local_addr->port)); - status = h2_proxy_session_submit(session, url, r); + status = h2_proxy_session_submit(session, url, r, ctx->standalone); if (status != APR_SUCCESS) { ap_log_cerror(APLOG_MARK, APLOG_ERR, status, r->connection, APLOGNO(03351) "pass request body failed to %pI (%s) from %s (%s)", -- 2.40.0