(link string)
| 52 | } |
| 53 | |
| 54 | func NewBrookLink(link string) (*BrookLink, error) { |
| 55 | var address, host, path string |
| 56 | kind, server, v, err := ParseLink(link) |
| 57 | if err != nil { |
| 58 | return nil, err |
| 59 | } |
| 60 | p := []byte(v.Get("password")) |
| 61 | if kind == "server" { |
| 62 | address = server |
| 63 | } |
| 64 | var tc *tls.Config |
| 65 | var tlsfingerprint utls.ClientHelloID |
| 66 | var fragmentMinLength int64 |
| 67 | var fragmentMaxLength int64 |
| 68 | var fragmentMinDelay int64 |
| 69 | var fragmentMaxDelay int64 |
| 70 | if kind == "socks5" || kind == "wsserver" || kind == "wssserver" || kind == "quicserver" { |
| 71 | u, err := url.Parse(server) |
| 72 | if err != nil { |
| 73 | return nil, err |
| 74 | } |
| 75 | host = u.Host |
| 76 | path = u.Path |
| 77 | if path == "" { |
| 78 | path = "/ws" |
| 79 | } |
| 80 | address = host |
| 81 | if kind == "wsserver" || kind == "wssserver" || kind == "quicserver" { |
| 82 | if v.Get("address") != "" { |
| 83 | address = v.Get("address") |
| 84 | } |
| 85 | } |
| 86 | if kind == "wssserver" || kind == "quicserver" { |
| 87 | h, _, err := net.SplitHostPort(u.Host) |
| 88 | if err != nil { |
| 89 | return nil, err |
| 90 | } |
| 91 | tc = &tls.Config{ServerName: h} |
| 92 | if v.Get("insecure") == "true" { |
| 93 | tc.InsecureSkipVerify = true |
| 94 | } |
| 95 | if v.Get("ca") != "" { |
| 96 | roots := x509.NewCertPool() |
| 97 | ok := roots.AppendCertsFromPEM([]byte(v.Get("ca"))) |
| 98 | if !ok { |
| 99 | return nil, errors.New("failed to parse root certificate") |
| 100 | } |
| 101 | tc.RootCAs = roots |
| 102 | } |
| 103 | if kind == "wssserver" { |
| 104 | tc.NextProtos = []string{"http/1.1"} |
| 105 | } |
| 106 | if kind == "quicserver" { |
| 107 | tc.NextProtos = []string{"h3"} |
| 108 | } |
| 109 | } |
| 110 | if kind == "wsserver" || kind == "wssserver" || kind == "quicserver" { |
| 111 | if v.Get("withoutBrookProtocol") == "true" { |
no test coverage detected