httpx 0.19.8 → 0.20.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,13 +5,10 @@ module HTTPX
5
5
  #
6
6
  # https://gitlab.com/honeyryderchuck/httpx/wikis/Authentication#ntlm-authentication
7
7
  #
8
- module NTLMAuthentication
9
- NTLMParams = Struct.new(:user, :domain, :password)
10
-
8
+ module NTLMAuth
11
9
  class << self
12
10
  def load_dependencies(_klass)
13
- require "base64"
14
- require "ntlm"
11
+ require_relative "authentication/ntlm"
15
12
  end
16
13
 
17
14
  def extra_options(options)
@@ -21,7 +18,7 @@ module HTTPX
21
18
 
22
19
  module OptionsMethods
23
20
  def option_ntlm(value)
24
- raise TypeError, ":ntlm must be a #{NTLMParams}" unless value.is_a?(NTLMParams)
21
+ raise TypeError, ":ntlm must be a #{Authentication::Ntlm}" unless value.is_a?(Authentication::Ntlm)
25
22
 
26
23
  value
27
24
  end
@@ -29,7 +26,7 @@ module HTTPX
29
26
 
30
27
  module InstanceMethods
31
28
  def ntlm_authentication(user, password, domain = nil)
32
- with(ntlm: NTLMParams.new(user, domain, password))
29
+ with(ntlm: Authentication::Ntlm.new(user, password, domain: domain))
33
30
  end
34
31
 
35
32
  alias_method :ntlm_auth, :ntlm_authentication
@@ -39,19 +36,12 @@ module HTTPX
39
36
  ntlm = request.options.ntlm
40
37
 
41
38
  if ntlm
42
- request.headers["authorization"] = "NTLM #{NTLM.negotiate(domain: ntlm.domain).to_base64}"
39
+ request.headers["authorization"] = ntlm.negotiate
43
40
  probe_response = wrap { super(request).first }
44
41
 
45
- if !probe_response.is_a?(ErrorResponse) && probe_response.status == 401 &&
46
- probe_response.headers.key?("www-authenticate") &&
47
- (challenge = probe_response.headers["www-authenticate"][/NTLM (.*)/, 1])
48
-
49
- challenge = Base64.decode64(challenge)
50
- ntlm_challenge = NTLM.authenticate(challenge, ntlm.user, ntlm.domain, ntlm.password).to_base64
51
-
42
+ if probe_response.status == 401 && ntlm.can_authenticate?(probe_response.headers["www-authenticate"])
52
43
  request.transition(:idle)
53
-
54
- request.headers["authorization"] = "NTLM #{ntlm_challenge}"
44
+ request.headers["authorization"] = ntlm.authenticate(request, probe_response.headers["www-authenticate"])
55
45
  super(request)
56
46
  else
57
47
  probe_response
@@ -63,6 +53,6 @@ module HTTPX
63
53
  end
64
54
  end
65
55
  end
66
- register_plugin :ntlm_authentication, NTLMAuthentication
56
+ register_plugin :ntlm_authentication, NTLMAuth
67
57
  end
68
58
  end
@@ -6,6 +6,42 @@ module HTTPX
6
6
  module Plugins
7
7
  module Proxy
8
8
  module HTTP
9
+ module InstanceMethods
10
+ def with_proxy_basic_auth(opts)
11
+ with(proxy: opts.merge(scheme: "basic"))
12
+ end
13
+
14
+ def with_proxy_digest_auth(opts)
15
+ with(proxy: opts.merge(scheme: "digest"))
16
+ end
17
+
18
+ def with_proxy_ntlm_auth(opts)
19
+ with(proxy: opts.merge(scheme: "ntlm"))
20
+ end
21
+
22
+ def fetch_response(request, connections, options)
23
+ response = super
24
+
25
+ if response &&
26
+ response.status == 407 &&
27
+ !request.headers.key?("proxy-authorization") &&
28
+ response.headers.key?("proxy-authenticate")
29
+
30
+ connection = find_connection(request, connections, options)
31
+
32
+ if connection.options.proxy.can_authenticate?(response.headers["proxy-authenticate"])
33
+ request.transition(:idle)
34
+ request.headers["proxy-authorization"] =
35
+ connection.options.proxy.authenticate(request, response.headers["proxy-authenticate"])
36
+ connection.send(request)
37
+ return
38
+ end
39
+ end
40
+
41
+ response
42
+ end
43
+ end
44
+
9
45
  module ConnectionMethods
10
46
  def connecting?
11
47
  super || @state == :connecting || @state == :connected
@@ -23,11 +59,27 @@ module HTTPX
23
59
  @io.connect
24
60
  return unless @io.connected?
25
61
 
26
- @parser = registry(@io.protocol).new(@write_buffer, @options.merge(max_concurrent_requests: 1))
27
- @parser.extend(ProxyParser)
28
- @parser.once(:response, &method(:__http_on_connect))
29
- @parser.on(:close) { transition(:closing) }
30
- __http_proxy_connect
62
+ @parser || begin
63
+ @parser = registry(@io.protocol).new(@write_buffer, @options.merge(max_concurrent_requests: 1))
64
+ parser = @parser
65
+ parser.extend(ProxyParser)
66
+ parser.on(:response, &method(:__http_on_connect))
67
+ parser.on(:close) { transition(:closing) }
68
+ parser.on(:reset) do
69
+ if parser.empty?
70
+ reset
71
+ else
72
+ transition(:closing)
73
+ transition(:closed)
74
+ emit(:reset)
75
+
76
+ parser.reset if @parser
77
+ transition(:idle)
78
+ transition(:connecting)
79
+ end
80
+ end
81
+ __http_proxy_connect(parser)
82
+ end
31
83
  return if @state == :connected
32
84
  when :connected
33
85
  return unless @state == :idle || @state == :connecting
@@ -44,13 +96,13 @@ module HTTPX
44
96
  super
45
97
  end
46
98
 
47
- def __http_proxy_connect
99
+ def __http_proxy_connect(parser)
48
100
  req = @pending.first
49
- # if the first request after CONNECT is to an https address, it is assumed that
50
- # all requests in the queue are not only ALL HTTPS, but they also share the certificate,
51
- # and therefore, will share the connection.
52
- #
53
- if req.uri.scheme == "https"
101
+ if req && req.uri.scheme == "https"
102
+ # if the first request after CONNECT is to an https address, it is assumed that
103
+ # all requests in the queue are not only ALL HTTPS, but they also share the certificate,
104
+ # and therefore, will share the connection.
105
+ #
54
106
  connect_request = ConnectRequest.new(req.uri, @options)
55
107
  @inflight += 1
56
108
  parser.send(connect_request)
@@ -59,7 +111,7 @@ module HTTPX
59
111
  end
60
112
  end
61
113
 
62
- def __http_on_connect(_, response)
114
+ def __http_on_connect(request, response)
63
115
  @inflight -= 1
64
116
  if response.status == 200
65
117
  req = @pending.first
@@ -67,6 +119,14 @@ module HTTPX
67
119
  @io = ProxySSL.new(@io, request_uri, @options)
68
120
  transition(:connected)
69
121
  throw(:called)
122
+ elsif response.status == 407 &&
123
+ !request.headers.key?("proxy-authorization") &&
124
+ @options.proxy.can_authenticate?(response.headers["proxy-authenticate"])
125
+
126
+ request.transition(:idle)
127
+ request.headers["proxy-authorization"] = @options.proxy.authenticate(request, response.headers["proxy-authenticate"])
128
+ @parser.send(request)
129
+ @inflight += 1
70
130
  else
71
131
  pending = @pending + @parser.pending
72
132
  while (req = pending.shift)
@@ -88,7 +148,10 @@ module HTTPX
88
148
  extra_headers = super
89
149
 
90
150
  proxy_params = @options.proxy
91
- extra_headers["proxy-authorization"] = "Basic #{proxy_params.token_authentication}" if proxy_params.authenticated?
151
+ if proxy_params.scheme == "basic"
152
+ # opt for basic auth
153
+ extra_headers["proxy-authorization"] = proxy_params.authenticate(extra_headers)
154
+ end
92
155
  extra_headers["proxy-connection"] = extra_headers.delete("connection") if extra_headers.key?("connection")
93
156
  extra_headers
94
157
  end
@@ -18,6 +18,10 @@ module HTTPX
18
18
 
19
19
  Error = Socks5Error
20
20
 
21
+ def self.load_dependencies(*)
22
+ require_relative "../authentication/socks5"
23
+ end
24
+
21
25
  module ConnectionMethods
22
26
  def call
23
27
  super
@@ -156,16 +160,14 @@ module HTTPX
156
160
 
157
161
  def negotiate(parameters)
158
162
  methods = [NOAUTH]
159
- methods << PASSWD if parameters.authenticated?
163
+ methods << PASSWD if parameters.can_authenticate?
160
164
  methods.unshift(methods.size)
161
165
  methods.unshift(VERSION)
162
166
  methods.pack("C*")
163
167
  end
164
168
 
165
169
  def authenticate(parameters)
166
- user = parameters.username
167
- password = parameters.password
168
- [0x01, user.bytesize, user, password.bytesize, password].pack("CCA*CA*")
170
+ parameters.authenticate
169
171
  end
170
172
 
171
173
  def connect(uri)
@@ -19,22 +19,43 @@ module HTTPX
19
19
  PROXY_ERRORS = [TimeoutError, IOError, SystemCallError, Error].freeze
20
20
 
21
21
  class Parameters
22
- attr_reader :uri, :username, :password
22
+ attr_reader :uri, :username, :password, :scheme
23
23
 
24
- def initialize(uri:, username: nil, password: nil)
24
+ def initialize(uri:, scheme: nil, username: nil, password: nil, **extra)
25
25
  @uri = uri.is_a?(URI::Generic) ? uri : URI(uri)
26
26
  @username = username || @uri.user
27
27
  @password = password || @uri.password
28
+
29
+ return unless @username && @password
30
+
31
+ scheme ||= case @uri.scheme
32
+ when "socks5"
33
+ @uri.scheme
34
+ when "http", "https"
35
+ "basic"
36
+ else
37
+ return
38
+ end
39
+
40
+ @scheme = scheme
41
+
42
+ auth_scheme = scheme.to_s.capitalize
43
+
44
+ require_relative "authentication/#{scheme}" unless defined?(Authentication) && Authentication.const_defined?(auth_scheme, false)
45
+
46
+ @authenticator = Authentication.const_get(auth_scheme).new(@username, @password, **extra)
28
47
  end
29
48
 
30
- def authenticated?
31
- @username && @password
49
+ def can_authenticate?(*args)
50
+ return false unless @authenticator
51
+
52
+ @authenticator.can_authenticate?(*args)
32
53
  end
33
54
 
34
- def token_authentication
35
- return unless authenticated?
55
+ def authenticate(*args)
56
+ return unless @authenticator
36
57
 
37
- Base64.strict_encode64("#{@username}:#{@password}")
58
+ @authenticator.authenticate(*args)
38
59
  end
39
60
 
40
61
  def ==(other)
@@ -42,7 +63,8 @@ module HTTPX
42
63
  when Parameters
43
64
  @uri == other.uri &&
44
65
  @username == other.username &&
45
- @password == other.password
66
+ @password == other.password &&
67
+ @scheme == other.scheme
46
68
  when URI::Generic, String
47
69
  proxy_uri = @uri.dup
48
70
  proxy_uri.user = @username
@@ -37,6 +37,7 @@ module HTTPX::Plugins
37
37
  return unless request.headers.same_headers?(original_request.headers)
38
38
  else
39
39
  return unless vary.split(/ *, */).all? do |cache_field|
40
+ cache_field.downcase!
40
41
  !original_request.headers.key?(cache_field) || request.headers[cache_field] == original_request.headers[cache_field]
41
42
  end
42
43
  end
data/lib/httpx/request.rb CHANGED
@@ -49,7 +49,9 @@ module HTTPX
49
49
  origin = @options.origin
50
50
  raise(Error, "invalid URI: #{@uri}") unless origin
51
51
 
52
- @uri = origin.merge(@uri)
52
+ base_path = @options.base_path
53
+
54
+ @uri = origin.merge("#{base_path}#{@uri}")
53
55
  end
54
56
 
55
57
  raise(Error, "unknown method: #{verb}") unless METHODS.include?(@verb)
data/lib/httpx/session.rb CHANGED
@@ -106,16 +106,21 @@ module HTTPX
106
106
  end
107
107
 
108
108
  def build_altsvc_connection(existing_connection, connections, alt_origin, origin, alt_params, options)
109
+ # do not allow security downgrades on altsvc negotiation
110
+ return if existing_connection.origin.scheme == "https" && alt_origin.scheme != "https"
111
+
109
112
  altsvc = AltSvc.cached_altsvc_set(origin, alt_params.merge("origin" => alt_origin))
110
113
 
111
114
  # altsvc already exists, somehow it wasn't advertised, probably noop
112
115
  return unless altsvc
113
116
 
114
- connection = pool.find_connection(alt_origin, options) || build_connection(alt_origin, options)
117
+ alt_options = options.merge(ssl: options.ssl.merge(hostname: URI(origin).host))
118
+
119
+ connection = pool.find_connection(alt_origin, alt_options) || build_connection(alt_origin, alt_options)
115
120
  # advertised altsvc is the same origin being used, ignore
116
121
  return if connection == existing_connection
117
122
 
118
- set_connection_callbacks(connection, connections, options)
123
+ set_connection_callbacks(connection, connections, alt_options)
119
124
 
120
125
  log(level: 1) { "#{origin} alt-svc: #{alt_origin}" }
121
126
 
data/lib/httpx/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module HTTPX
4
- VERSION = "0.19.8"
4
+ VERSION = "0.20.0"
5
5
  end
data/sig/chainable.rbs CHANGED
@@ -13,9 +13,9 @@ module HTTPX
13
13
  | (options) { (Session) -> void } -> void
14
14
 
15
15
  def plugin: (:authentication, ?options) -> Plugins::sessionAuthentication
16
- | (:basic_authentication, ?options) -> Plugins::sessionBasicAuthentication
17
- | (:digest_authentication, ?options) -> Plugins::sessionDigestAuthentication
18
- | (:ntlm_authentication, ?options) -> Plugins::sessionNTLMAuthentication
16
+ | (:basic_authentication, ?options) -> Plugins::sessionBasicAuth
17
+ | (:digest_authentication, ?options) -> Plugins::sessionDigestAuth
18
+ | (:ntlm_authentication, ?options) -> Plugins::sessionNTLMAuth
19
19
  | (:aws_sdk_authentication, ?options) -> Plugins::sessionAwsSdkAuthentication
20
20
  | (:compression, ?options) -> Session
21
21
  | (:cookies, ?options) -> Plugins::sessionCookies
@@ -25,7 +25,7 @@ module HTTPX
25
25
  | (:h2c, ?options) -> Session
26
26
  | (:multipart, ?options) -> Session
27
27
  | (:persistent, ?options) -> Plugins::sessionPersistent
28
- | (:proxy, ?options) -> Plugins::sessionProxy
28
+ | (:proxy, ?options) -> (Plugins::sessionProxy & Plugins::httpProxy)
29
29
  | (:push_promise, ?options) -> Plugins::sessionPushPromise
30
30
  | (:retries, ?options) -> Plugins::sessionRetries
31
31
  | (:rate_limiter, ?options) -> Session
@@ -0,0 +1,19 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Authentication
4
+ class Basic
5
+ @user: String
6
+ @password: String
7
+
8
+ def can_authenticate?: (String? authenticate) -> boolish
9
+
10
+ def authenticate: (*untyped) -> String
11
+
12
+ private
13
+
14
+ def initialize: (string user, string password, *untyped) -> void
15
+
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Authentication
4
+ class Digest
5
+ @user: String
6
+ @password: String
7
+
8
+ def can_authenticate?: (String? authenticate) -> boolish
9
+
10
+ def authenticate: (Request request, String authenticate) -> String
11
+
12
+ private
13
+
14
+ def generate_header: (String meth, String uri, String authenticate) -> String
15
+
16
+ def initialize: (string user, string password) -> void
17
+
18
+ def make_cnonce: () -> String
19
+
20
+ def next_nonce: () -> Integer
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,20 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Authentication
4
+ class Ntlm
5
+ @user: String
6
+ @password: String
7
+ @domain: String?
8
+
9
+ def can_authenticate?: (String? authenticate) -> boolish
10
+
11
+ def authenticate: (Request request, String authenticate) -> String
12
+
13
+ private
14
+
15
+ def initialize: (string user, string password, ?domain: String?) -> void
16
+
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,18 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Authentication
4
+ class Socks5
5
+ @user: String
6
+ @password: String
7
+
8
+ def can_authenticate?: (*untyped) -> boolish
9
+
10
+ def authenticate: (*untyped) -> String
11
+
12
+ private
13
+
14
+ def initialize: (string user, string password) -> void
15
+ end
16
+ end
17
+ end
18
+ end
@@ -1,6 +1,6 @@
1
1
  module HTTPX
