Add logic to read the Upgrade header and use it in the response.

Use we you are proxying to a server that has multiple upgrade on the same IP/Port.
PR 61142


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1801594 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jean-Frederic Clere
2017-07-11 11:41:44 +00:00
parent 751964ab98
commit de15a34dc8
2 changed files with 9 additions and 2 deletions

View File

@ -55,7 +55,9 @@ ProxyPass "/wss2/" "wss://echo.websocket.org/"
<p>In fact the module can be used to upgrade to other protocols, you can set the <code>upgrade</code> <p>In fact the module can be used to upgrade to other protocols, you can set the <code>upgrade</code>
parameter in the <directive type="ProxyPass" module="mod_proxy">ProxyPass</directive> parameter in the <directive type="ProxyPass" module="mod_proxy">ProxyPass</directive>
directive to allow the module to accept other protocol. directive to allow the module to accept other protocol.
NONE means you bypass the check for the header but still upgrade to WebSocket.</p> NONE means you bypass the check for the header but still upgrade to WebSocket.
ANY means that <code>Upgrade</code> will read in the request headers and use
in the response <code>Upgrade</code></p>
</summary> </summary>
<seealso><module>mod_proxy</module></seealso> <seealso><module>mod_proxy</module></seealso>

View File

@ -329,6 +329,10 @@ static int proxy_wstunnel_request(apr_pool_t *p, request_rec *r,
if (ap_cstr_casecmp(upgrade_method, "NONE") == 0) { if (ap_cstr_casecmp(upgrade_method, "NONE") == 0) {
buf = apr_pstrdup(p, "Upgrade: WebSocket" CRLF "Connection: Upgrade" CRLF CRLF); buf = apr_pstrdup(p, "Upgrade: WebSocket" CRLF "Connection: Upgrade" CRLF CRLF);
} else if (ap_cstr_casecmp(upgrade_method, "ANY") == 0) {
const char *upgrade;
upgrade = apr_table_get(r->headers_in, "Upgrade");
buf = apr_pstrcat(p, "Upgrade: ", upgrade, CRLF "Connection: Upgrade" CRLF CRLF, NULL);
} else { } else {
buf = apr_pstrcat(p, "Upgrade: ", upgrade_method, CRLF "Connection: Upgrade" CRLF CRLF, NULL); buf = apr_pstrcat(p, "Upgrade: ", upgrade_method, CRLF "Connection: Upgrade" CRLF CRLF, NULL);
} }
@ -473,7 +477,8 @@ static int proxy_wstunnel_handler(request_rec *r, proxy_worker *worker,
if (ap_cstr_casecmp(upgrade_method, "NONE") != 0) { if (ap_cstr_casecmp(upgrade_method, "NONE") != 0) {
const char *upgrade; const char *upgrade;
upgrade = apr_table_get(r->headers_in, "Upgrade"); upgrade = apr_table_get(r->headers_in, "Upgrade");
if (!upgrade || ap_cstr_casecmp(upgrade, upgrade_method) != 0) { if (!upgrade || (ap_cstr_casecmp(upgrade, upgrade_method) != 0 &&
ap_cstr_casecmp(upgrade_method, "ANY") !=0)) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02900) ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02900)
"declining URL %s (not %s, Upgrade: header is %s)", "declining URL %s (not %s, Upgrade: header is %s)",
url, upgrade_method, upgrade ? upgrade : "missing"); url, upgrade_method, upgrade ? upgrade : "missing");