Skip to content

Commit c2dc1ca

Browse files
authored
net.http: make listener public, and add addr in Server struct (#18871)
1 parent b06811c commit c2dc1ca

File tree

2 files changed

+42
-6
lines changed

2 files changed

+42
-6
lines changed

vlib/net/http/server.v

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,17 @@ mut:
2525

2626
pub struct Server {
2727
mut:
28-
state ServerStatus = .closed
29-
listener net.TcpListener
28+
state ServerStatus = .closed
3029
pub mut:
31-
port int = 8080
30+
addr string = ':8080' // change to ':8080' when port is removed
31+
port int [deprecated: 'use addr'] = 8080
3232
handler Handler = DebugHandler{}
3333
read_timeout time.Duration = 30 * time.second
3434
write_timeout time.Duration = 30 * time.second
3535
accept_timeout time.Duration = 30 * time.second
3636
pool_channel_slots int = 1024
3737
worker_num int = runtime.nr_jobs()
38+
listener net.TcpListener
3839
}
3940

4041
// listen_and_serve listens on the server port `s.port` over TCP network and
@@ -43,10 +44,28 @@ pub fn (mut s Server) listen_and_serve() {
4344
if s.handler is DebugHandler {
4445
eprintln('Server handler not set, using debug handler')
4546
}
46-
s.listener = net.listen_tcp(.ip6, ':${s.port}') or {
47-
eprintln('Listening on :${s.port} failed')
47+
48+
// remove when s.port is removed
49+
addr := s.addr.split(':')
50+
if addr.len > 1 && s.port != 8080 {
51+
s.addr = '${addr[0]}:${s.port}'
52+
}
53+
54+
mut l := s.listener.addr() or {
55+
eprintln('Failed getting listener address')
4856
return
4957
}
58+
if l.family() == net.AddrFamily.unspec {
59+
s.listener = net.listen_tcp(.ip6, '${s.addr}') or {
60+
eprintln('Listening on ${s.addr} failed')
61+
return
62+
}
63+
l = s.listener.addr() or {
64+
eprintln('Failed getting listener address')
65+
return
66+
}
67+
}
68+
s.addr = l.str()
5069
s.listener.set_accept_timeout(s.accept_timeout)
5170

5271
// Create tcp connection channel
@@ -58,7 +77,7 @@ pub fn (mut s Server) listen_and_serve() {
5877
ws << new_handler_worker(wid, ch, s.handler)
5978
}
6079

61-
eprintln('Listening on :${s.port}')
80+
eprintln('Listening on ${s.addr}')
6281
s.state = .running
6382
for {
6483
// break if we have a stop signal

vlib/net/http/server_test.v

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import net
12
import net.http
23
import time
34

@@ -30,6 +31,22 @@ fn test_server_close() {
3031
assert watch.elapsed() < 999 * time.millisecond
3132
}
3233

34+
fn test_server_custom_listener() {
35+
listener := net.listen_tcp(.ip6, ':8081')!
36+
mut server := &http.Server{
37+
accept_timeout: 1 * time.second
38+
listener: listener
39+
}
40+
t := spawn server.listen_and_serve()
41+
time.sleep(250 * time.millisecond)
42+
mut watch := time.new_stopwatch()
43+
server.close()
44+
assert server.status() == .closed
45+
assert watch.elapsed() < 100 * time.millisecond
46+
t.wait()
47+
assert watch.elapsed() < 999 * time.millisecond
48+
}
49+
3350
struct MyHttpHandler {
3451
mut:
3552
counter int

0 commit comments

Comments
 (0)