54
54
domain* : Domain
55
55
numThreads: int
56
56
loggers: seq [Logger ]
57
+ reusePort: bool
58
+ # # controls whether to fail with "Address already in use".
59
+ # # Setting this to false will raise when `threads` are on.
57
60
58
61
HttpBeastDefect * = ref object of Defect
59
62
@@ -63,14 +66,15 @@ const
63
66
proc initSettings * (port: Port = Port (8080 ),
64
67
bindAddr: string = " " ,
65
68
numThreads: int = 0 ,
66
- domain = Domain .AF_INET ): Settings =
67
-
69
+ domain = Domain .AF_INET ,
70
+ reusePort = true ): Settings =
68
71
Settings (
69
72
port: port,
70
73
bindAddr: bindAddr,
71
74
domain: domain,
72
75
numThreads: numThreads,
73
- loggers: getHandlers ()
76
+ loggers: getHandlers (),
77
+ reusePort: reusePort,
74
78
)
75
79
76
80
proc initData (fdKind: FdKind , ip = " " ): Data =
@@ -317,7 +321,9 @@ proc eventLoop(params: (OnRequest, Settings)) =
317
321
318
322
let server = newSocket (settings.domain)
319
323
server.setSockOpt (OptReuseAddr , true )
320
- server.setSockOpt (OptReusePort , true )
324
+ if compileOption (" threads" ) and not settings.reusePort:
325
+ raise HttpBeastDefect (msg: " --threads:on requires reusePort to be enabled in settings" )
326
+ server.setSockOpt (OptReusePort , settings.reusePort)
321
327
server.bindAddr (settings.port, settings.bindAddr)
322
328
server.listen ()
323
329
server.getFd ().setBlocking (false )
@@ -488,7 +494,7 @@ proc run*(onRequest: OnRequest) {.inline.} =
488
494
# # request.
489
495
# #
490
496
# # See the other ``run`` proc for more info.
491
- run (onRequest, Settings (port: Port (8080 ), bindAddr: " " , domain: Domain .AF_INET ))
497
+ run (onRequest, initSettings (port= Port (8080 ), bindAddr= " " , domain= Domain .AF_INET ))
492
498
493
499
when false :
494
500
proc close * (port: Port ) =
0 commit comments