diff --git a/Sources/WebSocketKit/WebSocket+Connect.swift b/Sources/WebSocketKit/WebSocket+Connect.swift index 5fe0fed..474ac8c 100644 --- a/Sources/WebSocketKit/WebSocket+Connect.swift +++ b/Sources/WebSocketKit/WebSocket+Connect.swift @@ -193,6 +193,7 @@ extension WebSocket { proxyPort: proxyPort, proxyHeaders: proxyHeaders, proxyConnectDeadline: proxyConnectDeadline, + configuration: configuration, on: eventLoopGroup, onUpgrade: onUpgrade ) diff --git a/Sources/WebSocketKit/WebSocketClient.swift b/Sources/WebSocketKit/WebSocketClient.swift index e952190..389dc9f 100644 --- a/Sources/WebSocketKit/WebSocketClient.swift +++ b/Sources/WebSocketKit/WebSocketClient.swift @@ -116,11 +116,14 @@ public final class WebSocketClient: Sendable { uri = path } else { let relativePath = path.hasPrefix("/") ? path : "/" + path - let port = proxyPort.map { ":\($0)" } ?? "" - uri = "\(scheme)://\(host)\(relativePath)\(port)" - + // ws: use absolute-form (full URI) for direct proxy connection; + // wss: use origin-form (path only) after CONNECT tunnel is established per RFC 7230 if scheme == "ws" { + let port = proxyPort.map { ":\($0)" } ?? "" + uri = "\(scheme)://\(host)\(port)\(relativePath)" upgradeRequestHeaders.add(contentsOf: proxyHeaders) + } else { + uri = relativePath } } diff --git a/Tests/WebSocketKitTests/WebSocketKitTests.swift b/Tests/WebSocketKitTests/WebSocketKitTests.swift index 4be932e..0ebe426 100644 --- a/Tests/WebSocketKitTests/WebSocketKitTests.swift +++ b/Tests/WebSocketKitTests/WebSocketKitTests.swift @@ -348,7 +348,7 @@ final class WebSocketKitTests: XCTestCase { let localWebsocketBin: WebsocketBin let verifyProxyHead = { @Sendable (ctx: ChannelHandlerContext, requestHead: HTTPRequestHead) in - XCTAssertEqual(requestHead.uri, "ws://apple.com/:\(ctx.localAddress!.port!)") + XCTAssertEqual(requestHead.uri, "ws://apple.com:\(ctx.localAddress!.port!)/") XCTAssertEqual(requestHead.headers.first(name: "Host"), "apple.com") } localWebsocketBin = WebsocketBin(