[Webkit-unassigned] [Bug 259282] New: WebSocket connections via HTTP proxy with scheme ws:// do not use CONNECT method

bugzilla-daemon at webkit.org bugzilla-daemon at webkit.org
Mon Jul 17 11:15:29 PDT 2023


https://bugs.webkit.org/show_bug.cgi?id=259282

            Bug ID: 259282
           Summary: WebSocket connections via HTTP proxy with scheme ws://
                    do not use CONNECT method
           Product: WebKit
           Version: WebKit Local Build
          Hardware: PC
                OS: Linux
            Status: NEW
          Severity: Normal
          Priority: P2
         Component: New Bugs
          Assignee: webkit-unassigned at lists.webkit.org
          Reporter: james at mabl.com

RFC-6455 Section 4.1 (https://datatracker.ietf.org/doc/html/rfc6455#section-4.1) specifies that when the client is configured to use a proxy, the CONNECT method should be used to establish the WebSocket connection.  This section does not differentiate between ws and wss schemes, so the implication is that CONNECT should be used for _all_ WebSocket connections when the client is configured to use a proxy.  WebKit uses CONNECT for wss:// URLs, but for ws:// URLs it issues a normal GET request to the proxy using the absolute URI of the server in the request line.  By contrast, Firefox and Chrome use CONNECT regardless of whether the WebSocket URL scheme is ws or wss.  I've tested this with a local build with version WebKitGTK 2.41.6 (265776 at main).  The problem with using GET rather than CONNECT is that some proxies that strictly conform to RFC-6455 will reject these GET requests.  One such example is mitmproxy (https://github.com/mitmproxy/mitmproxy), which returns an error code and complains about an invalid request scheme.

For reference, below is an example request/response log showing what happens when WebKit is configured to connect to a ws:// URL via mitmproxy:

> GET ws://192.168.122.1:8888/ HTTP/1.1
> Host: 192.168.122.1:8888
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.4 Safari/605.1.15
> Origin: http://192.168.122.1:8888
> Pragma: no-cache
> Cache-Control: no-cache
> Upgrade: websocket
> Connection: Upgrade
> Sec-WebSocket-Key: Jed6Wvk9oJQvBqlfYCKTiw==
> Sec-WebSocket-Version: 13
> Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
> Accept-Encoding: gzip, deflate
> Accept-Language: en-US
> 
> HTTP/1.1 502 Bad Gateway
> content-length: 26
> 
> Invalid request scheme: ws

For comparison, here is the same request/response using Firefox (note that it uses CONNECT and then a subsequent GET request with a relative URI):

> CONNECT 192.168.122.1:8888 HTTP/1.1
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0
> Proxy-Connection: keep-alive
> Connection: keep-alive
> Host: 192.168.122.1:8888
> 
> HTTP/1.1 200 Connection established
> 
> GET / HTTP/1.1
> Host: 192.168.122.1:8888
> User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/113.0
> Accept: */*
> Accept-Language: en-US,en;q=0.5
> Accept-Encoding: gzip, deflate
> Sec-WebSocket-Version: 13
> Origin: http://192.168.122.1:8888
> Sec-WebSocket-Extensions: permessage-deflate
> Sec-WebSocket-Key: /Uzba02mhelEhLMsoObx9Q==
> Connection: keep-alive, Upgrade
> Pragma: no-cache
> Cache-Control: no-cache
> Upgrade: websocket
> 
> HTTP/1.1 101 Switching Protocols
> Upgrade: websocket
> Connection: Upgrade
> Sec-WebSocket-Accept: Cr3XgX2NzWNx/mvS1CDZeuknHhU=

It should be easy to reproduce this issue by installing mitmproxy and starting it up locally.  The way I prefer to do this is:
> mitmdump -k -p 8080
Next, start WebKit and configure it to connect via mitmproxy:
> Tools/Scripts/run-minibrowser --gtk --proxy='http://localhost:8080'
The last piece that is needed is a server that accepts WebSocket connections over HTTP.  I've created a very simple node-based HTTP/WebSocket server for testing scenarios like this.  It includes a basic UI that can be used to initiate the WebSocket connection.  You can access that code here: https://github.com/jbaldassari/websocket-echo
> npm ci
> npm run build
> HTTP_PORT=8888 node build/index.js

-- 
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-unassigned/attachments/20230717/96c62e3d/attachment.htm>


More information about the webkit-unassigned mailing list