mirror of
https://github.com/cmz0228/hysteria-dev.git
synced 2025-06-08 13:29:53 +00:00
Merge pull request #1183 from apernet/fix-http-sniff
fix: sniffing handled HTTP host header incorrectly
This commit is contained in:
commit
f2712aac93
@ -112,11 +112,17 @@ func (h *Sniffer) TCP(stream quic.Stream, reqAddr *string) ([]byte, error) {
|
|||||||
tr := &teeReader{Stream: stream, Pre: pre}
|
tr := &teeReader{Stream: stream, Pre: pre}
|
||||||
req, _ := http.ReadRequest(bufio.NewReader(tr))
|
req, _ := http.ReadRequest(bufio.NewReader(tr))
|
||||||
if req != nil && req.Host != "" {
|
if req != nil && req.Host != "" {
|
||||||
|
// req.Host can be host:port, in which case we need to extract the host part
|
||||||
|
host, _, err := net.SplitHostPort(req.Host)
|
||||||
|
if err != nil {
|
||||||
|
// No port, just use the whole string
|
||||||
|
host = req.Host
|
||||||
|
}
|
||||||
_, port, err := net.SplitHostPort(*reqAddr)
|
_, port, err := net.SplitHostPort(*reqAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
*reqAddr = net.JoinHostPort(req.Host, port)
|
*reqAddr = net.JoinHostPort(host, port)
|
||||||
}
|
}
|
||||||
return tr.Buffer(), nil
|
return tr.Buffer(), nil
|
||||||
} else if h.isTLS(pre) {
|
} else if h.isTLS(pre) {
|
||||||
|
@ -70,6 +70,18 @@ func TestSnifferTCP(t *testing.T) {
|
|||||||
assert.Equal(t, *buf, putback)
|
assert.Equal(t, *buf, putback)
|
||||||
assert.Equal(t, "example.com:80", reqAddr)
|
assert.Equal(t, "example.com:80", reqAddr)
|
||||||
|
|
||||||
|
// Test HTTP with Host as host:port
|
||||||
|
*buf = []byte("GET / HTTP/1.1\r\n" +
|
||||||
|
"Host: example.com:8080\r\n" +
|
||||||
|
"User-Agent: test-agent\r\n" +
|
||||||
|
"Accept: */*\r\n\r\n")
|
||||||
|
index = 0
|
||||||
|
reqAddr = "222.222.222.222:10086"
|
||||||
|
putback, err = sniffer.TCP(stream, &reqAddr)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, *buf, putback)
|
||||||
|
assert.Equal(t, "example.com:10086", reqAddr)
|
||||||
|
|
||||||
// Test TLS
|
// Test TLS
|
||||||
*buf, err = base64.StdEncoding.DecodeString("FgMBARcBAAETAwPJL2jlt1OAo+Rslkjv/aqKiTthKMaCKg2Gvd+uALDbDCDdY+UIk8ouadEB9fC3j52Y1i7SJZqGIgBRIS6kKieYrAAoEwITAcAswCvAMMAvwCTAI8AowCfACsAJwBTAEwCdAJwAPQA8ADUALwEAAKIAAAAOAAwAAAlpcGluZm8uaW8ABQAFAQAAAAAAKwAJCAMEAwMDAgMBAA0AGgAYCAQIBQgGBAEFAQIBBAMFAwIDAgIGAQYDACMAAAAKAAgABgAdABcAGAAQAAsACQhodHRwLzEuMQAzACYAJAAdACBguQbqNJNyamYxYcrBFpBP7pWv5TgZsP9gwGtMYNKVBQAxAAAAFwAA/wEAAQAALQACAQE=")
|
*buf, err = base64.StdEncoding.DecodeString("FgMBARcBAAETAwPJL2jlt1OAo+Rslkjv/aqKiTthKMaCKg2Gvd+uALDbDCDdY+UIk8ouadEB9fC3j52Y1i7SJZqGIgBRIS6kKieYrAAoEwITAcAswCvAMMAvwCTAI8AowCfACsAJwBTAEwCdAJwAPQA8ADUALwEAAKIAAAAOAAwAAAlpcGluZm8uaW8ABQAFAQAAAAAAKwAJCAMEAwMDAgMBAA0AGgAYCAQIBQgGBAEFAQIBBAMFAwIDAgIGAQYDACMAAAAKAAgABgAdABcAGAAQAAsACQhodHRwLzEuMQAzACYAJAAdACBguQbqNJNyamYxYcrBFpBP7pWv5TgZsP9gwGtMYNKVBQAxAAAAFwAA/wEAAQAALQACAQE=")
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user