diff options
Diffstat (limited to 'pkg/server/hook')
| -rw-r--r-- | pkg/server/hook/aes.go | 2 | ||||
| -rw-r--r-- | pkg/server/hook/auth.go | 2 | ||||
| -rw-r--r-- | pkg/server/hook/hook.go | 8 | ||||
| -rw-r--r-- | pkg/server/hook/look-http.go | 9 | ||||
| -rw-r--r-- | pkg/server/hook/proxy.go | 89 | ||||
| -rw-r--r-- | pkg/server/hook/tee.go | 2 |
6 files changed, 21 insertions, 91 deletions
diff --git a/pkg/server/hook/aes.go b/pkg/server/hook/aes.go index dc9605a..8ae47a3 100644 --- a/pkg/server/hook/aes.go +++ b/pkg/server/hook/aes.go @@ -65,7 +65,7 @@ func (a *aesPipe) Recv(rq, wq queue.Q) error { } func newAes(env env.Env) *aesPipe { - s := getHookVar(env, "secret") + s := env.GetLocal("secret") h := md5.Sum([]byte(s)) a := &aesPipe{key: make([]byte, 16)} diff --git a/pkg/server/hook/auth.go b/pkg/server/hook/auth.go index b31855a..14ad114 100644 --- a/pkg/server/hook/auth.go +++ b/pkg/server/hook/auth.go @@ -151,7 +151,7 @@ func (a *auth) Recv(rq, wq queue.Q) error { func (h *authHook) Open(env env.Env) (interface{}, error) { a := &auth{ h: h, - secret: getHookVar(env, "secret"), + secret: env.GetLocal("secret"), recvChallenge: make(chan struct{}), recvHash: make(chan struct{}), fail: make(chan struct{}), diff --git a/pkg/server/hook/hook.go b/pkg/server/hook/hook.go index 1702afd..6ac51a1 100644 --- a/pkg/server/hook/hook.go +++ b/pkg/server/hook/hook.go @@ -113,14 +113,6 @@ func New(desc string, env env.Env) (H, error) { } } -func getHookVar(env env.Env, s string) string { - if v := env.Eval("@{tunnel.@{tunnel}." + s + "}"); v != "" { - return v - } - - return env.Get(s) -} - func register(name string, f hookInitFunc) { if _, ok := hooks[name]; ok { log.Panicf("duplicate hook name '%s'", name) diff --git a/pkg/server/hook/look-http.go b/pkg/server/hook/look-http.go index d467563..50ec663 100644 --- a/pkg/server/hook/look-http.go +++ b/pkg/server/hook/look-http.go @@ -2,7 +2,7 @@ package hook import ( "bufio" - "strings" + "tunnel/pkg/http" "tunnel/pkg/server/env" "tunnel/pkg/server/opts" "tunnel/pkg/server/queue" @@ -28,11 +28,8 @@ func (look *lookHttp) Send(rq, wq queue.Q) error { }() if s.Scan() { - if w := strings.Split(s.Text(), " "); len(w) > 1 { - switch m := strings.ToUpper(w[0]); m { - case "CONNECT", "GET", "POST": - look.env.Set("look.info", m+" "+w[1]) - } + if method, uri, _, ok := http.ParseRequestLine(s.Text()); ok { + look.env.Set("look.info", method+" "+uri) } } diff --git a/pkg/server/hook/proxy.go b/pkg/server/hook/proxy.go index 64db784..26be2d0 100644 --- a/pkg/server/hook/proxy.go +++ b/pkg/server/hook/proxy.go @@ -1,23 +1,17 @@ package hook import ( - "bufio" "bytes" - "encoding/base64" "errors" "fmt" - "io" "regexp" - "strconv" + "tunnel/pkg/http" "tunnel/pkg/server/env" "tunnel/pkg/server/opts" "tunnel/pkg/server/queue" ) var addrRe = regexp.MustCompile("^[0-9a-zA-Z-.]+:[0-9]+$") -var respRe = regexp.MustCompile("^([^ ]+) +([0-9]+) +(.*)$") - -var errBadHttpResponse = errors.New("bad HTTP response") type proxyHook struct { addr string @@ -27,93 +21,41 @@ type proxyHook struct { type proxy struct { addr string auth string - ok chan struct{} - fail chan struct{} + c chan bool } func (p *proxy) Send(rq, wq queue.Q) error { var out bytes.Buffer - fmt.Fprintf(&out, "CONNECT %s HTTP/1.0\r\n", p.addr) + fmt.Fprintf(&out, "CONNECT %s HTTP/1.1\r\n", p.addr) if p.auth != "" { - encoded := base64.StdEncoding.EncodeToString([]byte(p.auth)) - fmt.Fprintf(&out, "Proxy-Authorization: Basic %s\r\n", encoded) + encoded := http.BasicAuthEncode(p.auth) + fmt.Fprintf(&out, "Proxy-Authorization: %s\r\n", encoded) } fmt.Fprintf(&out, "\r\n") wq <- out.Bytes() - select { - case <-p.fail: + if !<-p.c { return nil - case <-p.ok: } return queue.Copy(rq, wq) } -func parseProxyResponse(s string) error { - var version string - var code int - var desc string - - if m := respRe.FindStringSubmatch(s); m == nil { - return errBadHttpResponse - } else { - version = m[1] - if c, err := strconv.Atoi(m[2]); err != nil { - return errBadHttpResponse - } else { - code = c - } - desc = m[3] - } - - if version != "HTTP/1.0" && version != "HTTP/1.1" { - return errBadHttpResponse - } - - if code != 200 { - return fmt.Errorf("connect failed: %d %s", code, desc) - } - - return nil -} - -func (p *proxy) Recv(rq, wq queue.Q) (err error) { - defer func() { - if err != nil { - close(p.fail) - } - }() - - s := bufio.NewScanner(rq.Reader()) - - var resp bool - - for s.Scan() { - line := s.Text() - - if !resp { - if err := parseProxyResponse(line); err != nil { - return err - } - resp = true - continue - } +func (p *proxy) Recv(rq, wq queue.Q) error { + resp, err := http.ParseResponse(rq.Reader()) - if line == "" { - break - } + if err == nil && resp.Code != http.OK { + err = fmt.Errorf("connect failed: %d %s", resp.Code, resp.Desc) } - if err := s.Err(); err != nil { + if err != nil { + p.c <- false return err - } else if !resp { - return io.ErrUnexpectedEOF } - close(p.ok) + p.c <- true return queue.Copy(rq, wq) } @@ -122,12 +64,11 @@ func (h *proxyHook) Open(env env.Env) (interface{}, error) { p := &proxy{ addr: h.addr, auth: h.auth, - ok: make(chan struct{}), - fail: make(chan struct{}), + c: make(chan bool), } if p.auth == "" { - p.auth = getHookVar(env, "proxy.auth") + p.auth = env.GetLocal("proxy.auth") } return p, nil diff --git a/pkg/server/hook/tee.go b/pkg/server/hook/tee.go index 521164b..2d13fcb 100644 --- a/pkg/server/hook/tee.go +++ b/pkg/server/hook/tee.go @@ -64,7 +64,7 @@ func (h *teeHook) where(env env.Env) string { return h.file } - if v := getHookVar(env, "tee.file"); v != "" { + if v := env.GetLocal("tee.file"); v != "" { return v } |
