fixes for asynchttpserver
This commit is contained in:
parent
455c3c19ca
commit
fe387888bd
3 changed files with 15 additions and 8 deletions
|
|
@ -353,11 +353,11 @@ when defined(windows) or defined(nimdoc):
|
||||||
var retFuture = newFuture[string]()
|
var retFuture = newFuture[string]()
|
||||||
|
|
||||||
var dataBuf: TWSABuf
|
var dataBuf: TWSABuf
|
||||||
dataBuf.buf = newString(size)
|
dataBuf.buf = cast[cstring](alloc0(size))
|
||||||
dataBuf.len = size
|
dataBuf.len = size
|
||||||
|
|
||||||
var bytesReceived: DWord
|
var bytesReceived: DWord
|
||||||
var flagsio = flags.dword
|
var flagsio = flags.DWord
|
||||||
var ol = cast[PCustomOverlapped](alloc0(sizeof(TCustomOverlapped)))
|
var ol = cast[PCustomOverlapped](alloc0(sizeof(TCustomOverlapped)))
|
||||||
ol.data = TCompletionData(sock: socket, cb:
|
ol.data = TCompletionData(sock: socket, cb:
|
||||||
proc (sock: TAsyncFD, bytesCount: DWord, errcode: TOSErrorCode) =
|
proc (sock: TAsyncFD, bytesCount: DWord, errcode: TOSErrorCode) =
|
||||||
|
|
@ -367,10 +367,12 @@ when defined(windows) or defined(nimdoc):
|
||||||
retFuture.complete("")
|
retFuture.complete("")
|
||||||
else:
|
else:
|
||||||
var data = newString(bytesCount)
|
var data = newString(bytesCount)
|
||||||
|
assert bytesCount <= size
|
||||||
copyMem(addr data[0], addr dataBuf.buf[0], bytesCount)
|
copyMem(addr data[0], addr dataBuf.buf[0], bytesCount)
|
||||||
retFuture.complete($data)
|
retFuture.complete($data)
|
||||||
else:
|
else:
|
||||||
retFuture.fail(newException(EOS, osErrorMsg(errcode)))
|
retFuture.fail(newException(EOS, osErrorMsg(errcode)))
|
||||||
|
dealloc dataBuf.buf
|
||||||
)
|
)
|
||||||
|
|
||||||
let ret = WSARecv(socket.TSocketHandle, addr dataBuf, 1, addr bytesReceived,
|
let ret = WSARecv(socket.TSocketHandle, addr dataBuf, 1, addr bytesReceived,
|
||||||
|
|
@ -378,6 +380,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
if ret == -1:
|
if ret == -1:
|
||||||
let err = osLastError()
|
let err = osLastError()
|
||||||
if err.int32 != ERROR_IO_PENDING:
|
if err.int32 != ERROR_IO_PENDING:
|
||||||
|
dealloc dataBuf.buf
|
||||||
retFuture.fail(newException(EOS, osErrorMsg(err)))
|
retFuture.fail(newException(EOS, osErrorMsg(err)))
|
||||||
dealloc(ol)
|
dealloc(ol)
|
||||||
elif ret == 0 and bytesReceived == 0 and dataBuf.buf[0] == '\0':
|
elif ret == 0 and bytesReceived == 0 and dataBuf.buf[0] == '\0':
|
||||||
|
|
@ -401,7 +404,9 @@ when defined(windows) or defined(nimdoc):
|
||||||
else:
|
else:
|
||||||
bytesReceived
|
bytesReceived
|
||||||
var data = newString(realSize)
|
var data = newString(realSize)
|
||||||
|
assert realSize <= size
|
||||||
copyMem(addr data[0], addr dataBuf.buf[0], realSize)
|
copyMem(addr data[0], addr dataBuf.buf[0], realSize)
|
||||||
|
#dealloc dataBuf.buf
|
||||||
retFuture.complete($data)
|
retFuture.complete($data)
|
||||||
# We don't deallocate ``ol`` here because even though this completed
|
# We don't deallocate ``ol`` here because even though this completed
|
||||||
# immediately poll will still be notified about its completion and it will
|
# immediately poll will still be notified about its completion and it will
|
||||||
|
|
@ -415,7 +420,7 @@ when defined(windows) or defined(nimdoc):
|
||||||
var retFuture = newFuture[void]()
|
var retFuture = newFuture[void]()
|
||||||
|
|
||||||
var dataBuf: TWSABuf
|
var dataBuf: TWSABuf
|
||||||
dataBuf.buf = data
|
dataBuf.buf = data # since this is not used in a callback, this is fine
|
||||||
dataBuf.len = data.len
|
dataBuf.len = data.len
|
||||||
|
|
||||||
var bytesReceived, flags: DWord
|
var bytesReceived, flags: DWord
|
||||||
|
|
|
||||||
|
|
@ -92,8 +92,11 @@ proc processClient(client: PAsyncSocket, address: string,
|
||||||
# GET /path HTTP/1.1
|
# GET /path HTTP/1.1
|
||||||
# Header: val
|
# Header: val
|
||||||
# \n
|
# \n
|
||||||
|
|
||||||
var request = newRequest()
|
var request = newRequest()
|
||||||
|
request.hostname = address
|
||||||
|
assert client != nil
|
||||||
|
request.client = client
|
||||||
|
|
||||||
# First line - GET /path HTTP/1.1
|
# First line - GET /path HTTP/1.1
|
||||||
let line = await client.recvLine() # TODO: Timeouts.
|
let line = await client.recvLine() # TODO: Timeouts.
|
||||||
if line == "":
|
if line == "":
|
||||||
|
|
@ -102,6 +105,8 @@ proc processClient(client: PAsyncSocket, address: string,
|
||||||
let lineParts = line.split(' ')
|
let lineParts = line.split(' ')
|
||||||
if lineParts.len != 3:
|
if lineParts.len != 3:
|
||||||
request.respond(Http400, "Invalid request. Got: " & line)
|
request.respond(Http400, "Invalid request. Got: " & line)
|
||||||
|
client.close()
|
||||||
|
return
|
||||||
|
|
||||||
let reqMethod = lineParts[0]
|
let reqMethod = lineParts[0]
|
||||||
let path = lineParts[1]
|
let path = lineParts[1]
|
||||||
|
|
@ -127,15 +132,11 @@ proc processClient(client: PAsyncSocket, address: string,
|
||||||
except EInvalidValue:
|
except EInvalidValue:
|
||||||
request.respond(Http400, "Invalid request protocol. Got: " & protocol)
|
request.respond(Http400, "Invalid request protocol. Got: " & protocol)
|
||||||
return
|
return
|
||||||
request.hostname = address
|
|
||||||
request.client = client
|
|
||||||
|
|
||||||
case reqMethod.normalize
|
case reqMethod.normalize
|
||||||
of "get":
|
of "get":
|
||||||
await callback(request)
|
await callback(request)
|
||||||
else:
|
else:
|
||||||
echo(reqMethod.repr)
|
|
||||||
echo(line.repr)
|
|
||||||
request.respond(Http400, "Invalid request method. Got: " & reqMethod)
|
request.respond(Http400, "Invalid request method. Got: " & reqMethod)
|
||||||
|
|
||||||
# Persistent connections
|
# Persistent connections
|
||||||
|
|
|
||||||
|
|
@ -92,6 +92,7 @@ proc recv*(socket: PAsyncSocket, size: int,
|
||||||
proc send*(socket: PAsyncSocket, data: string): PFuture[void] =
|
proc send*(socket: PAsyncSocket, data: string): PFuture[void] =
|
||||||
## Sends ``data`` to ``socket``. The returned future will complete once all
|
## Sends ``data`` to ``socket``. The returned future will complete once all
|
||||||
## data has been sent.
|
## data has been sent.
|
||||||
|
assert socket != nil
|
||||||
result = send(socket.fd.TAsyncFD, data)
|
result = send(socket.fd.TAsyncFD, data)
|
||||||
|
|
||||||
proc acceptAddr*(socket: PAsyncSocket):
|
proc acceptAddr*(socket: PAsyncSocket):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue