HandleConnectMasque creates a new TCP or UDP stream via the relayClient and returns the connected stream upon success.
(relayClient *masqueH3.Client, c net.Conn, target string, isTcp bool, fail connFailFunc)
| 321 | // HandleConnectMasque creates a new TCP or UDP stream via the relayClient and |
| 322 | // returns the connected stream upon success. |
| 323 | func HandleConnectMasque(relayClient *masqueH3.Client, c net.Conn, target string, isTcp bool, fail connFailFunc) (io.ReadWriteCloser, error) { |
| 324 | _, port, err := net.SplitHostPort(target) |
| 325 | if err != nil { |
| 326 | logger.Error("Failed to split host and port", "err", err) |
| 327 | fail(c) |
| 328 | if err := c.Close(); err != nil { |
| 329 | logger.Error("Failed to close c", "err", err) |
| 330 | } |
| 331 | return nil, err |
| 332 | } |
| 333 | |
| 334 | portInt, err := strconv.Atoi(port) |
| 335 | if err != nil { |
| 336 | logger.Error("Failed to convert port to int", "err", err) |
| 337 | fail(c) |
| 338 | if err := c.Close(); err != nil { |
| 339 | logger.Error("Failed to close c", "err", err) |
| 340 | } |
| 341 | return nil, err |
| 342 | } |
| 343 | |
| 344 | if masque.IsDisallowedPort(uint16(portInt)) { |
| 345 | logger.Error("Disallowed port", "port", port) |
| 346 | fail(c) |
| 347 | if err := c.Close(); err != nil { |
| 348 | logger.Error("Failed to close c", "err", err) |
| 349 | } |
| 350 | return nil, fmt.Errorf("Disallowed port: %s", port) |
| 351 | } |
| 352 | |
| 353 | var masqueConn io.ReadWriteCloser |
| 354 | if isTcp { |
| 355 | masqueConn, err = relayClient.CreateTCPStream(target) |
| 356 | if err != nil { |
| 357 | logger.Error("Failed to create TCP stream", "err", err) |
| 358 | fail(c) |
| 359 | if err := c.Close(); err != nil { |
| 360 | logger.Error("Failed to close c", "err", err) |
| 361 | } |
| 362 | return nil, err |
| 363 | } |
| 364 | } else { |
| 365 | masqueConn, err = relayClient.CreateUDPStream(target) |
| 366 | if err != nil { |
| 367 | logger.Error("Failed to create UDP stream", "err", err) |
| 368 | fail(c) |
| 369 | if err := c.Close(); err != nil { |
| 370 | logger.Error("Failed to close c", "err", err) |
| 371 | } |
| 372 | return nil, err |
| 373 | } |
| 374 | } |
| 375 | |
| 376 | return masqueConn, nil |
| 377 | } |
no test coverage detected