Fix baseUri should provide correct value for ANY_ADDRESS. (#563)

This commit is contained in:
Eugene Kabanov 2025-01-13 18:31:36 +02:00 committed by GitHub
parent 70cbe346e2
commit 7c5cbf04a6
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 154 additions and 81 deletions

View File

@ -252,24 +252,19 @@ proc new*(
dualstack = DualStackType.Auto, dualstack = DualStackType.Auto,
middlewares: openArray[HttpServerMiddlewareRef] = [] middlewares: openArray[HttpServerMiddlewareRef] = []
): HttpResult[HttpServerRef] = ): HttpResult[HttpServerRef] =
let
let serverUri = serverInstance =
if len(serverUri.hostname) > 0:
serverUri
else:
try:
parseUri("http://" & $address & "/")
except TransportAddressError as exc:
return err(exc.msg)
let serverInstance =
try: try:
createStreamServer(address, flags = socketFlags, bufferSize = bufferSize, createStreamServer(address, flags = socketFlags, bufferSize = bufferSize,
backlog = backlogSize, dualstack = dualstack) backlog = backlogSize, dualstack = dualstack)
except TransportOsError as exc: except TransportOsError as exc:
return err(exc.msg) return err(exc.msg)
serverUri =
var res = HttpServerRef( if len(serverUri.hostname) > 0:
serverUri
else:
parseUri("http://" & $serverInstance.localAddress() & "/")
res = HttpServerRef(
address: serverInstance.localAddress(), address: serverInstance.localAddress(),
instance: serverInstance, instance: serverInstance,
processCallback: processCallback, processCallback: processCallback,

View File

@ -98,28 +98,23 @@ proc new*(htype: typedesc[SecureHttpServerRef],
maxRequestBodySize: int = 1_048_576, maxRequestBodySize: int = 1_048_576,
dualstack = DualStackType.Auto dualstack = DualStackType.Auto
): HttpResult[SecureHttpServerRef] = ): HttpResult[SecureHttpServerRef] =
doAssert(not(isNil(tlsPrivateKey)), "TLS private key must not be nil!") doAssert(not(isNil(tlsPrivateKey)), "TLS private key must not be nil!")
doAssert(not(isNil(tlsCertificate)), "TLS certificate must not be nil!") doAssert(not(isNil(tlsCertificate)), "TLS certificate must not be nil!")
let
let serverUri = serverInstance =
if len(serverUri.hostname) > 0:
serverUri
else:
try: try:
parseUri("https://" & $address & "/") createStreamServer(address, flags = socketFlags,
except TransportAddressError as exc: bufferSize = bufferSize,
return err(exc.msg)
let serverInstance =
try:
createStreamServer(address, flags = socketFlags, bufferSize = bufferSize,
backlog = backlogSize, dualstack = dualstack) backlog = backlogSize, dualstack = dualstack)
except TransportOsError as exc: except TransportOsError as exc:
return err(exc.msg) return err(exc.msg)
serverUri =
let res = SecureHttpServerRef( if len(serverUri.hostname) > 0:
address: address, serverUri
else:
parseUri("https://" & $serverInstance.localAddress() & "/")
res = SecureHttpServerRef(
address: serverInstance.localAddress(),
instance: serverInstance, instance: serverInstance,
processCallback: processCallback, processCallback: processCallback,
createConnCallback: createSecConnection, createConnCallback: createSecConnection,

View File

@ -1790,3 +1790,40 @@ suite "HTTP server testing suite":
await server.stop() await server.stop()
await server.closeWait() await server.closeWait()
asyncTest "HTTP server - baseUri value test":
proc process(r: RequestFence): Future[HttpResponseRef] {.
async: (raises: [CancelledError]).} =
defaultResponse()
let
expectUri2 = "http://www.chronos-test.com/"
address = initTAddress("127.0.0.1:0")
socketFlags = {ServerFlags.TcpNoDelay, ServerFlags.ReuseAddr}
res1 = HttpServerRef.new(address, process,
socketFlags = socketFlags)
res2 = HttpServerRef.new(address, process,
socketFlags = socketFlags,
serverUri = parseUri(expectUri2))
check:
res1.isOk == true
res2.isOk == true
let
server1 = res1.get()
server2 = res2.get()
try:
server1.start()
server2.start()
let
localAddress = server1.instance.localAddress()
expectUri1 = "http://127.0.0.1:" & $localAddress.port & "/"
check:
server1.baseUri == parseUri(expectUri1)
server2.baseUri == parseUri(expectUri2)
finally:
await server1.stop()
await server1.closeWait()
await server2.stop()
await server2.closeWait()

View File

@ -186,3 +186,49 @@ suite "Secure HTTP server testing suite":
return serverRes and data == "EXCEPTION" return serverRes and data == "EXCEPTION"
check waitFor(testHTTPS2(initTAddress("127.0.0.1:30080"))) == true check waitFor(testHTTPS2(initTAddress("127.0.0.1:30080"))) == true
asyncTest "HTTPS server - baseUri value test":
proc process(r: RequestFence): Future[HttpResponseRef] {.
async: (raises: [CancelledError]).} =
defaultResponse()
let
expectUri2 = "https://www.chronos-test.com/"
address = initTAddress("127.0.0.1:0")
socketFlags = {ServerFlags.TcpNoDelay, ServerFlags.ReuseAddr}
serverFlags = {Secure}
secureKey = TLSPrivateKey.init(HttpsSelfSignedRsaKey)
secureCert = TLSCertificate.init(HttpsSelfSignedRsaCert)
res1 = SecureHttpServerRef.new(address, process,
socketFlags = socketFlags,
serverFlags = serverFlags,
tlsPrivateKey = secureKey,
tlsCertificate = secureCert)
res2 = SecureHttpServerRef.new(address, process,
socketFlags = socketFlags,
serverFlags = serverFlags,
serverUri = parseUri(expectUri2),
tlsPrivateKey = secureKey,
tlsCertificate = secureCert)
check:
res1.isOk == true
res2.isOk == true
let
server1 = res1.get()
server2 = res2.get()
try:
server1.start()
server2.start()
let
localAddress = server1.instance.localAddress()
expectUri1 = "https://127.0.0.1:" & $localAddress.port & "/"
check:
server1.baseUri == parseUri(expectUri1)
server2.baseUri == parseUri(expectUri2)
finally:
await server1.stop()
await server1.closeWait()
await server2.stop()
await server2.closeWait()