From e1960c9a2e6bcfa2a71cfe91a6c0d3e4206c4b22 Mon Sep 17 00:00:00 2001 From: Mattia Donami Date: Thu, 7 Apr 2022 10:39:31 +0200 Subject: [PATCH 1/3] Added extra headers param in proc newWebSocket Allowed the creation of WebSocket with personal headers like HTTP Bearer Authentication --- src/ws.nim | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/ws.nim b/src/ws.nim index d255ad3..2f5b032 100644 --- a/src/ws.nim +++ b/src/ws.nim @@ -120,7 +120,8 @@ 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. @@ -160,6 +161,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) From 34d73e36a3ef4d52ed1c7981d7c2d6c11adebeb9 Mon Sep 17 00:00:00 2001 From: Mattia Donami Date: Thu, 7 Apr 2022 13:33:39 +0200 Subject: [PATCH 2/3] Added test for extra headers --- src/ws.nim | 1 + tests/test_ws_extra_headers.nim | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 tests/test_ws_extra_headers.nim diff --git a/src/ws.nim b/src/ws.nim index 2f5b032..234e944 100644 --- a/src/ws.nim +++ b/src/ws.nim @@ -125,6 +125,7 @@ proc newWebSocket*( ): 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() 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() From 43787b5a0b344488f79c2c7e6b5be362fdda6db8 Mon Sep 17 00:00:00 2001 From: Mattia Donami Date: Thu, 14 Apr 2022 17:25:31 +0200 Subject: [PATCH 3/3] update version --- ws.nimble | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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"