do http server properly so daemon can shut down
Jeromy committed
May 20, 2015 at 22:42 UTC
f6fadc4c91407f39e1cc4f12f5c9424794c04b90
1 file changed
+10
-5
core/corehttp/corehttp.go
+10
-5
@@ -5,6 +5,7 @@ high-level HTTP interfaces to IPFS.
5
package corehttp
6
7
import (
8
+ "net"
9
"net/http"
10
"time"
11
@@ -56,12 +57,15 @@ func ListenAndServe(n *core.IpfsNode, listeningMultiAddr string, options ...Serv
57
}
58
59
func listenAndServe(node *core.IpfsNode, addr ma.Multiaddr, handler http.Handler) error {
59
- _, host, err := manet.DialArgs(addr)
60
+ netarg, host, err := manet.DialArgs(addr)
61
if err != nil {
62
return err
63
}
64
64
- server := &http.Server{Addr: host, Handler: handler}
65
+ list, err := net.Listen(netarg, host)
66
+ if err != nil {
67
+ return err
68
+ }
69
70
// if the server exits beforehand
71
var serverError error
@@ -71,7 +75,7 @@ func listenAndServe(node *core.IpfsNode, addr ma.Multiaddr, handler http.Handler
75
defer node.Children().Done()
76
77
go func() {
74
- serverError = server.ListenAndServe()
78
+ serverError = http.Serve(list, handler)
79
close(serverExited)
80
}()
81
@@ -83,14 +87,15 @@ func listenAndServe(node *core.IpfsNode, addr ma.Multiaddr, handler http.Handler
87
case <-node.Closing():
88
log.Infof("server at %s terminating...", addr)
89
86
- // make sure keep-alive connections do not keep the server running
87
- server.SetKeepAlivesEnabled(false)
90
+ list.Close()
91
92
outer:
93
for {
94
// wait until server exits
95
select {
96
case <-serverExited:
97
+ // if the server exited as we are closing, we really dont care about errors
98
+ serverError = nil
99
break outer
100
case <-time.After(5 * time.Second):
101
log.Infof("waiting for server at %s to terminate...", addr)