Hunter0x7c7
2022-08-11 a82f9cb69f63aaeba40c024960deda7d75b9fece
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
package http
 
import (
    "net/http"
    "strconv"
    "strings"
 
    "github.com/v2fly/v2ray-core/v5/common/net"
)
 
// ParseXForwardedFor parses X-Forwarded-For header in http headers, and return the IP list in it.
func ParseXForwardedFor(header http.Header) []net.Address {
    xff := header.Get("X-Forwarded-For")
    if xff == "" {
        return nil
    }
    list := strings.Split(xff, ",")
    addrs := make([]net.Address, 0, len(list))
    for _, proxy := range list {
        addrs = append(addrs, net.ParseAddress(proxy))
    }
    return addrs
}
 
// RemoveHopByHopHeaders remove hop by hop headers in http header list.
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 connections == "" {
        return
    }
    for _, h := range strings.Split(connections, ",") {
        header.Del(strings.TrimSpace(h))
    }
}
 
// ParseHost splits host and port from a raw string. Default port is used when raw string doesn't contain port.
func ParseHost(rawHost string, defaultPort net.Port) (net.Destination, error) {
    port := defaultPort
    host, rawPort, err := net.SplitHostPort(rawHost)
    if err != nil {
        if addrError, ok := err.(*net.AddrError); ok && strings.Contains(addrError.Err, "missing port") {
            host = rawHost
        } else {
            return net.Destination{}, err
        }
    } else if len(rawPort) > 0 {
        intPort, err := strconv.ParseUint(rawPort, 0, 16)
        if err != nil {
            return net.Destination{}, err
        }
        port = net.Port(intPort)
    }
 
    return net.TCPDestination(net.ParseAddress(host), port), nil
}