1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192 |
- discard """
- matrix: "--mm:arc; --mm:arc -d:danger; --mm:refc"
- disabled: "freebsd"
- """
- import httpclient, asynchttpserver, asyncdispatch, asyncfutures
- import net
- import std/asyncnet
- import std/nativesockets
- import std/assertions
- const postBegin = """
- POST / HTTP/1.1
- Transfer-Encoding:chunked
- """
- template genTest(input, expected: string) =
- proc handler(request: Request, future: Future[bool]) {.async, gcsafe.} =
- doAssert(request.body == expected)
- doAssert(request.headers.hasKey("Transfer-Encoding"))
- doAssert(not request.headers.hasKey("Content-Length"))
- future.complete(true)
- await request.respond(Http200, "Good")
- proc sendData(data: string, port: Port) {.async.} =
- var socket = newSocket()
- defer: socket.close()
- socket.connect("127.0.0.1", port)
- socket.send(data)
- proc runTest(): Future[bool] {.async.} =
- var handlerFuture = newFuture[bool]("runTest")
- let data = postBegin & input
- let server = newAsyncHttpServer()
- server.listen(Port(0))
- proc wrapper(request: Request): Future[void] {.gcsafe, closure.} =
- handler(request, handlerFuture)
-
- asyncCheck sendData(data, server.getPort)
- asyncCheck server.acceptRequest(wrapper)
- doAssert await handlerFuture
-
- server.close()
- return true
- doAssert waitFor runTest()
- block:
- const expected = "hello=world"
- const input = ("b\r\n" &
- "hello=world\r\n" &
- "0\r\n" &
- "\r\n")
- genTest(input, expected)
- block:
- const expected = "hello encoding"
- const input = ("e\r\n" &
- "hello encoding\r\n" &
- "0\r\n" &
- "\r\n")
- genTest(input, expected)
- block:
- # https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding
- const expected = "MozillaDeveloperNetwork"
- const input = ("7\r\n" &
- "Mozilla\r\n" &
- "9\r\n" &
- "Developer\r\n" &
- "7\r\n" &
- "Network\r\n" &
- "0\r\n" &
- "\r\n")
- genTest(input, expected)
- block:
- # https://en.wikipedia.org/wiki/Chunked_transfer_encoding#Example
- const expected = "Wikipedia in \r\n\r\nchunks."
- const input = ("4\r\n" &
- "Wiki\r\n" &
- "6\r\n" &
- "pedia \r\n" &
- "E\r\n" &
- "in \r\n" &
- "\r\n" &
- "chunks.\r\n" &
- "0\r\n" &
- "\r\n")
- genTest(input, expected)
|