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
This commit is contained in:
vabresto
2021-01-14 14:17:02 -05:00
committed by GitHub
parent 1fd4c666dc
commit a90f7a66ed
2 changed files with 105 additions and 3 deletions

View File

@@ -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: