http 5.0.2 → 5.0.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.
- checksums.yaml +4 -4
- data/CHANGES.md +14 -0
- data/Gemfile +1 -1
- data/README.md +44 -80
- data/lib/http/request/writer.rb +1 -1
- data/lib/http/response.rb +2 -2
- data/lib/http/timeout/global.rb +9 -27
- data/lib/http/timeout/per_operation.rb +4 -25
- data/lib/http/version.rb +1 -1
- data/spec/lib/http/request/body_spec.rb +3 -3
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 07b34c228e87205e026b3e446bb870391df41188fa7d97438c863825819a6694
|
4
|
+
data.tar.gz: 4892ec252ec9f4fff897bd3860af14b6379fc97363f916b225d337dd000af343
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4b3f3261bf7215369f88c06a2147eeb0b1811aeb76aba86b59c2def09cdbc8e5b5b53197f4124af9de032a11e8786060957cb684dc03c52c35425e5f967b1ac8
|
7
|
+
data.tar.gz: 7dc0afcf98bbe98da6c769e9d5eb30dd84a82e9095e3191840f3063099317fe37559c8e09282ff56c0cf39e77f70179e6605651c196198b1c8f4a49cf6b8a851
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
## 5.0.3 (2021-10-06)
|
2
|
+
|
3
|
+
* [#695](https://github.com/httprb/http/pull/695)
|
4
|
+
Revert DNS resolving feature.
|
5
|
+
([@PhilCoggins])
|
6
|
+
|
7
|
+
* [#694](https://github.com/httprb/http/pull/694)
|
8
|
+
Fix cookies extraction.
|
9
|
+
([@flosacca])
|
10
|
+
|
1
11
|
## 5.0.2 (2021-09-10)
|
2
12
|
|
3
13
|
* [#686](https://github.com/httprb/http/pull/686)
|
@@ -28,6 +38,7 @@
|
|
28
38
|
DNS failover handling.
|
29
39
|
([@midnight-wonderer])
|
30
40
|
|
41
|
+
|
31
42
|
## 5.0.1 (2021-06-26)
|
32
43
|
|
33
44
|
* [#670](https://github.com/httprb/http/pull/670)
|
@@ -42,6 +53,7 @@
|
|
42
53
|
Bump llhttp-ffi to 0.3.0.
|
43
54
|
([@bryanp])
|
44
55
|
|
56
|
+
|
45
57
|
## 5.0.0 (2021-05-12)
|
46
58
|
|
47
59
|
* [#656](https://github.com/httprb/http/pull/656)
|
@@ -948,3 +960,5 @@ end
|
|
948
960
|
[@midnight-wonderer]: https://github.com/midnight-wonderer
|
949
961
|
[@schwern]: https://github.com/schwern
|
950
962
|
[@matheussilvasantos]: https://github.com/matheussilvasantos
|
963
|
+
[@PhilCoggins]: https://github.com/PhilCoggins
|
964
|
+
[@flosacca]: https://github.com/flosacca
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,16 +1,12 @@
|
|
1
|
-
# 
|
2
2
|
|
3
|
-
[![Gem Version]
|
4
|
-
[![
|
5
|
-
[![
|
6
|
-
[![
|
3
|
+
[![Gem Version][gem-image]][gem-link]
|
4
|
+
[![MIT licensed][license-image]][license-link]
|
5
|
+
[![Build Status][build-image]][build-link]
|
6
|
+
[![Code Climate][codeclimate-image]][codeclimate-link]
|
7
7
|
|
8
8
|
[Documentation]
|
9
9
|
|
10
|
-
_NOTE: This is the 5.x **development** branch. For the 4.x **stable** branch, please see:_
|
11
|
-
|
12
|
-
https://github.com/httprb/http/tree/4-x-stable
|
13
|
-
|
14
10
|
## About
|
15
11
|
|
16
12
|
HTTP (The Gem! a.k.a. http.rb) is an easy-to-use client library for making requests
|
@@ -21,63 +17,16 @@ Under the hood, http.rb uses the [llhttp] parser, a fast HTTP parsing native ext
|
|
21
17
|
This library isn't just yet another wrapper around `Net::HTTP`. It implements the HTTP
|
22
18
|
protocol natively and outsources the parsing to native extensions.
|
23
19
|
|
24
|
-
|
25
|
-
[llhttp]: https://llhttp.org/
|
26
|
-
|
27
|
-
|
28
|
-
## Another Ruby HTTP library? Why should I care?
|
29
|
-
|
30
|
-
There are a lot of HTTP libraries to choose from in the Ruby ecosystem.
|
31
|
-
So why would you choose this one?
|
20
|
+
### Why http.rb?
|
32
21
|
|
33
|
-
|
34
|
-
|
35
|
-
1. **Clean API**: http.rb offers an easy-to-use API that should be a
|
22
|
+
- **Clean API**: http.rb offers an easy-to-use API that should be a
|
36
23
|
breath of fresh air after using something like Net::HTTP.
|
37
24
|
|
38
|
-
|
25
|
+
- **Maturity**: http.rb is one of the most mature Ruby HTTP clients, supporting
|
39
26
|
features like persistent connections and fine-grained timeouts.
|
40
27
|
|
41
|
-
|
42
|
-
http.rb achieves
|
43
|
-
implements the HTTP protocol in Ruby instead of C:
|
44
|
-
|
45
|
-
| HTTP client | Time | Implementation |
|
46
|
-
|--------------------------|--------|-----------------------|
|
47
|
-
| curb (persistent) | 2.519 | libcurl wrapper |
|
48
|
-
| em-http-request | 2.731 | EM + http_parser.rb |
|
49
|
-
| Typhoeus | 2.851 | libcurl wrapper |
|
50
|
-
| StreamlyFFI (persistent) | 2.853 | libcurl wrapper |
|
51
|
-
| http.rb (persistent) | 2.970 | Ruby + http_parser.rb |
|
52
|
-
| http.rb | 3.588 | Ruby + http_parser.rb |
|
53
|
-
| HTTParty | 3.931 | Net::HTTP wrapper |
|
54
|
-
| Net::HTTP | 3.959 | Pure Ruby |
|
55
|
-
| Net::HTTP (persistent) | 4.043 | Pure Ruby |
|
56
|
-
| open-uri | 4.479 | Net::HTTP wrapper |
|
57
|
-
| Excon (persistent) | 4.618 | Pure Ruby |
|
58
|
-
| Excon | 4.701 | Pure Ruby |
|
59
|
-
| RestClient | 26.838 | Net::HTTP wrapper |
|
60
|
-
|
61
|
-
Benchmarks performed using excon's benchmarking tool
|
62
|
-
|
63
|
-
DISCLAIMER: Most benchmarks you find in READMEs are crap,
|
64
|
-
including this one. These are out-of-date. If you care about
|
65
|
-
performance, benchmark for yourself for your own use cases!
|
66
|
-
|
67
|
-
## Help and Discussion
|
68
|
-
|
69
|
-
If you need help or just want to talk about the http.rb,
|
70
|
-
visit the http.rb Google Group:
|
71
|
-
|
72
|
-
https://groups.google.com/forum/#!forum/httprb
|
73
|
-
|
74
|
-
You can join by email by sending a message to:
|
75
|
-
|
76
|
-
[httprb+subscribe@googlegroups.com](mailto:httprb+subscribe@googlegroups.com)
|
77
|
-
|
78
|
-
If you believe you've found a bug, please report it at:
|
79
|
-
|
80
|
-
https://github.com/httprb/http/issues
|
28
|
+
- **Performance**: using native parsers and a clean, lightweight implementation,
|
29
|
+
http.rb achieves high performance while implementing HTTP in Ruby instead of C.
|
81
30
|
|
82
31
|
|
83
32
|
## Installation
|
@@ -112,10 +61,9 @@ for more detailed documentation and usage notes.
|
|
112
61
|
|
113
62
|
The following API documentation is also available:
|
114
63
|
|
115
|
-
|
116
|
-
|
64
|
+
- [YARD API documentation](https://www.rubydoc.info/github/httprb/http)
|
65
|
+
- [Chainable module (all chainable methods)](https://www.rubydoc.info/github/httprb/http/HTTP/Chainable)
|
117
66
|
|
118
|
-
[documentation]: https://github.com/httprb/http/wiki
|
119
67
|
|
120
68
|
### Basic Usage
|
121
69
|
|
@@ -142,7 +90,7 @@ We can also obtain an `HTTP::Response::Body` object for this response:
|
|
142
90
|
```
|
143
91
|
|
144
92
|
The response body can be streamed with `HTTP::Response::Body#readpartial`.
|
145
|
-
In practice, you'll want to bind the HTTP::Response::Body to a local variable
|
93
|
+
In practice, you'll want to bind the `HTTP::Response::Body` to a local variable
|
146
94
|
and call `#readpartial` on it repeatedly until it returns `nil`:
|
147
95
|
|
148
96
|
```ruby
|
@@ -159,13 +107,13 @@ and call `#readpartial` on it repeatedly until it returns `nil`:
|
|
159
107
|
|
160
108
|
## Supported Ruby Versions
|
161
109
|
|
162
|
-
This library aims to support and is [tested against][
|
163
|
-
versions:
|
110
|
+
This library aims to support and is [tested against][build-link]
|
111
|
+
the following Ruby versions:
|
164
112
|
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
113
|
+
- Ruby 2.6
|
114
|
+
- Ruby 2.7
|
115
|
+
- Ruby 3.0
|
116
|
+
- JRuby 9.2
|
169
117
|
|
170
118
|
If something doesn't work on one of these versions, it's a bug.
|
171
119
|
|
@@ -180,20 +128,36 @@ patches in a timely fashion. If critical issues for a particular implementation
|
|
180
128
|
exist at the time of a major release, support for that Ruby version may be
|
181
129
|
dropped.
|
182
130
|
|
183
|
-
[travis]: http://travis-ci.org/httprb/http
|
184
|
-
|
185
131
|
|
186
132
|
## Contributing to http.rb
|
187
133
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
134
|
+
- Fork http.rb on GitHub
|
135
|
+
- Make your changes
|
136
|
+
- Ensure all tests pass (`bundle exec rake`)
|
137
|
+
- Send a pull request
|
138
|
+
- If we like them we'll merge them
|
139
|
+
- If we've accepted a patch, feel free to ask for commit access!
|
194
140
|
|
195
141
|
|
196
142
|
## Copyright
|
197
143
|
|
198
|
-
Copyright
|
144
|
+
Copyright © 2011-2021 Tony Arcieri, Alexey V. Zapparov, Erik Michaels-Ober, Zachary Anker.
|
199
145
|
See LICENSE.txt for further details.
|
146
|
+
|
147
|
+
|
148
|
+
[//]: # (badges)
|
149
|
+
|
150
|
+
[gem-image]: https://img.shields.io/gem/v/http?logo=ruby
|
151
|
+
[gem-link]: https://rubygems.org/gems/http
|
152
|
+
[license-image]: https://img.shields.io/badge/license-MIT-blue.svg
|
153
|
+
[license-link]: https://github.com/httprb/http/blob/main/LICENSE.txt
|
154
|
+
[build-image]: https://github.com/httprb/http/workflows/CI/badge.svg
|
155
|
+
[build-link]: https://github.com/httprb/http/actions/workflows/ci.yml
|
156
|
+
[codeclimate-image]: https://codeclimate.com/github/httprb/http.svg?branch=main
|
157
|
+
[codeclimate-link]: https://codeclimate.com/github/httprb/http
|
158
|
+
|
159
|
+
[//]: # (links)
|
160
|
+
|
161
|
+
[documentation]: https://github.com/httprb/http/wiki
|
162
|
+
[requests]: http://docs.python-requests.org/en/latest/
|
163
|
+
[llhttp]: https://llhttp.org/
|
data/lib/http/request/writer.rb
CHANGED
@@ -61,7 +61,7 @@ module HTTP
|
|
61
61
|
def join_headers
|
62
62
|
# join the headers array with crlfs, stick two on the end because
|
63
63
|
# that ends the request header
|
64
|
-
@request_header.join(CRLF) + CRLF * 2
|
64
|
+
@request_header.join(CRLF) + (CRLF * 2)
|
65
65
|
end
|
66
66
|
|
67
67
|
# Writes HTTP request data into the socket.
|
data/lib/http/response.rb
CHANGED
@@ -138,8 +138,8 @@ module HTTP
|
|
138
138
|
def_delegator :content_type, :charset
|
139
139
|
|
140
140
|
def cookies
|
141
|
-
@cookies ||= headers.each_with_object CookieJar.new do |
|
142
|
-
jar.parse(v, uri)
|
141
|
+
@cookies ||= headers.get(Headers::SET_COOKIE).each_with_object CookieJar.new do |v, jar|
|
142
|
+
jar.parse(v, uri)
|
143
143
|
end
|
144
144
|
end
|
145
145
|
|
data/lib/http/timeout/global.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "io/wait"
|
4
|
-
require "resolv"
|
5
3
|
require "timeout"
|
4
|
+
require "io/wait"
|
6
5
|
|
7
6
|
require "http/timeout/null"
|
8
7
|
|
@@ -13,9 +12,6 @@ module HTTP
|
|
13
12
|
super
|
14
13
|
|
15
14
|
@timeout = @time_left = options.fetch(:global_timeout)
|
16
|
-
@dns_resolver = options.fetch(:dns_resolver) do
|
17
|
-
::Resolv.method(:getaddresses)
|
18
|
-
end
|
19
15
|
end
|
20
16
|
|
21
17
|
# To future me: Don't remove this again, past you was smarter.
|
@@ -23,28 +19,14 @@ module HTTP
|
|
23
19
|
@time_left = @timeout
|
24
20
|
end
|
25
21
|
|
26
|
-
def connect(socket_class,
|
27
|
-
connect_operation = lambda do |host_address|
|
28
|
-
::Timeout.timeout(@time_left, TimeoutError) do
|
29
|
-
super(socket_class, host_address, *args)
|
30
|
-
end
|
31
|
-
end
|
32
|
-
host_addresses = @dns_resolver.call(host_name)
|
33
|
-
# ensure something to iterates
|
34
|
-
trying_targets = host_addresses.empty? ? [host_name] : host_addresses
|
22
|
+
def connect(socket_class, host, port, nodelay = false)
|
35
23
|
reset_timer
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
connect_operation.call(trying_iterator.next).tap do
|
40
|
-
log_time
|
41
|
-
end
|
42
|
-
rescue TimeoutError => e
|
43
|
-
error = e
|
44
|
-
retry
|
45
|
-
rescue ::StopIteration
|
46
|
-
raise error
|
24
|
+
::Timeout.timeout(@time_left, TimeoutError) do
|
25
|
+
@socket = socket_class.open(host, port)
|
26
|
+
@socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay
|
47
27
|
end
|
28
|
+
|
29
|
+
log_time
|
48
30
|
end
|
49
31
|
|
50
32
|
def connect_ssl
|
@@ -53,11 +35,11 @@ module HTTP
|
|
53
35
|
begin
|
54
36
|
@socket.connect_nonblock
|
55
37
|
rescue IO::WaitReadable
|
56
|
-
|
38
|
+
@socket.wait_readable(@time_left)
|
57
39
|
log_time
|
58
40
|
retry
|
59
41
|
rescue IO::WaitWritable
|
60
|
-
|
42
|
+
@socket.wait_writable(@time_left)
|
61
43
|
log_time
|
62
44
|
retry
|
63
45
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "resolv"
|
4
3
|
require "timeout"
|
5
4
|
|
6
5
|
require "http/timeout/null"
|
@@ -18,34 +17,14 @@ module HTTP
|
|
18
17
|
@read_timeout = options.fetch(:read_timeout, READ_TIMEOUT)
|
19
18
|
@write_timeout = options.fetch(:write_timeout, WRITE_TIMEOUT)
|
20
19
|
@connect_timeout = options.fetch(:connect_timeout, CONNECT_TIMEOUT)
|
21
|
-
@dns_resolver = options.fetch(:dns_resolver) do
|
22
|
-
::Resolv.method(:getaddresses)
|
23
|
-
end
|
24
20
|
end
|
25
21
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
::Timeout.timeout(@connect_timeout, TimeoutError) do
|
31
|
-
super(socket_class, host_address, *args)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
host_addresses = @dns_resolver.call(host_name)
|
35
|
-
# ensure something to iterates
|
36
|
-
trying_targets = host_addresses.empty? ? [host_name] : host_addresses
|
37
|
-
trying_iterator = trying_targets.lazy
|
38
|
-
error = nil
|
39
|
-
begin
|
40
|
-
connect_operation.call(trying_iterator.next)
|
41
|
-
rescue TimeoutError => e
|
42
|
-
error = e
|
43
|
-
retry
|
44
|
-
rescue ::StopIteration
|
45
|
-
raise error
|
22
|
+
def connect(socket_class, host, port, nodelay = false)
|
23
|
+
::Timeout.timeout(@connect_timeout, TimeoutError) do
|
24
|
+
@socket = socket_class.open(host, port)
|
25
|
+
@socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) if nodelay
|
46
26
|
end
|
47
27
|
end
|
48
|
-
# rubocop:enable Metrics/MethodLength
|
49
28
|
|
50
29
|
def connect_ssl
|
51
30
|
rescue_readable(@connect_timeout) do
|
data/lib/http/version.rb
CHANGED
@@ -118,10 +118,10 @@ RSpec.describe HTTP::Request::Body do
|
|
118
118
|
end
|
119
119
|
|
120
120
|
context "when body is a non-Enumerable IO" do
|
121
|
-
let(:body) { FakeIO.new("a" * 16 * 1024 + "b" * 10 * 1024) }
|
121
|
+
let(:body) { FakeIO.new(("a" * 16 * 1024) + ("b" * 10 * 1024)) }
|
122
122
|
|
123
123
|
it "yields chunks of content" do
|
124
|
-
expect(chunks.inject("", :+)).to eq "a" * 16 * 1024 + "b" * 10 * 1024
|
124
|
+
expect(chunks.inject("", :+)).to eq ("a" * 16 * 1024) + ("b" * 10 * 1024)
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
@@ -148,7 +148,7 @@ RSpec.describe HTTP::Request::Body do
|
|
148
148
|
end
|
149
149
|
|
150
150
|
context "when body is an Enumerable IO" do
|
151
|
-
let(:data) { "a" * 16 * 1024 + "b" * 10 * 1024 }
|
151
|
+
let(:data) { ("a" * 16 * 1024) + ("b" * 10 * 1024) }
|
152
152
|
let(:body) { StringIO.new data }
|
153
153
|
|
154
154
|
it "yields chunks of content" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: http
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.0.
|
4
|
+
version: 5.0.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tony Arcieri
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2021-
|
14
|
+
date: 2021-10-06 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: addressable
|
@@ -191,7 +191,7 @@ metadata:
|
|
191
191
|
source_code_uri: https://github.com/httprb/http
|
192
192
|
wiki_uri: https://github.com/httprb/http/wiki
|
193
193
|
bug_tracker_uri: https://github.com/httprb/http/issues
|
194
|
-
changelog_uri: https://github.com/httprb/http/blob/v5.0.
|
194
|
+
changelog_uri: https://github.com/httprb/http/blob/v5.0.3/CHANGES.md
|
195
195
|
post_install_message:
|
196
196
|
rdoc_options: []
|
197
197
|
require_paths:
|