diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pure/asynchttpserver.nim | 2 | ||||
-rw-r--r-- | lib/pure/asyncnet.nim | 4 | ||||
-rw-r--r-- | lib/pure/net.nim | 8 | ||||
-rw-r--r-- | lib/pure/rawsockets.nim | 8 |
4 files changed, 12 insertions, 10 deletions
diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim index 9de0a6268..257fbaeb5 100644 --- a/lib/pure/asynchttpserver.nim +++ b/lib/pure/asynchttpserver.nim @@ -116,7 +116,7 @@ proc sendStatus(client: PAsyncSocket, status: string): Future[void] = proc processClient(client: PAsyncSocket, address: string, callback: proc (request: TRequest): Future[void] {.closure, gcsafe.}) {.async.} = - while true: + while not client.closed: # GET /path HTTP/1.1 # Header: val # \n diff --git a/lib/pure/asyncnet.nim b/lib/pure/asyncnet.nim index a16111349..c6918517e 100644 --- a/lib/pure/asyncnet.nim +++ b/lib/pure/asyncnet.nim @@ -67,7 +67,8 @@ type # PAsyncSocket* {.borrow: `.`.} = distinct PSocket. But that doesn't work. AsyncSocketDesc = object fd*: SocketHandle - case isBuffered*: bool # determines whether this socket is buffered. + closed*: bool ## determines whether this socket has been closed + case isBuffered*: bool ## determines whether this socket is buffered. of true: buffer*: array[0..BufferSize, char] currPos*: int # current index in buffer @@ -400,6 +401,7 @@ proc close*(socket: PAsyncSocket) = raiseSslError() elif res != 1: raiseSslError() + socket.closed = true # TODO: Add extra debugging checks for this. when defined(ssl): proc wrapSocket*(ctx: SslContext, socket: AsyncSocket) = diff --git a/lib/pure/net.nim b/lib/pure/net.nim index 55ddf4bc2..886ed792f 100644 --- a/lib/pure/net.nim +++ b/lib/pure/net.nim @@ -287,11 +287,11 @@ proc bindAddr*(socket: Socket, port = Port(0), address = "") {. name.sin_port = htons(int16(port)) name.sin_addr.s_addr = htonl(INADDR_ANY) if bindAddr(socket.fd, cast[ptr SockAddr](addr(name)), - sizeof(name).Socklen) < 0'i32: + sizeof(name).SockLen) < 0'i32: raiseOSError(osLastError()) else: var aiList = getAddrInfo(address, port, AF_INET) - if bindAddr(socket.fd, aiList.ai_addr, aiList.ai_addrlen.Socklen) < 0'i32: + if bindAddr(socket.fd, aiList.ai_addr, aiList.ai_addrlen.SockLen) < 0'i32: dealloc(aiList) raiseOSError(osLastError()) dealloc(aiList) @@ -315,7 +315,7 @@ proc acceptAddr*(server: Socket, client: var Socket, address: var string, ## accept will be called again. assert(client != nil) var sockAddress: Sockaddr_in - var addrLen = sizeof(sockAddress).Socklen + var addrLen = sizeof(sockAddress).SockLen var sock = accept(server.fd, cast[ptr SockAddr](addr(sockAddress)), addr(addrLen)) @@ -754,7 +754,7 @@ proc recvFrom*(socket: Socket, data: var string, length: int, # TODO: Buffered sockets data.setLen(length) - var sockAddress: SockAddrIn + var sockAddress: Sockaddr_in var addrLen = sizeof(sockAddress).SockLen result = recvfrom(socket.fd, cstring(data), length.cint, flags.cint, cast[ptr SockAddr](addr(sockAddress)), addr(addrLen)) diff --git a/lib/pure/rawsockets.nim b/lib/pure/rawsockets.nim index 7e293f490..c76e99fcb 100644 --- a/lib/pure/rawsockets.nim +++ b/lib/pure/rawsockets.nim @@ -162,7 +162,7 @@ proc close*(socket: SocketHandle) = # TODO: These values should not be discarded. An EOS should be raised. # http://stackoverflow.com/questions/12463473/what-happens-if-you-call-close-on-a-bsd-socket-multiple-times -proc bindAddr*(socket: SocketHandle, name: ptr SockAddr, namelen: Socklen): cint = +proc bindAddr*(socket: SocketHandle, name: ptr SockAddr, namelen: SockLen): cint = result = bindSocket(socket, name, namelen) proc listen*(socket: SocketHandle, backlog = SOMAXCONN): cint {.tags: [ReadIOEffect].} = @@ -314,7 +314,7 @@ proc getSockName*(socket: SocketHandle): Port = name.sin_family = posix.AF_INET #name.sin_port = htons(cint16(port)) #name.sin_addr.s_addr = htonl(INADDR_ANY) - var namelen = sizeof(name).Socklen + var namelen = sizeof(name).SockLen if getsockname(socket, cast[ptr SockAddr](addr(name)), addr(namelen)) == -1'i32: raiseOSError(osLastError()) @@ -324,7 +324,7 @@ proc getSockOptInt*(socket: SocketHandle, level, optname: int): int {. tags: [ReadIOEffect].} = ## getsockopt for integer options. var res: cint - var size = sizeof(res).Socklen + var size = sizeof(res).SockLen if getsockopt(socket, cint(level), cint(optname), addr(res), addr(size)) < 0'i32: raiseOSError(osLastError()) @@ -335,7 +335,7 @@ proc setSockOptInt*(socket: SocketHandle, level, optname, optval: int) {. ## setsockopt for integer options. var value = cint(optval) if setsockopt(socket, cint(level), cint(optname), addr(value), - sizeof(value).Socklen) < 0'i32: + sizeof(value).SockLen) < 0'i32: raiseOSError(osLastError()) proc setBlocking*(s: SocketHandle, blocking: bool) = |