aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-04-04 14:47:27 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-04-04 14:47:27 +0200
commita09a47d1f8812e837080d5af9461113109555b23 (patch)
treeee6c98582c657a895ee7b0b9bb5ddbc40083a0e2
parent1ef50ddd7f6ae07c68fec7c87c7052e4004179ea (diff)
Split files
-rw-r--r--cert.go46
-rw-r--r--route.go18
-rw-r--r--rpc.go12
-rw-r--r--server.go40
-rw-r--r--ws.go16
5 files changed, 69 insertions, 63 deletions
diff --git a/cert.go b/cert.go
new file mode 100644
index 0000000..38c534d
--- /dev/null
+++ b/cert.go
@@ -0,0 +1,46 @@
+package goxy
+
+import (
+ "crypto/tls"
+ "crypto/x509"
+ "fmt"
+ "net/http"
+)
+
+// Certs holds certificates
+type Certs map[string]*tls.Certificate
+
+// GetCertificate returns certificate for SNI negotiation
+func (c Certs) getCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error) {
+ if v, ok := c[h.ServerName]; ok {
+ return v, nil
+ }
+ return nil, fmt.Errorf("no cert for %q", h.ServerName)
+}
+
+func (c Certs) addCertificate(cert, key []byte) error {
+ crt, err := tls.X509KeyPair(cert, key)
+ if err != nil {
+ return err
+ }
+ crt.Leaf, err = x509.ParseCertificate(crt.Certificate[0])
+ if err != nil {
+ return err
+ }
+ if cn := crt.Leaf.Subject.CommonName; cn != "" {
+ c[cn] = &crt
+ }
+ for _, name := range crt.Leaf.DNSNames {
+ c[name] = &crt
+ }
+ for _, ip := range crt.Leaf.IPAddresses {
+ c[ip.String()] = &crt
+ }
+ return nil
+}
+
+func (c Certs) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
+ for k, v := range c {
+ fmt.Fprintf(w, "%v: valid untill %v\n", k, v.Leaf.NotAfter)
+ }
+}
diff --git a/route.go b/route.go
index e4de1de..26754ac 100644
--- a/route.go
+++ b/route.go
@@ -4,7 +4,6 @@ import (
"encoding/json"
"fmt"
"net/http"
- "net/url"
"os"
)
@@ -20,12 +19,6 @@ func (r Route) String() string {
return fmt.Sprintf("%v → %v", r.Host, r.Upstream)
}
-func (r Routes) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
- for _, v := range r {
- fmt.Fprintln(w, v)
- }
-}
-
func (r Routes) Save(fname string) error {
fd, err := os.Create(fname)
if err != nil {
@@ -44,13 +37,8 @@ func (r *Routes) Load(fname string) error {
return json.NewDecoder(fd).Decode(r)
}
-func Slug(host string) (string, bool, error) {
- h, err := url.Parse(host)
- if err != nil {
- return "", false, err
- }
- if h.Path == "" {
- h.Path = "/"
+func (r Routes) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
+ for _, v := range r {
+ fmt.Fprintln(w, v)
}
- return h.Host + h.Path, h.Scheme == "https", nil
}
diff --git a/rpc.go b/rpc.go
index 1f3c877..10c311f 100644
--- a/rpc.go
+++ b/rpc.go
@@ -4,6 +4,7 @@ import (
"errors"
"fmt"
"net/rpc"
+ "net/url"
)
var (
@@ -65,3 +66,14 @@ func (s GoXY) List(_ struct{}, ret *[]string) error {
}
return nil
}
+
+func Slug(host string) (string, bool, error) {
+ h, err := url.Parse(host)
+ if err != nil {
+ return "", false, err
+ }
+ if h.Path == "" {
+ h.Path = "/"
+ }
+ return h.Host + h.Path, h.Scheme == "https", nil
+}
diff --git a/server.go b/server.go
index d31c1d8..d47ba52 100644
--- a/server.go
+++ b/server.go
@@ -2,8 +2,6 @@ package goxy
import (
"crypto/tls"
- "crypto/x509"
- "fmt"
"net/http"
"net/http/httputil"
"net/url"
@@ -18,44 +16,6 @@ type Server struct {
rpcServer http.Server
}
-// Certs holds certificates
-type Certs map[string]*tls.Certificate
-
-// GetCertificate returns certificate for SNI negotiation
-func (c Certs) getCertificate(h *tls.ClientHelloInfo) (*tls.Certificate, error) {
- if v, ok := c[h.ServerName]; ok {
- return v, nil
- }
- return nil, fmt.Errorf("no cert for %q", h.ServerName)
-}
-
-func (c Certs) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
- for k, v := range c {
- fmt.Fprintf(w, "%v: valid untill %v\n", k, v.Leaf.NotAfter)
- }
-}
-
-func (c Certs) addCertificate(cert, key []byte) error {
- crt, err := tls.X509KeyPair(cert, key)
- if err != nil {
- return err
- }
- crt.Leaf, err = x509.ParseCertificate(crt.Certificate[0])
- if err != nil {
- return err
- }
- if cn := crt.Leaf.Subject.CommonName; cn != "" {
- c[cn] = &crt
- }
- for _, name := range crt.Leaf.DNSNames {
- c[name] = &crt
- }
- for _, ip := range crt.Leaf.IPAddresses {
- c[ip.String()] = &crt
- }
- return nil
-}
-
func NewServer(dataFile, listenWWW, listenTLS, listenRPC string) (*Server, error) {
if listenRPC == "" {
listenRPC = RPCPort
diff --git a/ws.go b/ws.go
index b1cb1a3..b07a17b 100644
--- a/ws.go
+++ b/ws.go
@@ -11,6 +11,14 @@ type WebSocketProxy struct {
Director func(*http.Request)
}
+func NewWebSocketProxy(target *url.URL) *WebSocketProxy {
+ director := func(req *http.Request) {
+ req.URL.Scheme = target.Scheme
+ req.URL.Host = target.Host
+ }
+ return &WebSocketProxy{Director: director}
+}
+
func (p *WebSocketProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
p.Director(r)
d, err := net.Dial("tcp", r.URL.Host)
@@ -48,11 +56,3 @@ func (p *WebSocketProxy) ServeHTTP(w http.ResponseWriter, r *http.Request) {
go cp(conn, d)
<-errc
}
-
-func NewWebSocketProxy(target *url.URL) *WebSocketProxy {
- director := func(req *http.Request) {
- req.URL.Scheme = target.Scheme
- req.URL.Host = target.Host
- }
- return &WebSocketProxy{Director: director}
-}