aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-03-23 20:36:44 +0100
committerDimitri Sokolyuk <demon@dim13.org>2016-03-23 20:36:44 +0100
commit37c0e16ad1b90b16a78405f8a0a7125e24bc888e (patch)
tree1ec26e65437876da1d23de209f122dbb3cf4caaf
parent9509cf74f017cb5e4e64c59d0b30bd5602626c01 (diff)
Fix copy lock warning
-rw-r--r--main.go49
-rw-r--r--rpc.go7
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 {