@cryptotaxi247 / kubo / commits / f6fadc4c9

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)