httpx 0.8.1 → 0.10.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE.txt +48 -0
  3. data/README.md +9 -5
  4. data/doc/release_notes/0_0_1.md +7 -0
  5. data/doc/release_notes/0_0_2.md +9 -0
  6. data/doc/release_notes/0_0_3.md +9 -0
  7. data/doc/release_notes/0_0_4.md +7 -0
  8. data/doc/release_notes/0_0_5.md +5 -0
  9. data/doc/release_notes/0_10_0.md +66 -0
  10. data/doc/release_notes/0_10_1.md +37 -0
  11. data/doc/release_notes/0_10_2.md +5 -0
  12. data/doc/release_notes/0_1_0.md +9 -0
  13. data/doc/release_notes/0_2_0.md +5 -0
  14. data/doc/release_notes/0_2_1.md +16 -0
  15. data/doc/release_notes/0_3_0.md +12 -0
  16. data/doc/release_notes/0_3_1.md +6 -0
  17. data/doc/release_notes/0_4_0.md +51 -0
  18. data/doc/release_notes/0_4_1.md +3 -0
  19. data/doc/release_notes/0_5_0.md +15 -0
  20. data/doc/release_notes/0_5_1.md +14 -0
  21. data/doc/release_notes/0_6_0.md +5 -0
  22. data/doc/release_notes/0_6_1.md +6 -0
  23. data/doc/release_notes/0_6_2.md +6 -0
  24. data/doc/release_notes/0_6_3.md +13 -0
  25. data/doc/release_notes/0_6_4.md +21 -0
  26. data/doc/release_notes/0_6_5.md +22 -0
  27. data/doc/release_notes/0_6_6.md +19 -0
  28. data/doc/release_notes/0_6_7.md +5 -0
  29. data/doc/release_notes/0_7_0.md +46 -0
  30. data/doc/release_notes/0_8_0.md +27 -0
  31. data/doc/release_notes/0_8_1.md +8 -0
  32. data/doc/release_notes/0_8_2.md +7 -0
  33. data/doc/release_notes/0_9_0.md +38 -0
  34. data/lib/httpx.rb +2 -0
  35. data/lib/httpx/adapters/faraday.rb +1 -1
  36. data/lib/httpx/chainable.rb +11 -11
  37. data/lib/httpx/connection.rb +23 -31
  38. data/lib/httpx/connection/http1.rb +30 -4
  39. data/lib/httpx/connection/http2.rb +26 -9
  40. data/lib/httpx/domain_name.rb +440 -0
  41. data/lib/httpx/errors.rb +2 -1
  42. data/lib/httpx/extensions.rb +22 -2
  43. data/lib/httpx/headers.rb +1 -1
  44. data/lib/httpx/io/ssl.rb +0 -1
  45. data/lib/httpx/io/tcp.rb +6 -5
  46. data/lib/httpx/io/udp.rb +4 -1
  47. data/lib/httpx/options.rb +5 -1
  48. data/lib/httpx/parser/http1.rb +14 -17
  49. data/lib/httpx/plugins/compression.rb +46 -65
  50. data/lib/httpx/plugins/compression/brotli.rb +10 -14
  51. data/lib/httpx/plugins/compression/deflate.rb +7 -6
  52. data/lib/httpx/plugins/compression/gzip.rb +23 -5
  53. data/lib/httpx/plugins/cookies.rb +21 -60
  54. data/lib/httpx/plugins/cookies/cookie.rb +173 -0
  55. data/lib/httpx/plugins/cookies/jar.rb +74 -0
  56. data/lib/httpx/plugins/cookies/set_cookie_parser.rb +142 -0
  57. data/lib/httpx/plugins/expect.rb +12 -1
  58. data/lib/httpx/plugins/follow_redirects.rb +20 -2
  59. data/lib/httpx/plugins/h2c.rb +1 -1
  60. data/lib/httpx/plugins/multipart.rb +12 -6
  61. data/lib/httpx/plugins/persistent.rb +6 -1
  62. data/lib/httpx/plugins/proxy.rb +16 -2
  63. data/lib/httpx/plugins/proxy/socks4.rb +14 -14
  64. data/lib/httpx/plugins/rate_limiter.rb +51 -0
  65. data/lib/httpx/plugins/retries.rb +3 -2
  66. data/lib/httpx/plugins/stream.rb +109 -13
  67. data/lib/httpx/pool.rb +14 -20
  68. data/lib/httpx/request.rb +8 -20
  69. data/lib/httpx/resolver.rb +7 -10
  70. data/lib/httpx/resolver/https.rb +22 -24
  71. data/lib/httpx/resolver/native.rb +19 -16
  72. data/lib/httpx/resolver/resolver_mixin.rb +4 -2
  73. data/lib/httpx/resolver/system.rb +2 -2
  74. data/lib/httpx/response.rb +16 -25
  75. data/lib/httpx/selector.rb +11 -18
  76. data/lib/httpx/session.rb +40 -26
  77. data/lib/httpx/transcoder.rb +18 -0
  78. data/lib/httpx/transcoder/chunker.rb +0 -2
  79. data/lib/httpx/transcoder/form.rb +9 -7
  80. data/lib/httpx/transcoder/json.rb +0 -4
  81. data/lib/httpx/utils.rb +45 -0
  82. data/lib/httpx/version.rb +1 -1
  83. data/sig/buffer.rbs +24 -0
  84. data/sig/callbacks.rbs +14 -0
  85. data/sig/chainable.rbs +37 -0
  86. data/sig/connection.rbs +85 -0
  87. data/sig/connection/http1.rbs +66 -0
  88. data/sig/connection/http2.rbs +78 -0
  89. data/sig/domain_name.rbs +17 -0
  90. data/sig/errors.rbs +3 -0
  91. data/sig/headers.rbs +42 -0
  92. data/sig/httpx.rbs +15 -0
  93. data/sig/loggable.rbs +11 -0
  94. data/sig/missing.rbs +12 -0
  95. data/sig/options.rbs +118 -0
  96. data/sig/parser/http1.rbs +50 -0
  97. data/sig/plugins/authentication.rbs +11 -0
  98. data/sig/plugins/basic_authentication.rbs +13 -0
  99. data/sig/plugins/compression.rbs +55 -0
  100. data/sig/plugins/compression/brotli.rbs +21 -0
  101. data/sig/plugins/compression/deflate.rbs +17 -0
  102. data/sig/plugins/compression/gzip.rbs +29 -0
  103. data/sig/plugins/cookies.rbs +26 -0
  104. data/sig/plugins/cookies/cookie.rbs +50 -0
  105. data/sig/plugins/cookies/jar.rbs +27 -0
  106. data/sig/plugins/digest_authentication.rbs +33 -0
  107. data/sig/plugins/expect.rbs +19 -0
  108. data/sig/plugins/follow_redirects.rbs +37 -0
  109. data/sig/plugins/h2c.rbs +26 -0
  110. data/sig/plugins/multipart.rbs +21 -0
  111. data/sig/plugins/persistent.rbs +17 -0
  112. data/sig/plugins/proxy.rbs +47 -0
  113. data/sig/plugins/proxy/http.rbs +14 -0
  114. data/sig/plugins/proxy/socks4.rbs +33 -0
  115. data/sig/plugins/proxy/socks5.rbs +36 -0
  116. data/sig/plugins/proxy/ssh.rbs +18 -0
  117. data/sig/plugins/push_promise.rbs +22 -0
  118. data/sig/plugins/rate_limiter.rbs +11 -0
  119. data/sig/plugins/retries.rbs +48 -0
  120. data/sig/plugins/stream.rbs +39 -0
  121. data/sig/pool.rbs +36 -0
  122. data/sig/registry.rbs +9 -0
  123. data/sig/request.rbs +61 -0
  124. data/sig/resolver.rbs +26 -0
  125. data/sig/resolver/https.rbs +49 -0
  126. data/sig/resolver/native.rbs +60 -0
  127. data/sig/resolver/resolver_mixin.rbs +27 -0
  128. data/sig/resolver/system.rbs +17 -0
  129. data/sig/response.rbs +87 -0
  130. data/sig/selector.rbs +20 -0
  131. data/sig/session.rbs +49 -0
  132. data/sig/timeout.rbs +29 -0
  133. data/sig/transcoder.rbs +18 -0
  134. data/sig/transcoder/body.rbs +18 -0
  135. data/sig/transcoder/chunker.rbs +32 -0
  136. data/sig/transcoder/form.rbs +16 -0
  137. data/sig/transcoder/json.rbs +14 -0
  138. metadata +130 -22
  139. data/lib/httpx/resolver/options.rb +0 -25
