aboutsummaryrefslogtreecommitdiff
path: root/server.go
diff options
context:
space:
mode:
Diffstat (limited to 'server.go')
-rw-r--r--server.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/server.go b/server.go
new file mode 100644
index 0000000..9300497
--- /dev/null
+++ b/server.go
@@ -0,0 +1,64 @@
+package goxy
+
+import (
+ "crypto/tls"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "strings"
+)
+
+type Server struct {
+ DataFile string
+ Route
+ http.Server
+}
+
+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: dataFile}
+ if dataFile != "" {
+ server.Load(dataFile)
+ }
+ RegisterRPC(server)
+ return server, server.Update()
+}
+
+// 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 {
+ 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.Host, "/") {
+ v.Host += "/"
+ }
+ switch up.Scheme {
+ case "ws":
+ mux.Handle(v.Host, NewWebSocketProxy(up))
+ default:
+ mux.Handle(v.Host, httputil.NewSingleHostReverseProxy(up))
+ }
+ }
+ s.Server.Handler = mux
+ return nil
+}
+
+func (s *Server) Start() error {
+ errc := make(chan error)
+ go func() { errc <- s.ListenAndServe() }()
+ go func() { errc <- s.ListenAndServeTLS("", "") }()
+ go func() { errc <- http.ListenAndServe(":http-alt", nil) }()
+ return <-errc
+}