Follow up to [1] based on users@ experience...

On Fri, Apr 17, 2015 at 3:38 PM, Marc Hörsken <i...@marc-hoersken.de> wrote:
>
> I just figured out the configuration issue causing my problem.
>
> Original configuration mod_proxy_wstunnel with SwampDragon:
>
> ProxyPass /data/ ws://127.0.0.1:9001/data/
> ProxyPassReverse /data/ ws://127.0.0.1:9001/data/
> ProxyPass /settings.js http://127.0.0.1:9001/settings.js
> ProxyPassReverse /settings.js http://127.0.0.1:9001/settings.js
> ProxyPreserveHost On
> ProxyRequests Off
> ProxyVia On
>
> The following configuration for mod_proxy_wstunnel with SwampDragon works 
> fine:
>
> ProxyPassMatch /data/(\d+)/(\w+)/websocket 
> ws://127.0.0.1:9001/data/$1/$2/websocket
> ProxyPass /data/info http://127.0.0.1:9001/data/info
> ProxyPassReverse /data/info http://127.0.0.1:9001/data/info
> ProxyPass /settings.js http://127.0.0.1:9001/settings.js
> ProxyPassReverse /settings.js http://127.0.0.1:9001/settings.js
> ProxyPreserveHost On
> ProxyRequests Off
> ProxyVia On
>
> The issue was caused by the fact that /data/info is requested before a 
> WebSocket-upgrade
> request to /data/(\d+)/(\w+)/websocket is performed. Because /data/info was 
> redirected to
> the WebSocket-server using the same rule as /data/(\d+)/(\w+)/websocket 
> before,
> mod_proxy_wstunnel continued to also forward all HTTP-traffic to the 
> WebSocket-server.
>

As already proposed in [1], shouldn't mod_proxy_wstunnel should
DECLINE[D] the request if it is not an "Upgrade: WebSocket" one?

This could possibly simplify the configuration above to:
  ProxyPass / ws://127.0.0.1:9001/
  ProxyPass / http://127.0.0.1:9001/

The patch would be something like:

Index: modules/proxy/mod_proxy_wstunnel.c
===================================================================
--- modules/proxy/mod_proxy_wstunnel.c    (revision 1665828)
+++ modules/proxy/mod_proxy_wstunnel.c    (working copy)
@@ -305,7 +320,7 @@ static int proxy_wstunnel_handler(request_rec *r,
     int status;
     char server_portstr[32];
     proxy_conn_rec *backend = NULL;
-    char *scheme;
+    const char *scheme, *upgrade;
     int retry;
     conn_rec *c = r->connection;
     apr_pool_t *p = r->pool;
@@ -324,6 +339,25 @@ static int proxy_wstunnel_handler(request_rec *r,
         return DECLINED;
     }

+    upgrade = apr_table_get(r->headers_in, "Connection");
+    if (upgrade) {
+        if (strcasecmp(upgrade, "Upgrade") != 0) {
+            upgrade = NULL;
+        }
+        else {
+            upgrade = apr_table_get(r->headers_in, "Upgrade");
+            if (upgrade && strcasecmp(upgrade, "WebSocket") != 0) {
+                upgrade = NULL;
+            }
+        }
+    }
+    if (!upgrade) {
+        ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
+                      APLOGNO() "%s: declining URL %s (not WebSocket)",
+                      scheme, url);
+        return DECLINED;
+    }
+
     uri = apr_palloc(p, sizeof(*uri));
     ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(02451)
"serving URL %s", url);

--

[1] 
https://mail-archives.apache.org/mod_mbox/httpd-dev/201503.mbox/%3CCAKQ1sVPq-9cqS4zKvfwuC5Hi1mXZ=pkfuxrqsv2lexsnrzd...@mail.gmail.com%3E

Reply via email to