@@ -0,0 +1,17 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Persistent
4
+ def self.load_dependencies: (singleton(Session)) -> void
5
+
6
+ interface _PersistentOptions
7
+ def persistent: () -> bool?
8
+ def persistent=: (bool) -> bool
9
+ def with_persistent: (bool) -> instance
10
+ end
11
+
12
+ def self.extra_options: (Options) -> (Options & _PersistentOptions)
13
+ end
14
+
15
+ type sessionPersistent = sessionFollowRedirects
16
+ end
17
+ end
@@ -0,0 +1,47 @@
1
+ module HTTPX
2
+ HTTPProxyError: singleton(Error)
3
+
4
+ module Plugins
5
+ module Proxy
6
+ Error: singleton(HTTPProxyError)
7
+ PROXY_ERRORS: Array[singleton(StandardError)]
8
+
9
+ class Parameters
10
+ attr_reader uri: URI::Generic
11
+ attr_reader username: string?
12
+ attr_reader password: string?
13
+
14
+ def authenticated?: () -> boolish
15
+ def token_authentication: () -> String?
16
+
17
+ def ==: (untyped) -> bool
18
+
19
+ private
20
+
21
+ def initialize: (uri: generic_uri, ?username: string, ?password: string) -> untyped
22
+ end
23
+
24
+ def self.configure: (singleton(Session)) -> void
25
+
26
+ type proxyParam = Parameters | Hash
27
+
28
+ interface _ProxyOptions
29
+ def proxy: () -> proxyParam?
30
+ def proxy=: (Parameters | _ToHash) -> proxyParam
31
+ def with_proxy: (Parameters | _ToHash) -> instance
32
+ end
33
+
34
+ def self.extra_options: (Options) -> (Options & _ProxyOptions)
35
+
36
+ module InstanceMethods
37
+ private
38
+
39
+ def proxy_uris: (uri, Options & _ProxyOptions) -> { uri: (URI | string), username: string, password: string }
40
+ | (uri, Options & _ProxyOptions) -> { uri: (URI | string) }
41
+ | (uri, Options & _ProxyOptions) -> nil
42
+ end
43
+ end
44
+
45
+ type sessionProxy = Session & Plugins::Proxy::InstanceMethods
46
+ end
47
+ end
@@ -0,0 +1,14 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Proxy
4
+ module HTTP
5
+
6
+ module ConnectionMethods
7
+ def __http_proxy_connect: () -> void
8
+ def __http_on_connect: (top, Response) -> void
9
+ end
10
+
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,33 @@
1
+ module HTTPX
2
+ Socks4Error: singleton(Error)
3
+
4
+ module Plugins
5
+ module Proxy
6
+ module Socks4
7
+
8
+ module ConnectionMethods
9
+ def __socks4_proxy_connect: () -> void
10
+ def __socks4_on_packet: (String packet) -> void
11
+ def on_socks4_error: (string) -> void
12
+ end
13
+
14
+ class SocksParser
15
+ include Callbacks
16
+
17
+ def close: () -> void
18
+ def consume: (*untyped) -> void
19
+ def empty: () -> bool
20
+ def <<: (string) -> void
21
+
22
+ private
23
+
24
+ def initialize: (Buffer buffer, Options) -> untyped
25
+ end
26
+
27
+ module Packet
28
+ def self?.connect: (Parameters, uri) -> String
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ module HTTPX
2
+ Socks5Error: singleton(Error)
3
+
4
+ module Plugins
5
+ module Proxy
6
+ module Socks5
7
+
8
+ module ConnectionMethods
9
+ def __socks5_proxy_connect: () -> void
10
+ def __socks5_on_packet: (String packet) -> void
11
+ def __socks5_check_version: (int) -> void
12
+ def __on_socks5_error: (string) -> void
13
+ end
14
+
15
+ class SocksParser
16
+ include Callbacks
17
+
18
+ def close: () -> void
19
+ def consume: (*untyped) -> void
20
+ def empty: () -> bool
21
+ def <<: (string) -> void
22
+
23
+ private
24
+
25
+ def initialize: (Buffer buffer, Options) -> untyped
26
+ end
27
+
28
+ module Packet
29
+ def self?.negotiate: (Parameters) -> String
30
+ def self?.authenticate: (Parameters) -> String
31
+ def self?.connect: (uri) -> String
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,18 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Proxy
4
+ module SSH
5
+ def self.load_dependencies: (singleton(Session)) -> void
6
+
7
+ module InstancenMethods
8
+ private
9
+
10
+ def build_gateway_socket: (int, URI::HTTPS | URI::HTTPS, Options) -> IO
11
+ end
12
+ end
13
+ end
14
+
15
+
16
+ type sessionSSHProxy = Plugins::Proxy::InstanceMethods & Plugins::Proxy::SSH::InstanceMethods
17
+ end
18
+ end
@@ -0,0 +1,22 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module PushPromise
4
+ def self.extra_options: (Options) -> Options
5
+
6
+ module ResponseMethods
7
+ def pushed?: () -> boolish
8
+ def mark_as_pushed!: () -> void
9
+ end
10
+
11
+ module InstanceMethods
12
+ private
13
+
14
+ def promise_headers: () -> Hash[HTTP2Next::Stream, Request]
15
+ def __on_promise_request: (Connection::HTTP2, HTTP2Next::Stream, headers_input) -> void
16
+ def __on_promise_response: (Connection::HTTP2, HTTP2Next::Stream, headers_input) -> void
17
+ end
18
+ end
19
+
20
+ type sessionPushPromise = Session & PushPromise::InstanceMethods
21
+ end
22
+ end
@@ -0,0 +1,11 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module RateLimiter
4
+ def self.load_dependencies: (singleton(Session)) -> void
5
+
6
+ def self.retry_on_rate_limited_response: (_Response) -> bool
7
+
8
+ def self.retry_after_rate_limit: (untyped, _Response) -> Numeric?
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,48 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Retries
4
+ MAX_RETRIES: Integer
5
+ IDEMPOTENT_METHODS: Array[verb]
6
+ RETRYABLE_ERRORS: Array[singleton(StandardError)]
7
+
8
+ interface _RetryCallback
9
+ def call: (response) -> bool?
10
+ end
11
+
12
+ interface _RetriesOptions
13
+ def retry_after: () -> Numeric?
14
+ def retry_after=: (Numeric) -> Numeric
15
+ def with_retry_after: (Numeric) -> instance
16
+
17
+ def max_retries: () -> Integer?
18
+ def max_retries=: (int) -> Integer
19
+ def with_max_retries: (int) -> instance
20
+
21
+ def retry_change_requests: () -> bool?
22
+ def retry_change_requests=: (bool) -> bool
23
+ def with_retry_change_requests: (bool) -> instance
24
+
25
+ def retry_on: () -> _RetryCallback?
26
+ def retry_on=: (_RetryCallback) -> _RetryCallback
27
+ def with_retry_on: (_RetryCallback) -> instance
28
+ end
29
+
30
+ def self.extra_options: (Options) -> (Options & _RetriesOptions)
31
+
32
+ module InstanceMethods
33
+ def max_retries: (int) -> instance
34
+
35
+ private
36
+
37
+ def __repeatable_request?: (Request, Options) -> boolish
38
+ def __retryable_error?: (_Exception) -> bool
39
+ end
40
+
41
+ module RequestMethods
42
+ def retries: () -> Integer
43
+ end
44
+ end
45
+
46
+ type sessionRetries = Session & Plugins::Retries::InstanceMethods
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ module HTTPX
2
+ module Plugins
3
+ module Stream
4
+ module InstanceMethods
5
+ private
6
+
7
+ def request: (*Request, ?stream: bool, **untyped?) -> (response | Array[response] | StreamResponse)
8
+ | (*untyped, ?stream: bool, **untyped?) -> (response | Array[response] | StreamResponse)
9
+ end
10
+
11
+ module RequestMethods
12
+ attr_accessor stream: StreamResponse?
13
+ end
14
+
15
+ module ResponseMethods
16
+ def stream: () -> StreamResponse?
17
+ end
18
+
19
+ class StreamResponse
20
+ include _ToS
21
+
22
+ def each: () { (String) -> void } -> void
23
+ | () -> Enumerable[String]
24
+
25
+ def each_line: () { (String) -> void } -> void
26
+ | () -> Enumerable[String]
27
+
28
+ def on_chunk: (string) -> void
29
+
30
+ private
31
+
32
+ def response: () -> response
33
+ def initialize: (Request, Session) -> untyped
34
+ end
35
+ end
36
+
37
+ type sessionStream = Session & Plugins::Stream::InstanceMethods
38
+ end
39
+ end
@@ -0,0 +1,36 @@
1
+ module HTTPX
2
+ class Pool
3
+ def empty?: () -> void
4
+
5
+ def next_tick: () -> void
6
+
7
+ def close: (Array[Connection]) -> void
8
+ | () -> void
9
+
10
+ def init_connection: (Connection, Options) -> void
11
+
12
+ def find_connection: (generic_uri, Options) -> Connection?
13
+
14
+ private
15
+
16
+ def initialize: () -> untyped
17
+
18
+ def resolve_connection: (Connection) -> void
19
+
20
+ def on_resolver_connection: (Connection) -> void
21
+
22
+ def on_resolver_error: (Connection, StandardError) -> void
23
+
24
+ def on_resolver_close: (resolver) -> void
25
+
26
+ def register_connection: (Connection) -> void
27
+
28
+ def unregister_connection: (Connection) -> void
29
+
30
+ def coalesce_connections: (Connection, Connection) -> void
31
+
32
+ def next_timeout: () -> Numeric?
33
+
34
+ def find_resolver_for: (Connection) -> resolver
35
+ end
36
+ end
@@ -0,0 +1,9 @@
1
+ module HTTPX::Registry[T, V]
2
+ # type registrable = Symbol | String | Class
3
+
4
+ def self.registry: (T tag) -> Class
5
+ | () -> Hash[K, V]
6
+ def self.register: (T tag, V handler) -> void
7
+
8
+ def registry: (?T tag) -> V
9
+ end
@@ -0,0 +1,61 @@
1
+ module HTTPX
2
+ class Request
3
+ include Callbacks
4
+
5
+ METHODS: Array[verb]
6
+ USER_AGENT: String
7
+
8
+ attr_reader verb: verb
9
+ attr_reader uri: URI::HTTP | URI::HTTPS
10
+ attr_reader headers: Headers
11
+ attr_reader body: Body
12
+ attr_reader state: Symbol
13
+ attr_reader options: Options
14
+ attr_reader response: Response?
15
+
16
+ def initialize: (verb | String, uri, ?options?) -> untyped
17
+
18
+ def interests: () -> (:r | :w)
19
+
20
+ def merge_headers: (Headers | Hash) -> void
21
+
22
+ def scheme: () -> ("http" | "https")
23
+
24
+ def response=: (Response response) -> void
25
+
26
+ def path: () -> String
27
+
28
+ def authority: () -> String
29
+
30
+ def origin: () -> String
31
+
32
+ def query: () -> String
33
+
34
+ def drain_body: () -> String?
35
+
36
+ def inspect: () -> String
37
+
38
+ def transition: (Symbol) -> void
39
+
40
+ def expects?: () -> bool
41
+
42
+ class Body
43
+ def initialize: (Headers, Options) -> untyped
44
+ def each: () { (String) -> void } -> void
45
+ | () -> Enumerable[String]
46
+
47
+ def empty?: () -> bool
48
+ def bytesize: () -> Numeric
49
+ def stream: (Transcoder::_Encoder) -> bodyIO
50
+ def unbounded_body?: () -> bool
51
+ def chunked?: () -> bool
52
+ def chunk!: () -> void
53
+ def inspect: () -> String
54
+ end
55
+
56
+ class ProcIO
57
+ include _Writer
58
+ def initialize: (^(_ToS) -> void) -> untyped
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,26 @@
1
+ module HTTPX
2
+ type ipaddr = IPAddr | String
3
+
4
+ type resolver = Resolver::System | Resolver::Native | Resolver::HTTPS
5
+
6
+ module Resolver
7
+ type dns_resource = singleton(Resolv::DNS::Resource)
8
+
9
+ type dns_result = { "name" => String, "TTL" => Numeric, "alias" => String }
10
+ | { "name" => String, "TTL" => Numeric, "data" => String }
11
+
12
+ def self?.cached_lookup: (String hostname) -> Array[String]?
13
+
14
+ def self?.cached_lookup_set: (String hostname, Array[dns_result] addresses) -> void
15
+
16
+ def self?.uncache: (String hostname) -> void
17
+
18
+ def self?.lookup: (String hostname, Numeric ttl) -> Array[String]?
19
+
20
+ def self?.generate_id: () -> Integer
21
+
22
+ def self?.encode_dns_query: (String hostname, ?type: dns_resource) -> String
23
+
24
+ def self?.decode_dns_answer: (String) -> Array[dns_result]
25
+ end
26
+ end
@@ -0,0 +1,49 @@
1
+ module HTTPX
2
+ module Resolver
3
+ class HTTPS
4
+ include ResolverMixin
5
+ include _ToIO
6
+
7
+ @options: Options
8
+ @resolver_options: Hash[Symbol, untyped]
9
+ @_record_types: Hash[String, Hash["A" | "AAAA", dns_resource]]
10
+ @queries: Hash[String, Connection]
11
+ @requests: Hash[Request, Connection]
12
+ @connections: Array[Connection]
13
+ @uri: URI::HTTPS
14
+ @uri_addresses: Array[String]?
15
+
16
+ def <<: (Connection) -> void
17
+
18
+ def timeout: () -> Numeric?
19
+
20
+ def closed?: () -> bool
21
+
22
+ def empty?: () -> bool
23
+
24
+ def close: () -> void
25
+
26
+ def call: () -> void
27
+
28
+ def interests: () -> io_interests?
29
+
30
+ private
31
+
32
+ def initialize: (options) -> untyped
33
+
34
+ def pool: () -> Pool
35
+
36
+ def resolver_connection: () -> Connection
37
+
38
+ def resolve: (Connection, String hostname) -> void
39
+ | (Connection) -> void
40
+ | () -> void
41
+
42
+ def response: (Response) -> void
43
+
44
+ def build_request: (String hostname, "A" | "AAAA") -> Request
45
+
46
+ def decode_response_body: (Response) -> Array[dns_result]
47
+ end
48
+ end
49
+ end