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