From 3071e59632c668696f8bf1c6d9e3bc07b61f6391 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 30 Mar 2016 11:17:28 +0200 Subject: Cleanup --- route.go | 22 ++++++++++++++++++++++ rpc.go | 15 ++++++--------- server.go | 42 ++++++++---------------------------------- server_test.go | 2 +- 4 files changed, 37 insertions(+), 44 deletions(-) diff --git a/route.go b/route.go index 3c83bef..93a18d3 100644 --- a/route.go +++ b/route.go @@ -2,7 +2,9 @@ package goxy import ( "crypto/tls" + "encoding/json" "errors" + "os" ) // Route defines a set of routes including correspondent TLS certificates @@ -16,6 +18,26 @@ func (r Route) GetCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error) return nil, errors.New("no cert for " + h.ServerName) } +// Save routes to persistent file +func (r Route) Save(fname string) error { + fd, err := os.Create(fname) + if err != nil { + return err + } + defer fd.Close() + return json.NewEncoder(fd).Encode(r) +} + +// Load routes from persistent file +func (r *Route) Load(fname string) error { + fd, err := os.Open(fname) + if err != nil { + return err + } + defer fd.Close() + return json.NewDecoder(fd).Decode(r) +} + // Entry holds routing settings type Entry struct { Host string // HostName diff --git a/rpc.go b/rpc.go index 49b9d21..e6a674d 100644 --- a/rpc.go +++ b/rpc.go @@ -10,29 +10,26 @@ func init() { rpc.HandleHTTP() } -func Register(s *Server) { - rpc.Register(&GoXY{s}) +func RegisterRPC(s *Server) error { + return rpc.Register(&GoXY{s}) } func DialRPC(server string) (*rpc.Client, error) { - if server == "" { - server = ":http-alt" - } return rpc.DialHTTP("tcp", server) } // Add adds a new route func (s *GoXY) Add(e Entry, _ *struct{}) error { - defer s.server.Save() + defer s.server.Save(s.server.DataFile) s.server.Route[e.Host] = e - return s.server.Restore() + return s.server.Update() } // Del removes a route func (s *GoXY) Del(host string, _ *struct{}) error { - defer s.server.Save() + defer s.server.Save(s.server.DataFile) delete(s.server.Route, host) - return s.server.Restore() + return s.server.Update() } // Get returns Entry diff --git a/server.go b/server.go index e7ba6cd..9300497 100644 --- a/server.go +++ b/server.go @@ -2,11 +2,9 @@ package goxy import ( "crypto/tls" - "encoding/json" "net/http" "net/http/httputil" "net/url" - "os" "strings" ) @@ -16,43 +14,19 @@ type Server struct { http.Server } -func NewServer(fname string) (*Server, error) { +func NewServer(dataFile string) (*Server, error) { r := make(Route) s := http.Server{TLSConfig: &tls.Config{GetCertificate: r.GetCertificate}} - server := &Server{Route: r, Server: s, DataFile: fname} - server.Load() - Register(server) - return server, server.Restore() -} - -// Save routes to persistent file -func (s Server) Save() error { - if s.DataFile == "" { - return nil - } - fd, err := os.Create(s.DataFile) - if err != nil { - return err - } - defer fd.Close() - return json.NewEncoder(fd).Encode(s.Route) -} - -// Load routes from persistent file -func (s *Server) Load() error { - if s.DataFile == "" { - return nil - } - fd, err := os.Open(s.DataFile) - if err != nil { - return err + server := &Server{Route: r, Server: s, DataFile: dataFile} + if dataFile != "" { + server.Load(dataFile) } - defer fd.Close() - return json.NewDecoder(fd).Decode(&s.Route) + RegisterRPC(server) + return server, server.Update() } -// Restore and update routes from in-memory state -func (s *Server) Restore() error { +// Update routes from in-memory state +func (s *Server) Update() error { mux := http.NewServeMux() for k, v := range s.Route { if v.Cert != nil && v.Key != nil { diff --git a/server_test.go b/server_test.go index 12e6a53..ee72cb0 100644 --- a/server_test.go +++ b/server_test.go @@ -15,7 +15,7 @@ import ( const ( cannary = "hello from backend" - dataFile = "test.gob" + dataFile = "test.json" ) func TestReverseProxy(t *testing.T) { -- cgit v1.2.3