http1_transport.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package httpclient
  2. import (
  3. "context"
  4. "net"
  5. "net/http"
  6. "github.com/sagernet/sing-box/common/tls"
  7. M "github.com/sagernet/sing/common/metadata"
  8. N "github.com/sagernet/sing/common/network"
  9. )
  10. type http1Transport struct {
  11. transport *http.Transport
  12. }
  13. func newHTTP1Transport(rawDialer N.Dialer, baseTLSConfig tls.Config) *http1Transport {
  14. transport := &http.Transport{
  15. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  16. return rawDialer.DialContext(ctx, network, M.ParseSocksaddr(addr))
  17. },
  18. }
  19. if baseTLSConfig != nil {
  20. transport.DialTLSContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
  21. return dialTLS(ctx, rawDialer, baseTLSConfig, M.ParseSocksaddr(addr), []string{"http/1.1"}, "")
  22. }
  23. }
  24. return &http1Transport{transport: transport}
  25. }
  26. func (t *http1Transport) RoundTrip(request *http.Request) (*http.Response, error) {
  27. return t.transport.RoundTrip(request)
  28. }
  29. func (t *http1Transport) CloseIdleConnections() {
  30. t.transport.CloseIdleConnections()
  31. }
  32. func (t *http1Transport) Close() error {
  33. t.CloseIdleConnections()
  34. return nil
  35. }