httpx 0.18.0 → 0.19.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -4
  3. data/doc/release_notes/0_18_1.md +12 -0
  4. data/doc/release_notes/0_18_2.md +10 -0
  5. data/doc/release_notes/0_18_3.md +7 -0
  6. data/doc/release_notes/0_18_4.md +14 -0
  7. data/doc/release_notes/0_18_5.md +10 -0
  8. data/doc/release_notes/0_18_6.md +5 -0
  9. data/doc/release_notes/0_18_7.md +5 -0
  10. data/doc/release_notes/0_19_0.md +39 -0
  11. data/doc/release_notes/0_19_1.md +5 -0
  12. data/doc/release_notes/0_19_2.md +7 -0
  13. data/doc/release_notes/0_19_3.md +6 -0
  14. data/lib/httpx/adapters/faraday.rb +58 -12
  15. data/lib/httpx/adapters/webmock.rb +71 -59
  16. data/lib/httpx/altsvc.rb +25 -9
  17. data/lib/httpx/connection/http1.rb +10 -7
  18. data/lib/httpx/connection/http2.rb +23 -8
  19. data/lib/httpx/connection.rb +26 -12
  20. data/lib/httpx/extensions.rb +16 -0
  21. data/lib/httpx/headers.rb +0 -2
  22. data/lib/httpx/io/ssl.rb +4 -0
  23. data/lib/httpx/io/tcp.rb +27 -6
  24. data/lib/httpx/io/udp.rb +0 -1
  25. data/lib/httpx/options.rb +44 -11
  26. data/lib/httpx/plugins/cookies.rb +5 -7
  27. data/lib/httpx/plugins/internal_telemetry.rb +1 -1
  28. data/lib/httpx/plugins/multipart/mime_type_detector.rb +18 -4
  29. data/lib/httpx/plugins/proxy/http.rb +10 -23
  30. data/lib/httpx/plugins/proxy/socks4.rb +1 -1
  31. data/lib/httpx/plugins/proxy/socks5.rb +1 -1
  32. data/lib/httpx/plugins/proxy.rb +35 -15
  33. data/lib/httpx/plugins/retries.rb +15 -12
  34. data/lib/httpx/pool.rb +40 -20
  35. data/lib/httpx/request.rb +1 -1
  36. data/lib/httpx/resolver/https.rb +32 -42
  37. data/lib/httpx/resolver/multi.rb +79 -0
  38. data/lib/httpx/resolver/native.rb +28 -36
  39. data/lib/httpx/resolver/resolver.rb +95 -0
  40. data/lib/httpx/resolver/system.rb +175 -19
  41. data/lib/httpx/resolver.rb +37 -11
  42. data/lib/httpx/response.rb +4 -2
  43. data/lib/httpx/selector.rb +7 -0
  44. data/lib/httpx/session.rb +2 -16
  45. data/lib/httpx/session_extensions.rb +26 -0
  46. data/lib/httpx/timers.rb +1 -1
  47. data/lib/httpx/transcoder/chunker.rb +0 -1
  48. data/lib/httpx/version.rb +1 -1
  49. data/lib/httpx.rb +3 -0
  50. data/sig/connection/http1.rbs +5 -2
  51. data/sig/connection/http2.rbs +5 -2
  52. data/sig/connection.rbs +1 -0
  53. data/sig/errors.rbs +8 -0
  54. data/sig/headers.rbs +0 -2
  55. data/sig/httpx.rbs +4 -0
  56. data/sig/options.rbs +10 -7
  57. data/sig/parser/http1.rbs +14 -5
  58. data/sig/pool.rbs +17 -9
  59. data/sig/registry.rbs +3 -0
  60. data/sig/request.rbs +11 -0
  61. data/sig/resolver/https.rbs +15 -27
  62. data/sig/resolver/multi.rbs +7 -0
  63. data/sig/resolver/native.rbs +3 -12
  64. data/sig/resolver/resolver.rbs +36 -0
  65. data/sig/resolver/system.rbs +3 -9
  66. data/sig/resolver.rbs +12 -10
  67. data/sig/response.rbs +15 -5
  68. data/sig/selector.rbs +3 -3
  69. data/sig/timers.rbs +5 -2
  70. data/sig/transcoder/chunker.rbs +16 -5
  71. data/sig/transcoder/json.rbs +5 -0
  72. data/sig/transcoder.rbs +3 -1
  73. metadata +31 -5
  74. data/lib/httpx/resolver/resolver_mixin.rb +0 -75
  75. data/sig/resolver/resolver_mixin.rbs +0 -26
data/sig/pool.rbs CHANGED
@@ -1,14 +1,22 @@
1
1
  module HTTPX
2
2
  class Pool
3
+ type resolver_manager = Resolver::Multi | Resolver::System
4
+
5
+ @resolvers: Hash[Class, resolver_manager]
6
+ @timers: Timers
7
+ @selector: Selector
8
+ @connections: Array[Connection]
9
+ @connected_connections: Integer
10
+
3
11
  def empty?: () -> void
4
12
 
5
13
  def next_tick: () -> void
6
14
 
7
- def close: (*Array[Connection]) -> void
15
+ def close: (?Array[Connection] connections) -> void
8
16
 
9
- def init_connection: (Connection, Options) -> void
17
+ def init_connection: (Connection connection, Options options) -> void
10
18
 
11
- def find_connection: (generic_uri, Options) -> Connection?
19
+ def find_connection: (URI::Generic uri, Options options) -> Connection?
12
20
 
13
21
  def deactivate: (*Array[Connection]) -> void
14
22
 
@@ -22,20 +30,20 @@ module HTTPX
22
30
 
23
31
  def on_resolver_error: (Connection, StandardError) -> void
24
32
 
25
- def on_resolver_close: (resolver) -> void
33
+ def on_resolver_close: (Resolver::Resolver) -> void
26
34
 
27
35
  def register_connection: (Connection) -> void
28
36
 
29
37
  def unregister_connection: (Connection) -> void
30
38
 
31
- def select_connection: (resolver | Connection connection) -> void
39
+ def select_connection: (Resolver::Resolver | Connection connection) -> void
32
40
 
33
- def deselect_connection: (resolver | Connection connection) -> void
41
+ def deselect_connection: (Resolver::Resolver | Connection connection) -> void
34
42
 
35
- def coalesce_connections: (Connection, Connection) -> void
43
+ def coalesce_connections: (Connection coalescable, Connection coalescing) -> void
36
44
 
37
- def next_timeout: () -> Numeric?
45
+ def next_timeout: () -> (Integer | Float | nil)
38
46
 
39
- def find_resolver_for: (Connection) -> resolver
47
+ def find_resolver_for: (Connection) { (Resolver::Resolver resolver) -> void } -> resolver_manager
40
48
  end
41
49
  end
data/sig/registry.rbs CHANGED
@@ -1,4 +1,7 @@
1
1
  module HTTPX::Registry[T, V]
2
+ class Error < HTTPX::Error
3
+ end
4
+
2
5
  # type registrable = Symbol | String | Class
3
6
 
4
7
  def self.registry: (T tag) -> Class
data/sig/request.rbs CHANGED
@@ -15,6 +15,11 @@ module HTTPX
15
15
  attr_reader response: response?
16
16
  attr_reader drain_error: StandardError?
17
17
 
18
+ @trailers: Headers?
19
+ @informational_status: Integer?
20
+ @query: String?
21
+ @drainer: Enumerator[String, void]?
22
+
18
23
  def initialize: (Symbol | String, generic_uri, ?options) -> untyped
19
24
 
20
25
  def interests: () -> (:r | :w)
@@ -46,6 +51,10 @@ module HTTPX
46
51
  def trailers?: () -> boolish
47
52
 
48
53
  class Body
54
+ @headers: Headers
55
+ @body: body_encoder?
56
+ @unbounded_body: bool
57
+
49
58
  def initialize: (Headers, Options) -> untyped
50
59
  def each: () { (String) -> void } -> void
51
60
  | () -> Enumerable[String]
@@ -61,6 +70,8 @@ module HTTPX
61
70
  end
62
71
 
63
72
  class ProcIO
73
+ @block: ^(String) -> void
74
+
64
75
  def initialize: (^(String) -> void) -> untyped
65
76
 
66
77
  def write: (String data) -> Integer
@@ -1,49 +1,37 @@
1
1
  module HTTPX
2
2
  module Resolver
3
- class HTTPS
4
- include ResolverMixin
5
- include _ToIO
3
+ class HTTPS < Resolver
4
+ NAMESERVER: String
6
5
 
6
+ DEFAULTS: Hash[Symbol, untyped]
7
+ FAMILY_TYPES: Hash[singleton(Resolv::DNS::Resource), String]
8
+
9
+ @family: ip_family
7
10
  @options: Options
8
- @resolver_options: Hash[Symbol, untyped]
9
- @_record_types: Hash[String, Hash["A" | "AAAA", dns_resource]]
10
- @queries: Hash[String, Connection]
11
11
  @requests: Hash[Request, Connection]
12
12
  @connections: Array[Connection]
13
- @uri: URI::HTTPS
13
+ @uri: URI::Generic
14
14
  @uri_addresses: Array[String]?
15
+ @resolver: Resolv::DNS
16
+ @resolver_connection: Connection
15
17
 
16
- def <<: (Connection) -> void
17
-
18
- def timeout: () -> Numeric?
19
-
20
- def closed?: () -> bool
21
-
22
- def empty?: () -> bool
18
+ attr_writer pool: Pool
23
19
 
24
- def close: () -> void
25
-
26
- def call: () -> void
27
-
28
- def interests: () -> io_interests?
20
+ def <<: (Connection) -> void
29
21
 
30
22
  private
31
23
 
32
- def initialize: (options) -> untyped
33
-
34
- def pool: () -> Pool
24
+ def initialize: (ip_family family, options options) -> void
35
25
 
36
26
  def resolver_connection: () -> Connection
37
27
 
38
- def resolve: (Connection, String hostname) -> void
39
- | (Connection) -> void
40
- | () -> void
28
+ def resolve: (?Connection connection, ?String? hostname) -> void
41
29
 
42
30
  def on_response: (Request, response) -> void
43
31
 
44
- def response: (Response) -> void
32
+ def parse: (Response response) -> void
45
33
 
46
- def build_request: (String hostname, "A" | "AAAA") -> Request
34
+ def build_request: (String hostname) -> Request
47
35
 
48
36
  def decode_response_body: (Response) -> Array[dns_result]
49
37
  end
@@ -0,0 +1,7 @@
1
+ module HTTPX
2
+ module Resolver
3
+ class Multi
4
+ def early_resolve: (Connection connection, ?hostname: String) -> void
5
+ end
6
+ end
7
+ end
@@ -1,33 +1,24 @@
1
1
  module HTTPX
2
2
  module Resolver
3
- class Native
3
+ class Native < Resolver
4
4
  extend Forwardable
5
- include ResolverMixin
6
5
  include _ToIO
7
6
 
8
7
  DEFAULTS: Hash[Symbol, untyped]
9
8
  DNS_PORT: Integer
10
9
 
10
+ @family: ip_family
11
11
  @options: Options
12
12
  @ns_index: Integer
13
- @resolver_options: Hash[Symbol, untyped]
14
13
  @nameserver: String
15
14
  @_timeouts: Array[Numeric]
16
15
  @timeouts: Hash[String, Array[Numeric]]
17
- @_record_types: Hash[String, Hash["A" | "AAAA", dns_resource]]
18
16
  @connections: Array[Connection]
19
- @queries: Hash[String, Connection]
20
17
  @read_buffer: String
21
18
  @write_buffer: Buffer
22
19
 
23
20
  attr_reader state: Symbol
24
21
 
25
- def closed?: () -> bool
26
-
27
- def empty?: () -> bool
28
-
29
- def close: () -> void
30
-
31
22
  def call: () -> void
32
23
 
33
24
  def interests: () -> io_interests
@@ -38,7 +29,7 @@ module HTTPX
38
29
 
39
30
  private
40
31
 
41
- def initialize: (options) -> untyped
32
+ def initialize: (ip_family family, options options) -> void
42
33
 
43
34
  def calculate_interests: () -> (:r | :w)
44
35
 
