aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-03-30 11:17:28 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-03-30 11:17:28 +0200
commit3071e59632c668696f8bf1c6d9e3bc07b61f6391 (patch)
treece807d29390f0f3590d1af0d68eee3ef9acd6921
parentb0eac3a85d7b2ddeb82214d4d4527d0dd73f5523 (diff)
Cleanuprefactor
-rw-r--r--route.go22
-rw-r--r--rpc.go15
-rw-r--r--server.go42
-rw-r--r--server_test.go2
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) {