mirror of
https://github.com/shtorm-7/sing-box-extended.git
synced 2026-08-07 06:15:15 +03:00
Fix v2rayhttp upgrade leak
This commit is contained in:
@@ -87,22 +87,27 @@ func (c *Client) DialContext(ctx context.Context) (net.Conn, error) {
|
|||||||
request.Header.Set("Upgrade", "websocket")
|
request.Header.Set("Upgrade", "websocket")
|
||||||
err = request.Write(conn)
|
err = request.Write(conn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
bufReader := std_bufio.NewReader(conn)
|
bufReader := std_bufio.NewReader(conn)
|
||||||
response, err := http.ReadResponse(bufReader, request)
|
response, err := http.ReadResponse(bufReader, request)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if response.StatusCode != 101 ||
|
if response.StatusCode != 101 ||
|
||||||
!strings.EqualFold(response.Header.Get("Connection"), "upgrade") ||
|
!strings.EqualFold(response.Header.Get("Connection"), "upgrade") ||
|
||||||
!strings.EqualFold(response.Header.Get("Upgrade"), "websocket") {
|
!strings.EqualFold(response.Header.Get("Upgrade"), "websocket") {
|
||||||
|
conn.Close()
|
||||||
|
response.Body.Close()
|
||||||
return nil, E.New("v2ray-http-upgrade: unexpected status: ", response.Status)
|
return nil, E.New("v2ray-http-upgrade: unexpected status: ", response.Status)
|
||||||
}
|
}
|
||||||
if bufReader.Buffered() > 0 {
|
if bufReader.Buffered() > 0 {
|
||||||
buffer := buf.NewSize(bufReader.Buffered())
|
buffer := buf.NewSize(bufReader.Buffered())
|
||||||
_, err = buffer.ReadFullFrom(bufReader, buffer.Len())
|
_, err = buffer.ReadFullFrom(bufReader, buffer.Len())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
conn = bufio.NewCachedConn(conn, buffer)
|
conn = bufio.NewCachedConn(conn, buffer)
|
||||||
|
|||||||
@@ -93,12 +93,14 @@ func (c *Client) dialContext(ctx context.Context, requestURL *url.URL, headers h
|
|||||||
reader, _, err := ws.Dialer{Header: ws.HandshakeHeaderHTTP(headers), Protocols: protocols}.Upgrade(deadlineConn, requestURL)
|
reader, _, err := ws.Dialer{Header: ws.HandshakeHeaderHTTP(headers), Protocols: protocols}.Upgrade(deadlineConn, requestURL)
|
||||||
deadlineConn.SetDeadline(time.Time{})
|
deadlineConn.SetDeadline(time.Time{})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if reader != nil {
|
if reader != nil {
|
||||||
buffer := buf.NewSize(reader.Buffered())
|
buffer := buf.NewSize(reader.Buffered())
|
||||||
_, err = buffer.ReadFullFrom(reader, buffer.Len())
|
_, err = buffer.ReadFullFrom(reader, buffer.Len())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
conn = bufio.NewCachedConn(conn, buffer)
|
conn = bufio.NewCachedConn(conn, buffer)
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ func (c *EarlyWebsocketConn) writeRequest(content []byte) error {
|
|||||||
if len(lateData) > 0 {
|
if len(lateData) > 0 {
|
||||||
_, err = conn.Write(lateData)
|
_, err = conn.Write(lateData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
conn.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user