summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorEmery Hemingway <ehmry@posteo.net>2021-08-18 14:25:25 +0200
committerGitHub <noreply@github.com>2021-08-18 14:25:25 +0200
commit5fd150b7f792754b0431f2cc2e9830fb23ce15f6 (patch)
treea003e882d9131e0a22dcac3400fad2c0f0250c71
parent901c5ded527bb06c52bfc1fd38c9a5fadee0f49a (diff)
downloadNim-5fd150b7f792754b0431f2cc2e9830fb23ce15f6.tar.gz
asynchttpserver: ipv6 support (#18706)
Fix #18705
-rw-r--r--lib/pure/asynchttpserver.nim13
-rw-r--r--tests/errmsgs/tgcsafety.nim2
2 files changed, 8 insertions, 7 deletions
diff --git a/lib/pure/asynchttpserver.nim b/lib/pure/asynchttpserver.nim
index f23c3d3f9..d7daacd03 100644
--- a/lib/pure/asynchttpserver.nim
+++ b/lib/pure/asynchttpserver.nim
@@ -41,7 +41,7 @@ runnableExamples("-r:off"):
 
 import asyncnet, asyncdispatch, parseutils, uri, strutils
 import httpcore
-from nativesockets import getLocalAddr, AF_INET
+from nativesockets import getLocalAddr, Domain, AF_INET, AF_INET6
 import std/private/since
 
 export httpcore except parseHeader
@@ -82,7 +82,7 @@ proc getPort*(self: AsyncHttpServer): Port {.since: (1, 5, 1).} =
     server.listen(Port(0))
     assert server.getPort.uint16 > 0
     server.close()
-  result = getLocalAddr(self.socket.getFd, AF_INET)[1]
+  result = getLocalAddr(self.socket)[1]
 
 proc newAsyncHttpServer*(reuseAddr = true, reusePort = false,
                          maxBody = 8388608): AsyncHttpServer =
@@ -372,13 +372,13 @@ const
     ## This can be set on the command line during compilation
     ## via `-d:nimMaxDescriptorsFallback=N`
 
-proc listen*(server: AsyncHttpServer; port: Port; address = "") =
+proc listen*(server: AsyncHttpServer; port: Port; address = ""; domain = AF_INET) =
   ## Listen to the given port and address.
   when declared(maxDescriptors):
     server.maxFDs = try: maxDescriptors() except: nimMaxDescriptorsFallback
   else:
     server.maxFDs = nimMaxDescriptorsFallback
-  server.socket = newAsyncSocket()
+  server.socket = newAsyncSocket(domain)
   if server.reuseAddr:
     server.socket.setSockOpt(OptReuseAddr, true)
   if server.reusePort:
@@ -404,7 +404,8 @@ proc acceptRequest*(server: AsyncHttpServer,
 proc serve*(server: AsyncHttpServer, port: Port,
             callback: proc (request: Request): Future[void] {.closure, gcsafe.},
             address = "";
-            assumedDescriptorsPerRequest = -1) {.async.} =
+            assumedDescriptorsPerRequest = -1;
+            domain = AF_INET) {.async.} =
   ## Starts the process of listening for incoming HTTP connections on the
   ## specified address and port.
   ##
@@ -417,7 +418,7 @@ proc serve*(server: AsyncHttpServer, port: Port,
   ##
   ## You should prefer to call `acceptRequest` instead with a custom server
   ## loop so that you're in control over the error handling and logging.
-  listen server, port, address
+  listen server, port, address, domain
   while true:
     if shouldAcceptRequest(server, assumedDescriptorsPerRequest):
       var (address, client) = await server.socket.acceptAddr()
diff --git a/tests/errmsgs/tgcsafety.nim b/tests/errmsgs/tgcsafety.nim
index 6021d19e1..701adeebf 100644
--- a/tests/errmsgs/tgcsafety.nim
+++ b/tests/errmsgs/tgcsafety.nim
@@ -6,7 +6,7 @@ tgcsafety.nim(31, 18) Error: type mismatch: got <AsyncHttpServer, Port, proc (re
 but expected one of:
 proc serve(server: AsyncHttpServer; port: Port;
            callback: proc (request: Request): Future[void] {.closure, gcsafe.};
-           address = ""; assumedDescriptorsPerRequest = -1): owned(
+           address = ""; assumedDescriptorsPerRequest = -1; domain = AF_INET): owned(
     Future[void])
   first type mismatch at position: 3
   required type for callback: proc (request: Request): Future[system.void]{.closure, gcsafe.}