2
2
  module Plugins
3
- module BasicAuthentication
3
+ module BasicAuth
4
4
  def self.load_dependencies: (singleton(Session)) -> void
5
5
 
6
6
  def self.configure: (singleton(Session)) -> void
@@ -10,6 +10,6 @@ module HTTPX
10
10
  end
11
11
  end
12
12
 
13
- type sessionBasicAuthentication = sessionAuthentication & Authentication::InstanceMethods & BasicAuthentication::InstanceMethods
13
+ type sessionBasicAuth = sessionAuthentication & Authentication::InstanceMethods & BasicAuth::InstanceMethods
14
14
  end
15
15
  end
@@ -1,10 +1,10 @@
1
1
  module HTTPX
2
2
  module Plugins
3
- module DigestAuthentication
3
+ module DigestAuth
4
4
  DigestError: singleton(Error)
5
5
 
6
6
  interface _DigestOptions
7
- def digest: () -> Digest?
7
+ def digest: () -> Authentication::Digest?
8
8
  end
9
9
 
10
10
  def self.extra_options: (Options) -> (Options & _DigestOptions)
@@ -14,18 +14,8 @@ module HTTPX
14
14
  module InstanceMethods
15
15
  def digest_authentication: (string user, string password) -> instance
16
16
  end
17
-
18
- class Digest
19
- def generate_header: (Request, Response, ?bool?) -> String
20
-
21
- private
22
-
23
- def initialize: (string user, string password) -> untyped
24
- def make_cnonce: () -> String
25
- def next_nonce: () -> Integer
26
- end
27
17
  end
28
18
 
29
- type sessionDigestAuthentication = sessionAuthentication & DigestAuthentication::InstanceMethods
19
+ type sessionDigestAuth = sessionAuthentication & DigestAuth::InstanceMethods
30
20
  end
31
21
  end
@@ -1,9 +1,9 @@
1
1
  module HTTPX
2
2
  module Plugins
3
- module NTLMAuthentication
3
+ module NTLMAuth
4
4
 
5
5
  interface _NTLMOptions
6
- def ntlm: () -> NTLMParams?
6
+ def ntlm: () -> Authentication::Ntlm?
7
7
  end
8
8
 
9
9
  def self.extra_options: (Options) -> (Options & _NTLMOptions)
@@ -14,13 +14,8 @@ module HTTPX
14
14
  def ntlm_authentication: (string user, string password, ?string? domain) -> instance
15
15
  end
16
16
 
17
- class NTLMParams
18
- attr_reader user: String
19
- attr_reader password: String
20
- attr_reader domain: String?
21
- end
22
17
  end
23
18
 
24
- type sessionNTLMAuthentication = sessionAuthentication & NTLMAuthentication::InstanceMethods
19
+ type sessionNTLMAuth = sessionAuthentication & NTLMAuth::InstanceMethods
25
20
  end
26
21
  end
@@ -2,13 +2,23 @@ module HTTPX
2
2
  module Plugins
3
3
  module Proxy
4
4
  module HTTP
5
-
5
+
6
+ module InstanceMethods
7
+ def with_proxy_basic_auth: (Hash[Symbol, untyped] opts) -> instance
8
+
9
+ def with_proxy_digest_auth: (Hash[Symbol, untyped] opts) -> instance
10
+
11
+ def with_proxy_ntlm_auth: (Hash[Symbol, untyped] opts) -> instance
12
+ end
13
+
6
14
  module ConnectionMethods
7
- def __http_proxy_connect: () -> void
15
+ def __http_proxy_connect: (Connection::_Parser parser) -> void
8
16
  def __http_on_connect: (top, Response) -> void
9
17
  end
10
-
18
+
11
19
  end
12
20
  end
21
+
22
+ type httpProxy = Session & Proxy::HTTP::InstanceMethods
13
23
  end
14
24
  end
@@ -11,15 +11,17 @@ module HTTPX
11
11
  attr_reader uri: URI::Generic
