Clash.Meta/adapters/local/http.go

65 lines
1.3 KiB
Go
Raw Normal View History

package adapters
import (
2018-08-11 22:51:30 +08:00
"net"
2018-08-27 00:06:40 +08:00
"net/http"
"strings"
C "github.com/Dreamacro/clash/constant"
)
2018-08-12 16:18:58 +08:00
// HTTPAdapter is a adapter for HTTP connection
type HTTPAdapter struct {
addr *C.Addr
2018-08-27 00:06:40 +08:00
conn net.Conn
R *http.Request
}
2018-08-12 16:18:58 +08:00
// Close HTTP connection
func (h *HTTPAdapter) Close() {
2018-08-11 22:51:30 +08:00
h.conn.Close()
}
2018-08-12 16:18:58 +08:00
// Addr return destination address
func (h *HTTPAdapter) Addr() *C.Addr {
return h.addr
}
2018-08-12 16:18:58 +08:00
// Conn return raw net.Conn of HTTP
func (h *HTTPAdapter) Conn() net.Conn {
2018-08-11 22:51:30 +08:00
return h.conn
}
2018-08-12 16:18:58 +08:00
// NewHTTP is HTTPAdapter generator
2018-08-27 00:06:40 +08:00
func NewHTTP(request *http.Request, conn net.Conn) *HTTPAdapter {
2018-08-12 16:18:58 +08:00
return &HTTPAdapter{
2018-08-27 00:06:40 +08:00
addr: parseHTTPAddr(request),
R: request,
conn: conn,
}
}
// RemoveHopByHopHeaders remove hop-by-hop header
func RemoveHopByHopHeaders(header http.Header) {
// Strip hop-by-hop header based on RFC:
// http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.5.1
// https://www.mnot.net/blog/2011/07/11/what_proxies_must_do
header.Del("Proxy-Connection")
header.Del("Proxy-Authenticate")
header.Del("Proxy-Authorization")
header.Del("TE")
header.Del("Trailers")
header.Del("Transfer-Encoding")
header.Del("Upgrade")
connections := header.Get("Connection")
header.Del("Connection")
if len(connections) == 0 {
return
}
for _, h := range strings.Split(connections, ",") {
header.Del(strings.TrimSpace(h))
2018-08-11 22:51:30 +08:00
}
}