diff --git a/src/ws.nim b/src/ws.nim index d255ad3..234e944 100644 --- a/src/ws.nim +++ b/src/ws.nim @@ -120,10 +120,12 @@ proc newWebSocket*( proc newWebSocket*( url: string, - protocols: seq[string] = @[] + protocols: seq[string] = @[], + extraHeaders: seq[(string, string)] = @[], ): Future[WebSocket] {.async.} = ## Creates a new WebSocket connection, ## protocol is optional, "" means no protocol. + ## extra headers is optional var ws = WebSocket() ws.masked = true ws.tcpSocket = newAsyncSocket() @@ -160,6 +162,13 @@ proc newWebSocket*( "Sec-WebSocket-Key": secKey, # "Sec-WebSocket-Extensions": "permessage-deflate; client_max_window_bits" }) + + if extraHeaders.len > 0: + # Insert the extra headers + for pairs in extraHeaders: + let (exHeader, exHeaderValue) = pairs + client.headers[exHeader] = exHeaderValue + if protocols.len > 0: client.headers["Sec-WebSocket-Protocol"] = protocols.join(", ") var res = await client.get($uri) diff --git a/tests/test_ws_extra_headers.nim b/tests/test_ws_extra_headers.nim new file mode 100644 index 0000000..1968868 --- /dev/null +++ b/tests/test_ws_extra_headers.nim @@ -0,0 +1,24 @@ +include ../src/ws + +# Start server +proc cb(req: Request) {.async.} = + var ws = await newWebSocket(req) + if req.headers.hasKey("Authorization") and req.headers["Authorization"] == "Basic Zm9vOmJhcg==": + await ws.send("Welcome") + else: + await ws.send("Bad Credential") + ws.close() + +var server = newAsyncHttpServer() +asyncCheck server.serve(Port(9001), cb) + +# Send request +let extraHeaders = @[("Authorization", "Basic Zm9vOmJhcg==")] # Base64 foo:bar +let url = "ws://127.0.0.1:9001/ws" +var ws = waitFor newWebSocket(url = url, extraHeaders = extraHeaders) +let packet = waitFor ws.receiveStrPacket() + +assert packet == "Welcome" + +ws.close() +server.close() diff --git a/ws.nimble b/ws.nimble index 0aaee86..f8352bf 100644 --- a/ws.nimble +++ b/ws.nimble @@ -1,6 +1,6 @@ # Package -version = "0.5.0" +version = "0.5.1" author = "Andre von Houck" description = "Simple WebSocket library for nim." license = "MIT"