aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-03-28 19:49:29 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-03-28 19:49:29 +0200
commit1c6056b6fcc22e4335683f6e0f28b7d73b2013e9 (patch)
tree3e779bb0606ac7877027552a896c65918ac8e44f /server.go
parentdbb5e2ce7f1ff71e29d4065957d0ab603d2157c0 (diff)
Cleanup
Diffstat (limited to 'server.go')
-rw-r--r--server.go33
1 files changed, 33 insertions, 0 deletions
diff --git a/server.go b/server.go
index 0f0bdad..437df4d 100644
--- a/server.go
+++ b/server.go
@@ -5,7 +5,10 @@ import (
"encoding/gob"
"log"
"net/http"
+ "net/http/httputil"
+ "net/url"
"os"
+ "strings"
)
type Server struct {
@@ -54,6 +57,36 @@ func (s *Server) Load() error {
return nil
}
+// Restore and update routes from in-memory state
+func (s *Server) Restore() error {
+ mux := http.NewServeMux()
+ for k, v := range s.Route {
+ if v.Cert != nil && v.Key != nil {
+ cert, err := tls.X509KeyPair(v.Cert, v.Key)
+ if err != nil {
+ return err
+ }
+ v.cert = &cert
+ s.Route[k] = v
+ }
+ up, err := url.Parse(v.Upstream)
+ if err != nil {
+ return err
+ }
+ if !strings.Contains(v.ServerName, "/") {
+ v.ServerName += "/"
+ }
+ switch up.Scheme {
+ case "ws":
+ mux.Handle(v.ServerName, httputil.NewSingleHostReverseProxy(up))
+ default:
+ mux.Handle(v.ServerName, NewReverseProxy(up))
+ }
+ }
+ s.Server.Handler = mux
+ return nil
+}
+
func (s *Server) Start() <-chan error {
errc := make(chan error, 3)
go func() { errc <- s.ListenAndServe() }()