@@ -0,0 +1,36 @@
1
+ module HTTPX
2
+ module Resolver
3
+ class Resolver
4
+ include Callbacks
5
+ include Loggable
6
+
7
+ RECORD_TYPES: Hash[Integer, singleton(Resolv::DNS::Resource)]
8
+
9
+ attr_reader family: ip_family
10
+
11
+ @record_type: singleton(Resolv::DNS::Resource)
12
+ @options: Options
13
+ @resolver_options: Hash[Symbol, untyped]
14
+ @queries: Hash[String, Connection]
15
+ @system_resolver: Resolv::Hosts
16
+
17
+ def close: () -> void
18
+
19
+ def closed?: () -> bool
20
+
21
+ def empty?: () -> bool
22
+
23
+ def emit_addresses: (Connection connection, ip_family family, Array[IPAddr]) -> void
24
+
25
+ private
26
+
27
+ def initialize: (ip_family? family, options options) -> void
28
+
29
+ def early_resolve: (Connection connection, ?hostname: String) -> void
30
+
31
+ def emit_resolve_error: (Connection connection, ?String hostname, ?StandardError) -> void
32
+
33
+ def resolve_error: (String hostname, ?StandardError?) -> ResolveError
34
+ end
35
+ end
36
+ end
@@ -1,21 +1,15 @@
1
1
  module HTTPX
2
2
  module Resolver
3
- class System
4
- include ResolverMixin
5
-
3
+ class System < Resolver
6
4
  RESOLV_ERRORS: Array[singleton(StandardError)] # ResolvError
7
5
 
8
- attr_reader state: Symbol
9
-
10
- def closed?: () -> true
11
-
12
- def empty?: () -> true
6
+ @resolver: Resolv::DNS
13
7
 
14
8
  def <<: (Connection) -> void
15
9
 
16
10
  private
17
11
 
18
- def initialize: (options) -> untyped
12
+ def initialize: (options options) -> void
19
13
  end
20
14
  end
21
15
  end
data/sig/resolver.rbs CHANGED
@@ -1,28 +1,30 @@
1
1
  module HTTPX
2
2
  type ipaddr = IPAddr | String
3
3
 
4
- type resolver = Resolver::System | Resolver::Native | Resolver::HTTPS
5
-
6
4
  module Resolver
7
- RESOLVE_TIMEOUT: Integer | Float
5
+ extend Registry[Symbol, Class]
8
6
 
9
- def self.registry: (Symbol tag) -> Class
10
- | () -> Hash[Symbol, Class]
7
+ RESOLVE_TIMEOUT: Integer | Float
11
8
 
12
- def self.register: (Symbol tag, Class handler) -> void
9
+ @lookup_mutex: Thread::Mutex
13
10
 
14
11
  type dns_resource = singleton(Resolv::DNS::Resource)
15
12
 
16
13
  type dns_result = { "name" => String, "TTL" => Numeric, "alias" => String }
17
14
  | { "name" => String, "TTL" => Numeric, "data" => String }
18
15
 
19
- def self?.cached_lookup: (String hostname) -> Array[String]?
20
16
 
21
- def self?.cached_lookup_set: (String hostname, Array[dns_result] addresses) -> void
17
+ def nolookup_resolve: (String hostname) -> Array[IPAddr]
18
+
19
+ def ip_resolve: (String hostname) -> Array[IPAddr]?
20
+
21
+ def system_resolve: (String hostname) -> Array[IPAddr]?
22
+
23
+ def self?.cached_lookup: (String hostname) -> Array[IPAddr]?
22
24
 
23
- def self?.uncache: (String hostname) -> void
25
+ def self?.cached_lookup_set: (String hostname, ip_family family, Array[dns_result] addresses) -> void
24
26
 
25
- def self?.lookup: (String hostname, Numeric ttl) -> Array[String]?
27
+ def self?.lookup: (String hostname, Numeric ttl) -> Array[IPAddr]?
26
28
 
27
29
  def self?.generate_id: () -> Integer
28
30
 
data/sig/response.rbs CHANGED
@@ -19,6 +19,7 @@ module HTTPX
19
19
 
20
20
  @options: Options
21
21
  @request: Request
22
+ @content_type: ContentType
22
23
 
23
24
  def copy_to: (_ToPath | _Writer destination) -> void
24
25
  def close: () -> void
@@ -45,9 +46,15 @@ module HTTPX
45
46
  include _ToS
46
47
  include _ToStr
47
48
 
49
+ @response: Response
50
+ @headers: Headers
51
+ @options: Options
48
52
  @state: :idle | :memory | :buffer | :closed
49
53
  @threshold_size: Integer
50
54
  @window_size: Integer
55
+ @encoding: String
56
+ @length: Integer
57
+ @buffer: StringIO | Tempfile | nil
51
58
 
52
59
  def write:(String chunk) -> Integer?
53
60
 
@@ -65,6 +72,7 @@ module HTTPX
65
72
  def initialize: (Response, Options) -> untyped
66
73
  def rewind: () -> void
67
74
  def transition: () -> void
75
+ def _with_same_buffer_pos: [A] () { () -> A } -> A
68
76
  end
69
77
  end
70
78
 
@@ -72,12 +80,13 @@ module HTTPX
72
80
  MIME_TYPE_RE: Regexp
73
81
  CHARSET_RE: Regexp
74
82
 
75
- attr_reader mime_type: String?
76
- attr_reader charset: String?
83
+ @header_value: String?
84
+ @mime_type: String?
85
+ @charset: String?
77
86
 
78
- def self.parse: (_ToS) -> ContentType
79
- def self.mime_type: (_ToS) -> String?
80
- def self.charset: (_ToS) -> String?
87
+ def mime_type: () -> String?
88
+
89
+ def charset: () -> String?
81
90
 
82
91
  private
83
92
 
@@ -89,6 +98,7 @@ module HTTPX
89
98
  include Loggable
90
99
 
91
100
  @options: Options
101
+ @error: Exception
92
102
 
93
103
  attr_reader request: Request
94
104
 
data/sig/selector.rbs CHANGED
@@ -1,13 +1,13 @@
1
1
  module HTTPX
2
2
  class Selector
3
- type selectable = Connection | Resolver::Native | Resolver::HTTPS
3
+ type selectable = Connection | Resolver::Native | Resolver::System
4
4
 
5
5
  READABLE: Array[Symbol]
6
6
  WRITABLE: Array[Symbol]
7
7
  @selectables: Array[selectable]
8
8
 
9
- def register: (selectable) -> void
10
- def deregister: (selectable) -> void
9
+ def register: (selectable io) -> void
10
+ def deregister: (selectable io) -> void
11
11
 
12
12
  def select: (Numeric? interval) { (selectable) -> void } -> void
13
13
 
data/sig/timers.rbs CHANGED
@@ -1,12 +1,13 @@
1
1
  module HTTPX
2
2
  class Timers
3
- @interval: Array[Interval]
3
+ @intervals: Array[Interval]
4
+ @next_interval_at: Numeric
4
5
 
5
6
  def after: (Numeric interval_in_secs) { () -> void } -> void
6
7
 
7
8
  def wait_interval: () -> Numeric?
8
9
 
9
- def fire: (?StandardError error) -> void
10
+ def fire: (?TimeoutError error) -> void
10
11
 
11
12
  def cancel: () -> void
12
13
 
@@ -19,6 +20,8 @@ module HTTPX
19
20
 
20
21
  attr_reader interval: Numeric
21
22
 
23
+ @callbacks: Array[^() -> void]
24
+
22
25
  def to_f: () -> Float
23
26
 
24
27
  def <<: (^() -> void) -> void
@@ -10,27 +10,38 @@ module HTTPX::Transcoder
10
10
  class Encoder
11
11
  @raw: _Each[String]
12
12
 
13
- include _Each[String]
13
+ def each: () { (String) -> void } -> void
14
+ | () -> Enumerator[String, void]
14
15
 
15
16
  private
16
17
 
17
- def initialize: (_Each[String] chunks) -> untyped
18
+ def initialize: (_Each[String] chunks) -> void
18
19
  end
19
20
 
20
21
  class Decoder
21
22
  extend Forwardable
22
23
  include _ToS
23
- include _Each[String]
24
+
25
+ @buffer: String
26
+ @chunk_length: Integer
27
+ @chunk_buffer: String
28
+ @finished: bool
29
+ @state: Symbol
30
+ @trailers: bool
31
+
32
+ def each: () { (String) -> void } -> void
24
33
 
25
34
  def finished?: () -> bool
35
+
26
36
  def empty?: () -> bool
37
+
27
38
  def <<: (string) -> void
