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 ++++++++++++++----------------------------------- rpc.go | 7 +++---- 2 files changed, 17 insertions(+), 39 deletions(-) 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) } diff --git a/rpc.go b/rpc.go index e7ab0d9..5fe434a 100644 --- a/rpc.go +++ b/rpc.go @@ -9,22 +9,21 @@ type GoXY struct{} func init() { rpc.Register(GoXY{}) + rpc.HandleHTTP() } func (GoXY) Add(e Entry, _ *struct{}) error { log.Println("Add route", e) defer route.Save(*data) route[e.ServerName] = e - route.Restore() - return nil + return route.Restore() } func (GoXY) Del(e Entry, _ *struct{}) error { log.Println("Del route", e) defer route.Save(*data) delete(route, e.ServerName) - route.Restore() - return nil + return route.Restore() } func (GoXY) List(_ struct{}, r *[]Entry) error { -- cgit v1.2.3