From 37c0e16ad1b90b16a78405f8a0a7125e24bc888e Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 23 Mar 2016 20:36:44 +0100 Subject: Fix copy lock warning --- main.go | 49 ++++++++++++++----------------------------------- 1 file changed, 14 insertions(+), 35 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index b0eafdd..de273cc 100644 --- a/main.go +++ b/main.go @@ -7,17 +7,18 @@ import ( "log" "net/http" "net/http/httputil" - "net/rpc" "net/url" ) var ( listen = flag.String("listen", ":http", "HTTP port") listenTLS = flag.String("listentls", ":https", "TLS port") - listenRPC = flag.String("listenrpc", ":http-alt", "RPC port") data = flag.String("data", "data/goxy.gob", "persistent storage file") route = make(Route) - mux = http.NewServeMux() + server = http.Server{ + Handler: http.NewServeMux(), + TLSConfig: &tls.Config{GetCertificate: route.SNI}, + } ) type Route map[string]Entry @@ -38,8 +39,7 @@ func (r Route) SNI(h *tls.ClientHelloInfo) (*tls.Certificate, error) { } func (r Route) Restore() error { - // FIXME assignment copies lock value to *mux: net/http.ServeMux contains sync.RWMutex - *mux = *http.NewServeMux() + server.Handler = http.NewServeMux() for k, v := range route { cert, err := tls.X509KeyPair(v.Cert, v.Key) if err != nil { @@ -58,6 +58,7 @@ func (e Entry) NewHandle() error { if err != nil { return err } + mux := server.Handler.(*http.ServeMux) mux.Handle(e.ServerName+"/", httputil.NewSingleHostReverseProxy(up)) return nil } @@ -70,42 +71,20 @@ func (e Entry) String() string { } } -func StartHTTP(listen string) { - log.Println("listen", listen, "(HTTP)") - s := http.Server{ - Addr: listen, - Handler: mux, - } - log.Fatal(s.ListenAndServe()) -} - -func StartTLS(listen string) { - log.Println("listen", listen, "(TLS)") - s := http.Server{ - Addr: listen, - Handler: mux, - TLSConfig: &tls.Config{GetCertificate: route.SNI}, - } - log.Fatal(s.ListenAndServeTLS("", "")) -} - -func StartRPC(listen string) { - log.Println("listen", listen, "(RPC)") - rpc.HandleHTTP() - log.Fatal(http.ListenAndServe(listen, nil)) -} - func main() { flag.Parse() if err := route.Load(*data); err != nil { log.Println(err) } - route.Restore() + if err := route.Restore(); err != nil { + log.Fatal(err) + } - go StartHTTP(*listen) - go StartTLS(*listenTLS) - go StartRPC(*listenRPC) + errc := make(chan error) + go func() { errc <- server.ListenAndServe() }() + go func() { errc <- server.ListenAndServeTLS("", "") }() + go func() { errc <- http.ListenAndServe(":http-alt", nil) }() - select {} + log.Fatal(<-errc) } -- cgit v1.2.3