mirror of
https://gitclone.com/github.com/MetaCubeX/Clash.Meta
synced 2025-02-23 20:52:15 +08:00
Fix: reuse http connection broken on previous commit
This commit is contained in:
parent
3f3db8476e
commit
824f5bd731
@ -21,6 +21,9 @@ func handleHTTP(ctx *context.HTTPContext, outbound net.Conn) {
|
|||||||
req := ctx.Request()
|
req := ctx.Request()
|
||||||
conn := ctx.Conn()
|
conn := ctx.Conn()
|
||||||
|
|
||||||
|
// make outbound close after inbound error or close
|
||||||
|
conn = &connLinker{conn, outbound}
|
||||||
|
|
||||||
inboundReader := bufio.NewReader(conn)
|
inboundReader := bufio.NewReader(conn)
|
||||||
outboundReader := bufio.NewReader(outbound)
|
outboundReader := bufio.NewReader(outbound)
|
||||||
|
|
||||||
@ -31,7 +34,6 @@ func handleHTTP(ctx *context.HTTPContext, outbound net.Conn) {
|
|||||||
|
|
||||||
req.RequestURI = ""
|
req.RequestURI = ""
|
||||||
inbound.RemoveHopByHopHeaders(req.Header)
|
inbound.RemoveHopByHopHeaders(req.Header)
|
||||||
req.Header.Set("Connection", "close")
|
|
||||||
err := req.Write(outbound)
|
err := req.Write(outbound)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
@ -160,3 +162,31 @@ func relay(leftConn, rightConn net.Conn) {
|
|||||||
rightConn.SetReadDeadline(time.Now())
|
rightConn.SetReadDeadline(time.Now())
|
||||||
<-ch
|
<-ch
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// connLinker make the two net.Conn correlated, for temporary resolution of leaks.
|
||||||
|
// There is no better way to do this for now.
|
||||||
|
type connLinker struct {
|
||||||
|
net.Conn
|
||||||
|
linker net.Conn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conn *connLinker) Read(b []byte) (n int, err error) {
|
||||||
|
n, err = conn.Conn.Read(b)
|
||||||
|
if err != nil {
|
||||||
|
conn.linker.Close()
|
||||||
|
}
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conn *connLinker) Write(b []byte) (n int, err error) {
|
||||||
|
n, err = conn.Conn.Write(b)
|
||||||
|
if err != nil {
|
||||||
|
conn.linker.Close()
|
||||||
|
}
|
||||||
|
return n, err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (conn *connLinker) Close() error {
|
||||||
|
conn.linker.Close()
|
||||||
|
return conn.Conn.Close()
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user