Skip to content

Commit

Permalink
added option to explicitly disable ipv4;
Browse files Browse the repository at this point in the history
  • Loading branch information
bogdanfinn committed Jul 19, 2024
1 parent e5e96c7 commit 57309a9
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 4 deletions.
6 changes: 5 additions & 1 deletion cffi_src/factory.go
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,10 @@ func getTlsClient(requestInput RequestInput, sessionId string, withSession bool)
options = append(options, tls_client.WithDisableIPV6())
}

if requestInput.DisableIPV4 {
options = append(options, tls_client.WithDisableIPV4())
}

if requestInput.TransportOptions != nil {
transportOptions := &tls_client.TransportOptions{
DisableKeepAlives: requestInput.TransportOptions.DisableKeepAlives,
Expand All @@ -320,7 +324,7 @@ func getTlsClient(requestInput RequestInput, sessionId string, withSession bool)
WriteBufferSize: requestInput.TransportOptions.WriteBufferSize,
ReadBufferSize: requestInput.TransportOptions.ReadBufferSize,
IdleConnTimeout: requestInput.TransportOptions.IdleConnTimeout,
// RootCAs: requestInput.TransportOptions.RootCAs,
//RootCAs: requestInput.TransportOptions.RootCAs,
}

options = append(options, tls_client.WithTransportOptions(transportOptions))
Expand Down
1 change: 1 addition & 0 deletions cffi_src/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ type RequestInput struct {
IsByteResponse bool `json:"isByteResponse"`
IsRotatingProxy bool `json:"isRotatingProxy"`
DisableIPV6 bool `json:"disableIPV6"`
DisableIPV4 bool `json:"disableIPV4"`
LocalAddress *string `json:"localAddress"`
ServerNameOverwrite *string `json:"serverNameOverwrite"`
ProxyUrl *string `json:"proxyUrl"`
Expand Down
4 changes: 2 additions & 2 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func buildFromConfig(logger Logger, config *httpClientConfig) (*http.Client, ban

clientProfile := config.clientProfile

transport, err := newRoundTripper(clientProfile, config.transportOptions, config.serverNameOverwrite, config.insecureSkipVerify, config.withRandomTlsExtensionOrder, config.forceHttp1, config.certificatePins, config.badPinHandler, config.disableIPV6, bandwidthTracker, dialer)
transport, err := newRoundTripper(clientProfile, config.transportOptions, config.serverNameOverwrite, config.insecureSkipVerify, config.withRandomTlsExtensionOrder, config.forceHttp1, config.certificatePins, config.badPinHandler, config.disableIPV6, config.disableIPV4, bandwidthTracker, dialer)
if err != nil {
return nil, nil, clientProfile, err
}
Expand Down Expand Up @@ -242,7 +242,7 @@ func (c *httpClient) applyProxy() error {
dialer = proxyDialer
}

transport, err := newRoundTripper(c.config.clientProfile, c.config.transportOptions, c.config.serverNameOverwrite, c.config.insecureSkipVerify, c.config.withRandomTlsExtensionOrder, c.config.forceHttp1, c.config.certificatePins, c.config.badPinHandler, c.config.disableIPV6, c.bandwidthTracker, dialer)
transport, err := newRoundTripper(c.config.clientProfile, c.config.transportOptions, c.config.serverNameOverwrite, c.config.insecureSkipVerify, c.config.withRandomTlsExtensionOrder, c.config.forceHttp1, c.config.certificatePins, c.config.badPinHandler, c.config.disableIPV6, c.config.disableIPV4, c.bandwidthTracker, dialer)
if err != nil {
return err
}
Expand Down
9 changes: 9 additions & 0 deletions client_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ type httpClientConfig struct {

// Establish a connection to origin server via ipv4 only
disableIPV6 bool
// Establish a connection to origin server via ipv6 only
disableIPV4 bool
dialer net.Dialer

enabledBandwidthTracker bool
Expand Down Expand Up @@ -243,6 +245,13 @@ func WithDisableIPV6() HttpClientOption {
}
}

// WithDisableIPV4 configures a dialer to use tcp6 network argument
func WithDisableIPV4() HttpClientOption {
return func(config *httpClientConfig) {
config.disableIPV4 = true
}
}

// WithBandwidthTracker configures a client to track the bandwidth used by the client.
func WithBandwidthTracker() HttpClientOption {
return func(config *httpClientConfig) {
Expand Down
8 changes: 7 additions & 1 deletion roundtripper.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ type roundTripper struct {
transportOptions *TransportOptions
withRandomTlsExtensionOrder bool
disableIPV6 bool
disableIPV4 bool
}

func (rt *roundTripper) CloseIdleConnections() {
Expand Down Expand Up @@ -129,6 +130,10 @@ func (rt *roundTripper) dialTLS(ctx context.Context, network, addr string) (net.
network = "tcp4"
}

if network == "tcp" && rt.disableIPV4 {
network = "tcp6"
}

rawConn, err := rt.dialer.DialContext(ctx, network, addr)
if err != nil {
return nil, err
Expand Down Expand Up @@ -311,7 +316,7 @@ func (rt *roundTripper) getDialTLSAddr(req *http.Request) string {
return net.JoinHostPort(req.URL.Host, "443")
}

func newRoundTripper(clientProfile profiles.ClientProfile, transportOptions *TransportOptions, serverNameOverwrite string, insecureSkipVerify bool, withRandomTlsExtensionOrder bool, forceHttp1 bool, certificatePins map[string][]string, badPinHandlerFunc BadPinHandlerFunc, disableIPV6 bool, bandwidthTracker bandwidth.BandwidthTracker, dialer ...proxy.ContextDialer) (http.RoundTripper, error) {
func newRoundTripper(clientProfile profiles.ClientProfile, transportOptions *TransportOptions, serverNameOverwrite string, insecureSkipVerify bool, withRandomTlsExtensionOrder bool, forceHttp1 bool, certificatePins map[string][]string, badPinHandlerFunc BadPinHandlerFunc, disableIPV6 bool, disableIPV4 bool, bandwidthTracker bandwidth.BandwidthTracker, dialer ...proxy.ContextDialer) (http.RoundTripper, error) {
pinner, err := NewCertificatePinner(certificatePins)
if err != nil {
return nil, fmt.Errorf("can not instantiate certificate pinner: %w", err)
Expand Down Expand Up @@ -345,6 +350,7 @@ func newRoundTripper(clientProfile profiles.ClientProfile, transportOptions *Tra
cachedTransports: make(map[string]http.RoundTripper),
cachedConnections: make(map[string]net.Conn),
disableIPV6: disableIPV6,
disableIPV4: disableIPV4,
bandwidthTracker: bandwidthTracker,
}

Expand Down

0 comments on commit 57309a9

Please sign in to comment.