summaryrefslogtreecommitdiff
path: root/modules/http2
diff options
context:
space:
mode:
authorStefan Eissing <icing@apache.org>2016-06-10 15:27:34 +0000
committerStefan Eissing <icing@apache.org>2016-06-10 15:27:34 +0000
commit9aa3dd7bb825dd606c85f4ac49e8dbf7c225ebac (patch)
treeec9fc94117bddfd255c5f4569cbafb1eb9e25b45 /modules/http2
parentfb0a9188624a03019db152c4e6cf908307ca5f0f (diff)
downloadhttpd-9aa3dd7bb825dd606c85f4ac49e8dbf7c225ebac.tar.gz
mod_proxy_http2: fix flow control when frontend connection is HTTP/1.1, patch by Evgeny Kotkov
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1747735 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'modules/http2')
-rw-r--r--modules/http2/h2_proxy_session.c16
-rw-r--r--modules/http2/h2_proxy_session.h2
-rw-r--r--modules/http2/mod_proxy_http2.c2
3 files changed, 15 insertions, 5 deletions
diff --git a/modules/http2/h2_proxy_session.c b/modules/http2/h2_proxy_session.c
index 2608a1d4c4..b7dadca147 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/mod_proxy_http2.c b/modules/http2/mod_proxy_http2.c
index e9c592bd45..8c8873059f 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)",