This commit is contained in:
ginuerzh 2019-11-28 21:39:37 +08:00
parent 1caabf84ad
commit 4798f7d76f
2 changed files with 59 additions and 30 deletions

55
http.go
View File

@ -376,7 +376,17 @@ func (h *httpHandler) forwardRequest(conn net.Conn, req *http.Request, route *Ch
if route.IsEmpty() { if route.IsEmpty() {
return nil return nil
} }
lastNode := route.LastNode()
host := req.Host
var userpass string
if user := route.LastNode().User; user != nil {
s := user.String()
if _, set := user.Password(); !set {
s += ":"
}
userpass = base64.StdEncoding.EncodeToString([]byte(s))
}
cc, err := route.Conn() cc, err := route.Conn()
if err != nil { if err != nil {
@ -384,28 +394,47 @@ func (h *httpHandler) forwardRequest(conn net.Conn, req *http.Request, route *Ch
} }
defer cc.Close() defer cc.Close()
if lastNode.User != nil { errc := make(chan error, 1)
s := lastNode.User.String() go func() {
if _, set := lastNode.User.Password(); !set { errc <- copyBuffer(conn, cc)
s += ":" }()
}
req.Header.Set("Proxy-Authorization", go func() {
"Basic "+base64.StdEncoding.EncodeToString([]byte(s))) for {
if userpass != "" {
req.Header.Set("Proxy-Authorization", "Basic "+userpass)
} }
cc.SetWriteDeadline(time.Now().Add(WriteTimeout)) cc.SetWriteDeadline(time.Now().Add(WriteTimeout))
if !req.URL.IsAbs() { if !req.URL.IsAbs() {
req.URL.Scheme = "http" // make sure that the URL is absolute req.URL.Scheme = "http" // make sure that the URL is absolute
} }
if err = req.WriteProxy(cc); err != nil { err := req.WriteProxy(cc)
if err != nil {
log.Logf("[http] %s -> %s : %s", conn.RemoteAddr(), conn.LocalAddr(), err) log.Logf("[http] %s -> %s : %s", conn.RemoteAddr(), conn.LocalAddr(), err)
return nil errc <- err
return
} }
cc.SetWriteDeadline(time.Time{}) cc.SetWriteDeadline(time.Time{})
log.Logf("[http] %s <-> %s", conn.RemoteAddr(), req.Host) req, err = http.ReadRequest(bufio.NewReader(conn))
transport(conn, cc) if err != nil {
log.Logf("[http] %s >-< %s", conn.RemoteAddr(), req.Host) errc <- err
return
}
if Debug {
dump, _ := httputil.DumpRequest(req, false)
log.Logf("[http] %s -> %s\n%s",
conn.RemoteAddr(), conn.LocalAddr(), string(dump))
}
}
}()
log.Logf("[http] %s <-> %s", conn.RemoteAddr(), host)
<-errc
log.Logf("[http] %s >-< %s", conn.RemoteAddr(), host)
return nil return nil
} }

View File

@ -144,19 +144,11 @@ func (ln tcpKeepAliveListener) Accept() (c net.Conn, err error) {
func transport(rw1, rw2 io.ReadWriter) error { func transport(rw1, rw2 io.ReadWriter) error {
errc := make(chan error, 1) errc := make(chan error, 1)
go func() { go func() {
buf := lPool.Get().([]byte) errc <- copyBuffer(rw1, rw2)
defer lPool.Put(buf)
_, err := io.CopyBuffer(rw1, rw2, buf)
errc <- err
}() }()
go func() { go func() {
buf := lPool.Get().([]byte) errc <- copyBuffer(rw2, rw1)
defer lPool.Put(buf)
_, err := io.CopyBuffer(rw2, rw1, buf)
errc <- err
}() }()
err := <-errc err := <-errc
@ -165,3 +157,11 @@ func transport(rw1, rw2 io.ReadWriter) error {
} }
return err return err
} }
func copyBuffer(dst io.Writer, src io.Reader) error {
buf := lPool.Get().([]byte)
defer lPool.Put(buf)
_, err := io.CopyBuffer(dst, src, buf)
return err
}