summaryrefslogtreecommitdiff
path: root/pkg/server/hook
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/server/hook')
-rw-r--r--pkg/server/hook/aes.go2
-rw-r--r--pkg/server/hook/auth.go2
-rw-r--r--pkg/server/hook/hook.go8
-rw-r--r--pkg/server/hook/look-http.go9
-rw-r--r--pkg/server/hook/proxy.go89
-rw-r--r--pkg/server/hook/tee.go2
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
}