Skip to content

Commit 7c5cbf0

Browse files
authored
Fix baseUri should provide correct value for ANY_ADDRESS. (#563)
1 parent 70cbe34 commit 7c5cbf0

File tree

4 files changed

+154
-81
lines changed

4 files changed

+154
-81
lines changed

chronos/apps/http/httpserver.nim

Lines changed: 34 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -252,47 +252,42 @@ proc new*(
252252
dualstack = DualStackType.Auto,
253253
middlewares: openArray[HttpServerMiddlewareRef] = []
254254
): HttpResult[HttpServerRef] =
255-
256-
let serverUri =
257-
if len(serverUri.hostname) > 0:
258-
serverUri
259-
else:
255+
let
256+
serverInstance =
260257
try:
261-
parseUri("http://" & $address & "/")
262-
except TransportAddressError as exc:
258+
createStreamServer(address, flags = socketFlags, bufferSize = bufferSize,
259+
backlog = backlogSize, dualstack = dualstack)
260+
except TransportOsError as exc:
263261
return err(exc.msg)
264-
265-
let serverInstance =
266-
try:
267-
createStreamServer(address, flags = socketFlags, bufferSize = bufferSize,
268-
backlog = backlogSize, dualstack = dualstack)
269-
except TransportOsError as exc:
270-
return err(exc.msg)
271-
272-
var res = HttpServerRef(
273-
address: serverInstance.localAddress(),
274-
instance: serverInstance,
275-
processCallback: processCallback,
276-
createConnCallback: createConnection,
277-
baseUri: serverUri,
278-
serverIdent: serverIdent,
279-
flags: serverFlags,
280-
socketFlags: socketFlags,
281-
maxConnections: maxConnections,
282-
bufferSize: bufferSize,
283-
backlogSize: backlogSize,
284-
headersTimeout: httpHeadersTimeout,
285-
maxHeadersSize: maxHeadersSize,
286-
maxRequestBodySize: maxRequestBodySize,
287-
# semaphore:
288-
# if maxConnections > 0:
289-
# newAsyncSemaphore(maxConnections)
290-
# else:
291-
# nil
292-
lifetime: newFuture[void]("http.server.lifetime"),
293-
connections: initOrderedTable[string, HttpConnectionHolderRef](),
294-
middlewares: prepareMiddlewares(processCallback, middlewares)
295-
)
262+
serverUri =
263+
if len(serverUri.hostname) > 0:
264+
serverUri
265+
else:
266+
parseUri("http://" & $serverInstance.localAddress() & "/")
267+
res = HttpServerRef(
268+
address: serverInstance.localAddress(),
269+
instance: serverInstance,
270+
processCallback: processCallback,
271+
createConnCallback: createConnection,
272+
baseUri: serverUri,
273+
serverIdent: serverIdent,
274+
flags: serverFlags,
275+
socketFlags: socketFlags,
276+
maxConnections: maxConnections,
277+
bufferSize: bufferSize,
278+
backlogSize: backlogSize,
279+
headersTimeout: httpHeadersTimeout,
280+
maxHeadersSize: maxHeadersSize,
281+
maxRequestBodySize: maxRequestBodySize,
282+
# semaphore:
283+
# if maxConnections > 0:
284+
# newAsyncSemaphore(maxConnections)
285+
# else:
286+
# nil
287+
lifetime: newFuture[void]("http.server.lifetime"),
288+
connections: initOrderedTable[string, HttpConnectionHolderRef](),
289+
middlewares: prepareMiddlewares(processCallback, middlewares)
290+
)
296291
ok(res)
297292

298293
proc new*(

chronos/apps/http/shttpserver.nim

Lines changed: 37 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -98,52 +98,47 @@ proc new*(htype: typedesc[SecureHttpServerRef],
9898
maxRequestBodySize: int = 1_048_576,
9999
dualstack = DualStackType.Auto
100100
): HttpResult[SecureHttpServerRef] =
101-
102101
doAssert(not(isNil(tlsPrivateKey)), "TLS private key must not be nil!")
103102
doAssert(not(isNil(tlsCertificate)), "TLS certificate must not be nil!")
104-
105-
let serverUri =
106-
if len(serverUri.hostname) > 0:
107-
serverUri
108-
else:
103+
let
104+
serverInstance =
109105
try:
110-
parseUri("https://" & $address & "/")
111-
except TransportAddressError as exc:
106+
createStreamServer(address, flags = socketFlags,
107+
bufferSize = bufferSize,
108+
backlog = backlogSize, dualstack = dualstack)
109+
except TransportOsError as exc:
112110
return err(exc.msg)
113-
114-
let serverInstance =
115-
try:
116-
createStreamServer(address, flags = socketFlags, bufferSize = bufferSize,
117-
backlog = backlogSize, dualstack = dualstack)
118-
except TransportOsError as exc:
119-
return err(exc.msg)
120-
121-
let res = SecureHttpServerRef(
122-
address: address,
123-
instance: serverInstance,
124-
processCallback: processCallback,
125-
createConnCallback: createSecConnection,
126-
baseUri: serverUri,
127-
serverIdent: serverIdent,
128-
flags: serverFlags + {HttpServerFlags.Secure},
129-
socketFlags: socketFlags,
130-
maxConnections: maxConnections,
131-
bufferSize: bufferSize,
132-
backlogSize: backlogSize,
133-
headersTimeout: httpHeadersTimeout,
134-
maxHeadersSize: maxHeadersSize,
135-
maxRequestBodySize: maxRequestBodySize,
136-
# semaphore:
137-
# if maxConnections > 0:
138-
# newAsyncSemaphore(maxConnections)
139-
# else:
140-
# nil
141-
lifetime: newFuture[void]("http.server.lifetime"),
142-
connections: initOrderedTable[string, HttpConnectionHolderRef](),
143-
tlsCertificate: tlsCertificate,
144-
tlsPrivateKey: tlsPrivateKey,
145-
secureFlags: secureFlags
146-
)
111+
serverUri =
112+
if len(serverUri.hostname) > 0:
113+
serverUri
114+
else:
115+
parseUri("https://" & $serverInstance.localAddress() & "/")
116+
res = SecureHttpServerRef(
117+
address: serverInstance.localAddress(),
118+
instance: serverInstance,
119+
processCallback: processCallback,
120+
createConnCallback: createSecConnection,
121+
baseUri: serverUri,
122+
serverIdent: serverIdent,
123+
flags: serverFlags + {HttpServerFlags.Secure},
124+
socketFlags: socketFlags,
125+
maxConnections: maxConnections,
126+
bufferSize: bufferSize,
127+
backlogSize: backlogSize,
128+
headersTimeout: httpHeadersTimeout,
129+
maxHeadersSize: maxHeadersSize,
130+
maxRequestBodySize: maxRequestBodySize,
131+
# semaphore:
132+
# if maxConnections > 0:
133+
# newAsyncSemaphore(maxConnections)
134+
# else:
135+
# nil
136+
lifetime: newFuture[void]("http.server.lifetime"),
137+
connections: initOrderedTable[string, HttpConnectionHolderRef](),
138+
tlsCertificate: tlsCertificate,
139+
tlsPrivateKey: tlsPrivateKey,
140+
secureFlags: secureFlags
141+
)
147142
ok(res)
148143

149144
proc new*(htype: typedesc[SecureHttpServerRef],

tests/testhttpserver.nim

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1790,3 +1790,40 @@ suite "HTTP server testing suite":
17901790

17911791
await server.stop()
17921792
await server.closeWait()
1793+
1794+
asyncTest "HTTP server - baseUri value test":
1795+
proc process(r: RequestFence): Future[HttpResponseRef] {.
1796+
async: (raises: [CancelledError]).} =
1797+
defaultResponse()
1798+
1799+
let
1800+
expectUri2 = "http://www.chronos-test.com/"
1801+
address = initTAddress("127.0.0.1:0")
1802+
socketFlags = {ServerFlags.TcpNoDelay, ServerFlags.ReuseAddr}
1803+
res1 = HttpServerRef.new(address, process,
1804+
socketFlags = socketFlags)
1805+
res2 = HttpServerRef.new(address, process,
1806+
socketFlags = socketFlags,
1807+
serverUri = parseUri(expectUri2))
1808+
check:
1809+
res1.isOk == true
1810+
res2.isOk == true
1811+
1812+
let
1813+
server1 = res1.get()
1814+
server2 = res2.get()
1815+
1816+
try:
1817+
server1.start()
1818+
server2.start()
1819+
let
1820+
localAddress = server1.instance.localAddress()
1821+
expectUri1 = "http://127.0.0.1:" & $localAddress.port & "/"
1822+
check:
1823+
server1.baseUri == parseUri(expectUri1)
1824+
server2.baseUri == parseUri(expectUri2)
1825+
finally:
1826+
await server1.stop()
1827+
await server1.closeWait()
1828+
await server2.stop()
1829+
await server2.closeWait()

tests/testshttpserver.nim

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,3 +186,49 @@ suite "Secure HTTP server testing suite":
186186
return serverRes and data == "EXCEPTION"
187187

188188
check waitFor(testHTTPS2(initTAddress("127.0.0.1:30080"))) == true
189+
190+
asyncTest "HTTPS server - baseUri value test":
191+
proc process(r: RequestFence): Future[HttpResponseRef] {.
192+
async: (raises: [CancelledError]).} =
193+
defaultResponse()
194+
195+
let
196+
expectUri2 = "https://www.chronos-test.com/"
197+
address = initTAddress("127.0.0.1:0")
198+
socketFlags = {ServerFlags.TcpNoDelay, ServerFlags.ReuseAddr}
199+
serverFlags = {Secure}
200+
secureKey = TLSPrivateKey.init(HttpsSelfSignedRsaKey)
201+
secureCert = TLSCertificate.init(HttpsSelfSignedRsaCert)
202+
res1 = SecureHttpServerRef.new(address, process,
203+
socketFlags = socketFlags,
204+
serverFlags = serverFlags,
205+
tlsPrivateKey = secureKey,
206+
tlsCertificate = secureCert)
207+
res2 = SecureHttpServerRef.new(address, process,
208+
socketFlags = socketFlags,
209+
serverFlags = serverFlags,
210+
serverUri = parseUri(expectUri2),
211+
tlsPrivateKey = secureKey,
212+
tlsCertificate = secureCert)
213+
check:
214+
res1.isOk == true
215+
res2.isOk == true
216+
217+
let
218+
server1 = res1.get()
219+
server2 = res2.get()
220+
221+
try:
222+
server1.start()
223+
server2.start()
224+
let
225+
localAddress = server1.instance.localAddress()
226+
expectUri1 = "https://127.0.0.1:" & $localAddress.port & "/"
227+
check:
228+
server1.baseUri == parseUri(expectUri1)
229+
server2.baseUri == parseUri(expectUri2)
230+
finally:
231+
await server1.stop()
232+
await server1.closeWait()
233+
await server2.stop()
234+
await server2.closeWait()

0 commit comments

Comments
 (0)