nim-websock/tests/helpers.nim
Dmitriy Ryajov 3923a9be20
Rework (#5)
* Use seq[byte] to store data.

* Working bytes conversion.

* Refactor the code.

* Add test.

* Add websocket test and fix closing handshake.

* Add MsgReader to read data in external buffer.

* rework frame reading

* don't do toTitleCase

* fix examples

* use byte for more comfort

* rework message reading + api

* fix tests

* adding specific exception types

* minor cleanup

* fixing tests

* more tests

* check the fin flag at the correct place

* info for debug

* split data not encoded frames

* more tests

* wip - control messages

* closing flow and more explicit exception handling

* test close and pings

* add tests task to nimble

* adding ci

* change recv semantics

* add frame tests

* remove echo

* better frame tests

* fix

* fix

* handle continuation frames properly

* more close logic handling

* wip tests

* handle close reasons properly

* test control frames encoding

* don't pass ws to event callbacks

* fix masking and use correct base64 encoding

* fix ci

* addressing review comments

* fix client example

* i386 ci fix

* wip ci

* fix reading offset

* don't read if socket closed

* fix ci

* wip

* don't read if socket is closed

Co-authored-by: Arijit Das <arijit@status.im>
Co-authored-by: Arijit Das <arijitad.in@gmail.com>
2021-03-18 09:30:21 -06:00

55 lines
2.0 KiB
Nim

import ../src/ws, chronos, chronicles, httputils, stew/byteutils,
../src/http, unittest, strutils
proc echoCb*(transp: StreamTransport, header: HttpRequestHeader) {.async.} =
debug "Handling request:", uri = header.uri()
if header.uri() == "/ws":
debug "Initiating web socket connection."
try:
var ws = await createServer(header, transp, "myfancyprotocol")
if ws.readyState == Open:
debug "Websocket handshake completed."
else:
error "Failed to open websocket connection."
return
let recvData = await ws.recv()
debug "Server:", state = ws.readyState
await ws.send(recvData)
except WebSocketError:
error "WebSocket error:", exception = getCurrentExceptionMsg()
discard await transp.sendHTTPResponse(HttpVersion11, Http200, "Connection established")
proc sendRecvClientData*(wsClient: WebSocket, msg: string) {.async.} =
try:
await wsClient.send(msg)
let recvData = await wsClient.recv()
debug "Websocket client state: ", state = wsClient.readyState
let dataStr = string.fromBytes(recvData)
require dataStr == msg
except WebSocketError:
error "WebSocket error:", exception = getCurrentExceptionMsg()
proc incorrectProtocolCB*(transp: StreamTransport, header: HttpRequestHeader) {.async.} =
debug "Handling request:", uri = header.uri()
var isErr = false;
if header.uri() == "/ws":
debug "Initiating web socket connection."
try:
var ws = await createServer(header, transp, "myfancyprotocol")
require ws.readyState == ReadyState.Closed
except WebSocketError:
isErr = true;
require contains(getCurrentExceptionMsg(), "Protocol mismatch")
finally:
require isErr == true
discard await transp.sendHTTPResponse(HttpVersion11, Http200, "Connection established")
proc generateData*(num: int64): seq[byte] =
var str = newSeqOfCap[byte](num)
for i in 0 ..< num:
str.add(65)
return str