mirror of
https://github.com/logos-storage/nim-json-rpc.git
synced 2026-02-26 00:23:09 +00:00
Fix support of Content-Length response header.
This commit is contained in:
parent
d6cda75177
commit
6a0b0ff30d
@ -62,10 +62,19 @@ proc validateResponse*(transp: StreamTransport,
|
||||
|
||||
let length = header.contentLength()
|
||||
if length <= 0:
|
||||
# request length could not be calculated.
|
||||
debug "Content-Length is missing or 0", address = transp.remoteAddress()
|
||||
result = false
|
||||
return
|
||||
if header.version == HttpVersion11:
|
||||
if header["Connection"].toLowerAscii() != "close":
|
||||
# Response body length could not be calculated.
|
||||
if header["Transfer-Encoding"].toLowerAscii() == "chunked":
|
||||
debug "Chunked encoding is not supported",
|
||||
address = transp.remoteAddress()
|
||||
result = false
|
||||
return
|
||||
else:
|
||||
debug "Content body size could not be calculated",
|
||||
address = transp.remoteAddress()
|
||||
result = false
|
||||
return
|
||||
|
||||
result = true
|
||||
|
||||
@ -111,18 +120,31 @@ proc recvData(transp: StreamTransport): Future[string] {.async.} =
|
||||
return
|
||||
|
||||
let length = header.contentLength()
|
||||
buffer.setLen(length)
|
||||
try:
|
||||
let blenfut = transp.readExactly(addr buffer[0], length)
|
||||
let ores = await withTimeout(blenfut, HttpBodyTimeout)
|
||||
if not ores:
|
||||
# Timeout
|
||||
debug "Timeout expired while receiving request body",
|
||||
address = transp.remoteAddress()
|
||||
error = true
|
||||
if length > 0:
|
||||
# `Content-Length` is present in response header.
|
||||
buffer.setLen(length)
|
||||
let blenfut = transp.readExactly(addr buffer[0], length)
|
||||
let ores = await withTimeout(blenfut, HttpBodyTimeout)
|
||||
if not ores:
|
||||
# Timeout
|
||||
debug "Timeout expired while receiving request body",
|
||||
address = transp.remoteAddress()
|
||||
error = true
|
||||
else:
|
||||
blenfut.read()
|
||||
else:
|
||||
blenfut.read()
|
||||
|
||||
# `Content-Length` is not present in response header, so we are reading
|
||||
# everything until connection will be closed.
|
||||
var blenfut = transp.read()
|
||||
let ores = await withTimeout(blenfut, HttpBodyTimeout)
|
||||
if not ores:
|
||||
# Timeout
|
||||
debug "Timeout expired while receiving request body",
|
||||
address = transp.remoteAddress()
|
||||
error = true
|
||||
else:
|
||||
buffer = blenfut.read()
|
||||
except TransportIncompleteError:
|
||||
# remote peer disconnected
|
||||
debug "Remote peer disconnected", address = transp.remoteAddress()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user