39
+
28
40
  def clear: () -> void
29
41
 
30
42
  private
31
43
 
32
- def initialize: (String, bool) -> untyped
33
- | (String) -> untyped
44
+ def initialize: (String, ?bool) -> void
34
45
 
35
46
  def nextstate: (Symbol) -> void
36
47
  end
@@ -1,5 +1,7 @@
1
1
  module HTTPX::Transcoder
2
2
  module JSON
3
+ JSON_REGEX: Regexp
4
+
3
5
  def self?.encode: (_ToJson json) -> Encoder
4
6
  def self?.decode: (HTTPX::Response response) -> _Decoder
5
7
 
@@ -8,6 +10,9 @@ module HTTPX::Transcoder
8
10
  include _Encoder
9
11
  include _ToS
10
12
 
13
+ @raw: String
14
+ @charset: String
15
+
11
16
  def content_type: () -> String
12
17
 
13
18
  private
data/sig/transcoder.rbs CHANGED
@@ -1,6 +1,8 @@
1
1
  module HTTPX
2
2
  type bodyIO = _Reader | _Each[[String, untyped]] | _ToS
3
3
 
4
+ type body_encoder = Transcoder::_Encoder | _Each[String]
5
+
4
6
  module Transcoder
5
7
  def self?.registry: (String tag) -> _Encode
6
8
  | () -> Hash[String, _Encode]
@@ -12,7 +14,7 @@ module HTTPX
12
14
  def self?.normalize_query: (Hash[String, untyped] params, String name, String v, Integer depth) -> void
13
15
 
14
16
  interface _Encode
15
- def encode: (untyped payload) -> (_Encoder | _Each[String])
17
+ def encode: (untyped payload) -> body_encoder
16
18
  end
17
19
 
18
20
  interface _Encoder
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.18.0
4
+ version: 0.19.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tiago Cardoso
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-10-02 00:00:00.000000000 Z
11
+ date: 2022-02-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: http-2-next
@@ -63,6 +63,17 @@ extra_rdoc_files:
63
63
  - doc/release_notes/0_16_1.md
64
64
  - doc/release_notes/0_17_0.md
65
65
  - doc/release_notes/0_18_0.md
66
+ - doc/release_notes/0_18_1.md
67
+ - doc/release_notes/0_18_2.md
68
+ - doc/release_notes/0_18_3.md
69
+ - doc/release_notes/0_18_4.md
70
+ - doc/release_notes/0_18_5.md
71
+ - doc/release_notes/0_18_6.md
72
+ - doc/release_notes/0_18_7.md
73
+ - doc/release_notes/0_19_0.md
74
+ - doc/release_notes/0_19_1.md
75
+ - doc/release_notes/0_19_2.md
76
+ - doc/release_notes/0_19_3.md
66
77
  - doc/release_notes/0_1_0.md
67
78
  - doc/release_notes/0_2_0.md
68
79
  - doc/release_notes/0_2_1.md
@@ -119,6 +130,17 @@ files:
119
130
  - doc/release_notes/0_16_1.md
120
131
  - doc/release_notes/0_17_0.md
121
132
  - doc/release_notes/0_18_0.md
133
+ - doc/release_notes/0_18_1.md
134
+ - doc/release_notes/0_18_2.md
135
+ - doc/release_notes/0_18_3.md
136
+ - doc/release_notes/0_18_4.md
137
+ - doc/release_notes/0_18_5.md
138
+ - doc/release_notes/0_18_6.md
139
+ - doc/release_notes/0_18_7.md
140
+ - doc/release_notes/0_19_0.md
141
+ - doc/release_notes/0_19_1.md
142
+ - doc/release_notes/0_19_2.md
143
+ - doc/release_notes/0_19_3.md
122
144
  - doc/release_notes/0_1_0.md
123
145
  - doc/release_notes/0_2_0.md
124
146
  - doc/release_notes/0_2_1.md
@@ -215,13 +237,15 @@ files:
215
237
  - lib/httpx/request.rb
216
238
  - lib/httpx/resolver.rb
217
239
  - lib/httpx/resolver/https.rb
240
+ - lib/httpx/resolver/multi.rb
218
241
  - lib/httpx/resolver/native.rb
