fix #388
This commit is contained in:
parent
1caabf84ad
commit
4798f7d76f
55
http.go
55
http.go
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
20
server.go
20
server.go
@ -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
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user