client.go 842 B

12345678910111213141516171819202122232425262728293031323334
  1. package http
  2. import (
  3. "context"
  4. gohttp "net/http"
  5. "github.com/xtls/xray-core/common/net"
  6. "github.com/xtls/xray-core/transport/internet"
  7. )
  8. // NewClient creates an HTTP client with with internal dialer and using the given sockopt.
  9. // sockopt can only have one or empty.
  10. func NewClient(sockopt ...*internet.SocketConfig) *gohttp.Client {
  11. var Sockopt *internet.SocketConfig
  12. switch len(sockopt) {
  13. case 0:
  14. case 1:
  15. Sockopt = sockopt[0]
  16. default:
  17. panic("sockopt can only be nil or have one")
  18. }
  19. httpClient := &gohttp.Client{
  20. Transport: &gohttp.Transport{
  21. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  22. dest, err := net.ParseDestination(network + ":" + addr)
  23. if err != nil {
  24. return nil, err
  25. }
  26. return internet.DialSystem(ctx, dest, Sockopt)
  27. },
  28. },
  29. }
  30. return httpClient
  31. }