219
- - lib/httpx/resolver/resolver_mixin.rb
242
+ - lib/httpx/resolver/resolver.rb
220
243
  - lib/httpx/resolver/system.rb
221
244
  - lib/httpx/response.rb
222
245
  - lib/httpx/selector.rb
223
246
  - lib/httpx/session.rb
224
247
  - lib/httpx/session2.rb
248
+ - lib/httpx/session_extensions.rb
225
249
  - lib/httpx/timers.rb
226
250
  - lib/httpx/transcoder.rb
227
251
  - lib/httpx/transcoder/body.rb
@@ -278,8 +302,9 @@ files:
278
302
  - sig/request.rbs
279
303
  - sig/resolver.rbs
280
304
  - sig/resolver/https.rbs
305
+ - sig/resolver/multi.rbs
281
306
  - sig/resolver/native.rbs
282
- - sig/resolver/resolver_mixin.rbs
307
+ - sig/resolver/resolver.rbs
283
308
  - sig/resolver/system.rbs
284
309
  - sig/response.rbs
285
310
  - sig/selector.rbs
@@ -300,6 +325,7 @@ metadata:
300
325
  documentation_uri: https://honeyryderchuck.gitlab.io/httpx/rdoc/
301
326
  source_code_uri: https://gitlab.com/honeyryderchuck/httpx
302
327
  homepage_uri: https://honeyryderchuck.gitlab.io/httpx/
328
+ rubygems_mfa_required: 'true'
303
329
  post_install_message:
304
330
  rdoc_options: []
305
331
  require_paths:
@@ -315,7 +341,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
315
341
  - !ruby/object:Gem::Version
316
342
  version: '0'
317
343
  requirements: []
318
- rubygems_version: 3.2.22
344
+ rubygems_version: 3.2.32
319
345
  signing_key:
320
346
  specification_version: 4
321
347
  summary: HTTPX, to the future, and beyond
@@ -1,75 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "resolv"
4
- require "ipaddr"
5
-
6
- module HTTPX
7
- module Resolver
8
- module ResolverMixin
9
- include Callbacks
10
- include Loggable
11
-
12
- CHECK_IF_IP = lambda do |name|
13
- begin
14
- IPAddr.new(name)
15
- true
16
- rescue ArgumentError
17
- false
18
- end
19
- end
20
-
21
- def uncache(connection)
22
- hostname = hostname || @queries.key(connection) || connection.origin.host
23
- Resolver.uncache(hostname)
24
- @_record_types[hostname].shift
25
- end
26
-
27
- private
28
-
29
- def emit_addresses(connection, addresses)
30
- addresses.map! do |address|
31
- address.is_a?(IPAddr) ? address : IPAddr.new(address.to_s)
32
- end
33
- log { "resolver: answer #{connection.origin.host}: #{addresses.inspect}" }
34
- connection.addresses = addresses
35
- catch(:coalesced) { emit(:resolve, connection) }
36
- end
37
-
38
- def early_resolve(connection, hostname: connection.origin.host)
39
- addresses = connection.addresses ||
40
- ip_resolve(hostname) ||
41
- (@resolver_options[:cache] && Resolver.cached_lookup(hostname)) ||
42
- system_resolve(hostname)
43
- return unless addresses
44
-
45
- emit_addresses(connection, addresses)
46
- end
47
-
48
- def ip_resolve(hostname)
49
- [hostname] if CHECK_IF_IP[hostname]
50
- end
51
-
52
- def system_resolve(hostname)
53
- @system_resolver ||= Resolv::Hosts.new
54
- ips = @system_resolver.getaddresses(hostname)
55
- return if ips.empty?
56
-
57
- ips.map { |ip| IPAddr.new(ip) }
58
- rescue IOError
59
- end
60
-
61
- def emit_resolve_error(connection, hostname = connection.origin.host, ex = nil)
62
- emit(:error, connection, resolve_error(hostname, ex))
63
- end
64
-
65
- def resolve_error(hostname, ex = nil)
66
- return ex if ex.is_a?(ResolveError)
67
-
68
- message = ex ? ex.message : "Can't resolve #{hostname}"
69
- error = ResolveError.new(message)
70
- error.set_backtrace(ex ? ex.backtrace : caller)
71
- error
72
- end
73
- end
74
- end
75
- end