From f6fadc4c91407f39e1cc4f12f5c9424794c04b90 Mon Sep 17 00:00:00 2001
From: Jeromy <jeromyj@gmail.com>
Date: Wed, 20 May 2015 22:42:54 -0700
Subject: [PATCH] do http server properly so daemon can shut down

---
 core/corehttp/corehttp.go | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/core/corehttp/corehttp.go b/core/corehttp/corehttp.go
index 9947430d1..18afa30e5 100644
--- a/core/corehttp/corehttp.go
+++ b/core/corehttp/corehttp.go
@@ -5,6 +5,7 @@ high-level HTTP interfaces to IPFS.
 package corehttp
 
 import (
+	"net"
 	"net/http"
 	"time"
 
@@ -56,12 +57,15 @@ func ListenAndServe(n *core.IpfsNode, listeningMultiAddr string, options ...Serv
 }
 
 func listenAndServe(node *core.IpfsNode, addr ma.Multiaddr, handler http.Handler) error {
-	_, host, err := manet.DialArgs(addr)
+	netarg, host, err := manet.DialArgs(addr)
 	if err != nil {
 		return err
 	}
 
-	server := &http.Server{Addr: host, Handler: handler}
+	list, err := net.Listen(netarg, host)
+	if err != nil {
+		return err
+	}
 
 	// if the server exits beforehand
 	var serverError error
@@ -71,7 +75,7 @@ func listenAndServe(node *core.IpfsNode, addr ma.Multiaddr, handler http.Handler
 	defer node.Children().Done()
 
 	go func() {
-		serverError = server.ListenAndServe()
+		serverError = http.Serve(list, handler)
 		close(serverExited)
 	}()
 
@@ -83,14 +87,15 @@ func listenAndServe(node *core.IpfsNode, addr ma.Multiaddr, handler http.Handler
 	case <-node.Closing():
 		log.Infof("server at %s terminating...", addr)
 
-		// make sure keep-alive connections do not keep the server running
-		server.SetKeepAlivesEnabled(false)
+		list.Close()
 
 	outer:
 		for {
 			// wait until server exits
 			select {
 			case <-serverExited:
+				// if the server exited as we are closing, we really dont care about errors
+				serverError = nil
 				break outer
 			case <-time.After(5 * time.Second):
 				log.Infof("waiting for server at %s to terminate...", addr)
-- 
GitLab