aboutsummaryrefslogtreecommitdiff
path: root/route.go
diff options
context:
space:
mode:
Diffstat (limited to 'route.go')
-rw-r--r--route.go75
1 files changed, 27 insertions, 48 deletions
diff --git a/route.go b/route.go
index acc3d4e..93a18d3 100644
--- a/route.go
+++ b/route.go
@@ -1,26 +1,15 @@
-package main
+package goxy
import (
"crypto/tls"
+ "encoding/json"
"errors"
- "net/http"
- "net/http/httputil"
- "net/url"
- "strings"
+ "os"
)
// Route defines a set of routes including correspondent TLS certificates
type Route map[string]Entry
-// Entry holds routing settings
-type Entry struct {
- ServerName string
- Upstream string
- Cert []byte
- Key []byte
- cert *tls.Certificate
-}
-
// GetCertificate returns certificate for SNI negotiation
func (r Route) GetCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error) {
if e, ok := r[h.ServerName]; ok && e.cert != nil {
@@ -29,47 +18,37 @@ func (r Route) GetCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error)
return nil, errors.New("no cert for " + h.ServerName)
}
-func NewReverseProxy(target *url.URL) *httputil.ReverseProxy {
- director := func(req *http.Request) {
- req.URL.Scheme = target.Scheme
- req.URL.Host = target.Host
+// Save routes to persistent file
+func (r Route) Save(fname string) error {
+ fd, err := os.Create(fname)
+ if err != nil {
+ return err
}
- return &httputil.ReverseProxy{Director: director}
+ defer fd.Close()
+ return json.NewEncoder(fd).Encode(r)
}
-// Restore and update routes from in-memory state
-func (r Route) Restore() error {
- mux := http.NewServeMux()
- for k, v := range route {
- if v.Cert != nil && v.Key != nil {
- cert, err := tls.X509KeyPair(v.Cert, v.Key)
- if err != nil {
- return err
- }
- v.cert = &cert
- r[k] = v
- }
- up, err := url.Parse(v.Upstream)
- if err != nil {
- return err
- }
- if !strings.Contains(v.ServerName, "/") {
- v.ServerName += "/"
- }
- //mux.Handle(v.ServerName, httputil.NewSingleHostReverseProxy(up))
- switch up.Scheme {
- case "ws":
- mux.Handle(v.ServerName, NewWebSocketProxy(up))
- default:
- mux.Handle(v.ServerName, NewReverseProxy(up))
- }
+// Load routes from persistent file
+func (r *Route) Load(fname string) error {
+ fd, err := os.Open(fname)
+ if err != nil {
+ return err
}
- server.Handler = mux
- return nil
+ defer fd.Close()
+ return json.NewDecoder(fd).Decode(r)
+}
+
+// Entry holds routing settings
+type Entry struct {
+ Host string // HostName
+ Upstream string // URL
+ Cert []byte // PEM
+ Key []byte // PEM
+ cert *tls.Certificate // Parsed
}
func (e Entry) String() string {
- ret := e.ServerName + " → " + e.Upstream
+ ret := e.Host + " → " + e.Upstream
if e.cert != nil {
ret += " with TLS"
}