diff options
author | vabresto <77133146+vabresto@users.noreply.github.com> | 2021-01-14 14:17:02 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-01-14 20:17:02 +0100 |
commit | a90f7a66edd393f04f12fb2f53ef2a6de553cf6b (patch) | |
tree | 624fea5dcc1a29eee65f2c4a108412194d98082b /lib | |
parent | 1fd4c666dc676e77ce875c835a7372077c40f23e (diff) | |
download | Nim-a90f7a66edd393f04f12fb2f53ef2a6de553cf6b.tar.gz |
Transfer-Encoding:chunked tests (#16678)
* Add tests and fix extra newlines in body * Fixes per comments * Slight rephrase per comments * Improvements per comments * Add getSocket to reduce test flakiness per comment * Remove unused lines from header * Add doc comment to getSocket per comment * Apply witchcraft to replace `discard Future` * Return HTTP 400 on bad encoding in request * Fix runnable example for getSocket * Fix import to fix runnable examples * Even more imports for the example * Better self documenting runnable example * Add missing import * Import from module with correct signature * Resolve port type mismatch
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/asynchttpserver.nim | 27 |
1 files changed, 24 insertions, 3 deletions
diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim index 86688d4b5..df4f97813 100644 --- a/lib/pure/asynchttpserver.nim +++ b/lib/pure/asynchttpserver.nim @@ -43,6 +43,7 @@ runnableExamples: import asyncnet, asyncdispatch, parseutils, uri, strutils import httpcore +import std/private/since export httpcore except parseHeader @@ -71,6 +72,22 @@ type maxBody: int ## The maximum content-length that will be read for the body. maxFDs: int +func getSocket*(a: AsyncHttpServer): AsyncSocket {.since: (1, 5, 1).} = + ## Returns the ``AsyncHttpServer``s internal ``AsyncSocket`` instance. + ## + ## Useful for identifying what port the AsyncHttpServer is bound to, if it + ## was chosen automatically. + runnableExamples: + from asyncdispatch import Port + from asyncnet import getFd + from nativesockets import getLocalAddr, AF_INET + let server = newAsyncHttpServer() + server.listen(Port(0)) # Socket is not bound until this point + let port = getLocalAddr(server.getSocket.getFd, AF_INET)[1] + doAssert uint16(port) > 0 + server.close() + a.socket + proc newAsyncHttpServer*(reuseAddr = true, reusePort = false, maxBody = 8388608): AsyncHttpServer = ## Creates a new ``AsyncHttpServer`` instance. @@ -300,9 +317,13 @@ proc processRequest( break # Read bytesToRead and add to body - # Note we add +2 because the line must be terminated by \r\n - let chunk = await client.recv(bytesToRead + 2) - request.body = request.body & chunk + let chunk = await client.recv(bytesToRead) + request.body.add(chunk) + # Skip \r\n (chunk terminating bytes per spec) + let separator = await client.recv(2) + if separator != "\r\n": + await request.respond(Http400, "Bad Request. Encoding separator must be \\r\\n") + return true inc sizeOrData elif request.reqMethod == HttpPost: |