(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram)
| 135 | } |
| 136 | |
| 137 | func (x *WSClient) UDPHandle(s *socks5.Server, addr *net.UDPAddr, d *socks5.Datagram) error { |
| 138 | dstb := append(append([]byte{d.Atyp}, d.DstAddr...), d.DstPort...) |
| 139 | conn, err := x.PacketConnFactory.Handle(addr, dstb, d.Data, func(b []byte) (int, error) { |
| 140 | d.Data = b |
| 141 | return s.UDPConn.WriteToUDP(d.Bytes(), addr) |
| 142 | }, x.UDPTimeout) |
| 143 | if err != nil { |
| 144 | return err |
| 145 | } |
| 146 | if conn == nil { |
| 147 | return nil |
| 148 | } |
| 149 | defer conn.Close() |
| 150 | sa := x.ServerAddress |
| 151 | if sa == "" { |
| 152 | sa = x.ServerHost |
| 153 | } |
| 154 | rc, err := WebSocketDial(addr.String(), d.Address(), sa, x.ServerHost, x.Path, x.TLSConfig, x.TCPTimeout, x.TLSFingerprint, 0, 0, 0, 0) |
| 155 | if err != nil { |
| 156 | return err |
| 157 | } |
| 158 | defer rc.Close() |
| 159 | var sc Exchanger |
| 160 | if !x.WithoutBrook { |
| 161 | sc, err = NewStreamClient("udp", x.Password, addr.String(), rc, x.UDPTimeout, dstb) |
| 162 | } |
| 163 | if x.WithoutBrook { |
| 164 | sc, err = NewSimpleStreamClient("udp", x.Password, addr.String(), rc, x.UDPTimeout, dstb) |
| 165 | } |
| 166 | if err != nil { |
| 167 | return err |
| 168 | } |
| 169 | defer sc.Clean() |
| 170 | if err := sc.Exchange(conn); err != nil { |
| 171 | return nil |
| 172 | } |
| 173 | return nil |
| 174 | } |
| 175 | |
| 176 | func (x *WSClient) Shutdown() error { |
| 177 | return x.Server.Shutdown() |
nothing calls this directly
no test coverage detected