12
12
  attr_reader username: String?
13
13
  attr_reader password: String?
14
+ attr_reader scheme: String?
14
15
 
15
- def authenticated?: () -> boolish
16
- def token_authentication: () -> String?
16
+ def can_authenticate?: (*untyped) -> boolish
17
+
18
+ def authenticate: (*untyped) -> String?
17
19
 
18
20
  def ==: (untyped) -> bool
19
21
 
20
22
  private
21
23
 
22
- def initialize: (uri: generic_uri, ?username: String, ?password: String) -> untyped
24
+ def initialize: (uri: generic_uri, ?scheme: String, ?username: String, ?password: String, **extra) -> untyped
23
25
  end
24
26
 
25
27
  def self.configure: (singleton(Session)) -> void
data/sig/session.rbs CHANGED
@@ -33,7 +33,7 @@ module HTTPX
33
33
 
34
34
  def set_connection_callbacks: (Connection, Array[Connection], Options) -> void
35
35
 
36
- def build_altsvc_connection: (Connection, Array[Connection], URI::Generic, String, Hash[String, String], Options) -> Connection?
36
+ def build_altsvc_connection: (Connection existing_connection, Array[Connection] connections, URI::Generic alt_origin, String origin, Hash[String, String] alt_params, Options options) -> Connection?
37
37
 
38
38
  def build_requests: (verb | string, uri, options) -> Array[Request]
39
39
  | (Array[[verb | string, uri, options]], options) -> Array[Request]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: httpx
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.19.8
4
+ version: 0.20.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-06 00:00:00.000000000 Z
11
+ date: 2022-05-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-2-next
@@ -80,6 +80,7 @@ extra_rdoc_files:
80
80
  - doc/release_notes/0_19_7.md
81
81
  - doc/release_notes/0_19_8.md
82
82
  - doc/release_notes/0_1_0.md
83
+ - doc/release_notes/0_20_0.md
83
84
  - doc/release_notes/0_2_0.md
84
85
  - doc/release_notes/0_2_1.md
85
86
  - doc/release_notes/0_3_0.md
@@ -152,6 +153,7 @@ files:
152
153
  - doc/release_notes/0_19_7.md
153
154
  - doc/release_notes/0_19_8.md
154
155
  - doc/release_notes/0_1_0.md
156
+ - doc/release_notes/0_20_0.md
155
157
  - doc/release_notes/0_2_0.md
156
158
  - doc/release_notes/0_2_1.md
157
159
  - doc/release_notes/0_3_0.md
@@ -176,6 +178,7 @@ files:
176
178
  - lib/httpx.rb
177
179
  - lib/httpx/adapters/datadog.rb
178
180
  - lib/httpx/adapters/faraday.rb
181
+ - lib/httpx/adapters/sentry.rb
179
182
  - lib/httpx/adapters/webmock.rb
180
183
  - lib/httpx/altsvc.rb
181
184
  - lib/httpx/buffer.rb
@@ -197,6 +200,10 @@ files:
197
200
  - lib/httpx/options.rb
198
201
  - lib/httpx/parser/http1.rb
199
202
  - lib/httpx/plugins/authentication.rb
203
+ - lib/httpx/plugins/authentication/basic.rb
204
+ - lib/httpx/plugins/authentication/digest.rb
205
+ - lib/httpx/plugins/authentication/ntlm.rb
206
+ - lib/httpx/plugins/authentication/socks5.rb
200
207
  - lib/httpx/plugins/aws_sdk_authentication.rb
201
208
  - lib/httpx/plugins/aws_sigv4.rb
202
209
  - lib/httpx/plugins/basic_authentication.rb
@@ -274,6 +281,10 @@ files:
274
281
  - sig/options.rbs
275
282
  - sig/parser/http1.rbs
276
283
  - sig/plugins/authentication.rbs
284
+ - sig/plugins/authentication/basic.rbs
285
+ - sig/plugins/authentication/digest.rbs
286
+ - sig/plugins/authentication/ntlm.rbs
287
+ - sig/plugins/authentication/socks5.rbs
277
288
  - sig/plugins/aws_sdk_authentication.rbs
278
289
  - sig/plugins/aws_sigv4.rbs
279
290
  - sig/plugins/basic_authentication.rbs