http 2.2.2 → 3.0.0.pre
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/.rubocop.yml +46 -13
- data/.travis.yml +17 -12
- data/CHANGES.md +25 -1
- data/Gemfile +11 -4
- data/Guardfile +2 -0
- data/README.md +4 -5
- data/Rakefile +14 -13
- data/http.gemspec +3 -1
- data/lib/http.rb +1 -0
- data/lib/http/chainable.rb +15 -14
- data/lib/http/client.rb +27 -24
- data/lib/http/connection.rb +6 -4
- data/lib/http/content_type.rb +1 -0
- data/lib/http/errors.rb +3 -2
- data/lib/http/feature.rb +2 -1
- data/lib/http/features/auto_deflate.rb +77 -20
- data/lib/http/features/auto_inflate.rb +2 -1
- data/lib/http/headers.rb +3 -2
- data/lib/http/headers/known.rb +23 -22
- data/lib/http/headers/mixin.rb +1 -0
- data/lib/http/mime_type.rb +1 -0
- data/lib/http/mime_type/adapter.rb +2 -1
- data/lib/http/mime_type/json.rb +2 -1
- data/lib/http/options.rb +15 -12
- data/lib/http/redirector.rb +4 -3
- data/lib/http/request.rb +25 -10
- data/lib/http/request/body.rb +67 -0
- data/lib/http/request/writer.rb +32 -37
- data/lib/http/response.rb +17 -2
- data/lib/http/response/body.rb +16 -12
- data/lib/http/response/parser.rb +1 -0
- data/lib/http/response/status.rb +1 -0
- data/lib/http/response/status/reasons.rb +1 -0
- data/lib/http/timeout/global.rb +1 -0
- data/lib/http/timeout/null.rb +2 -1
- data/lib/http/timeout/per_operation.rb +19 -6
- data/lib/http/uri.rb +8 -2
- data/lib/http/version.rb +1 -1
- data/spec/lib/http/client_spec.rb +104 -4
- data/spec/lib/http/content_type_spec.rb +1 -0
- data/spec/lib/http/features/auto_deflate_spec.rb +32 -64
- data/spec/lib/http/features/auto_inflate_spec.rb +1 -0
- data/spec/lib/http/headers/mixin_spec.rb +1 -0
- data/spec/lib/http/headers_spec.rb +36 -35
- data/spec/lib/http/options/body_spec.rb +1 -0
- data/spec/lib/http/options/features_spec.rb +1 -0
- data/spec/lib/http/options/form_spec.rb +1 -0
- data/spec/lib/http/options/headers_spec.rb +2 -1
- data/spec/lib/http/options/json_spec.rb +1 -0
- data/spec/lib/http/options/new_spec.rb +2 -1
- data/spec/lib/http/options/proxy_spec.rb +1 -0
- data/spec/lib/http/options_spec.rb +1 -0
- data/spec/lib/http/redirector_spec.rb +1 -0
- data/spec/lib/http/request/body_spec.rb +138 -0
- data/spec/lib/http/request/writer_spec.rb +44 -74
- data/spec/lib/http/request_spec.rb +14 -0
- data/spec/lib/http/response/body_spec.rb +20 -4
- data/spec/lib/http/response/status_spec.rb +27 -26
- data/spec/lib/http/response_spec.rb +10 -0
- data/spec/lib/http/uri_spec.rb +11 -0
- data/spec/lib/http_spec.rb +18 -6
- data/spec/regression_specs.rb +1 -0
- data/spec/spec_helper.rb +1 -0
- data/spec/support/black_hole.rb +9 -2
- data/spec/support/capture_warning.rb +1 -0
- data/spec/support/dummy_server.rb +2 -1
- data/spec/support/dummy_server/servlet.rb +1 -1
- data/spec/support/fakeio.rb +21 -0
- data/spec/support/http_handling_shared.rb +1 -0
- data/spec/support/proxy_server.rb +1 -0
- data/spec/support/servers/config.rb +1 -0
- data/spec/support/servers/runner.rb +1 -0
- data/spec/support/ssl_helper.rb +3 -2
- metadata +20 -9
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
RSpec.describe HTTP::Options, "headers" do
|
3
4
|
let(:opts) { HTTP::Options.new }
|
4
5
|
|
@@ -9,7 +10,7 @@ RSpec.describe HTTP::Options, "headers" do
|
|
9
10
|
it "may be specified with with_headers" do
|
10
11
|
opts2 = opts.with_headers("accept" => "json")
|
11
12
|
expect(opts.headers).to be_empty
|
12
|
-
expect(opts2.headers).to eq([%w
|
13
|
+
expect(opts2.headers).to eq([%w[Accept json]])
|
13
14
|
end
|
14
15
|
|
15
16
|
it "accepts any object that respond to :to_hash" do
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
RSpec.describe HTTP::Options, "new" do
|
3
4
|
it "supports a Options instance" do
|
4
5
|
opts = HTTP::Options.new
|
@@ -13,7 +14,7 @@ RSpec.describe HTTP::Options, "new" do
|
|
13
14
|
|
14
15
|
it "coerces :headers correctly" do
|
15
16
|
opts = HTTP::Options.new(:headers => {:accept => "json"})
|
16
|
-
expect(opts.headers).to eq([%w
|
17
|
+
expect(opts.headers).to eq([%w[Accept json]])
|
17
18
|
end
|
18
19
|
|
19
20
|
it "coerces :proxy correctly" do
|
@@ -0,0 +1,138 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe HTTP::Request::Body do
|
4
|
+
let(:body) { "" }
|
5
|
+
subject { HTTP::Request::Body.new(body) }
|
6
|
+
|
7
|
+
describe "#initialize" do
|
8
|
+
context "when body is nil" do
|
9
|
+
let(:body) { nil }
|
10
|
+
|
11
|
+
it "does not raise an error" do
|
12
|
+
expect { subject }.not_to raise_error
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context "when body is a string" do
|
17
|
+
let(:body) { "string body" }
|
18
|
+
|
19
|
+
it "does not raise an error" do
|
20
|
+
expect { subject }.not_to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when body is an IO" do
|
25
|
+
let(:body) { FakeIO.new("IO body") }
|
26
|
+
|
27
|
+
it "does not raise an error" do
|
28
|
+
expect { subject }.not_to raise_error
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
context "when body is an Enumerable" do
|
33
|
+
let(:body) { %w[bees cows] }
|
34
|
+
|
35
|
+
it "does not raise an error" do
|
36
|
+
expect { subject }.not_to raise_error
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
context "when body is of unrecognized type" do
|
41
|
+
let(:body) { 123 }
|
42
|
+
|
43
|
+
it "raises an error" do
|
44
|
+
expect { subject }.to raise_error(HTTP::RequestError)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#size" do
|
50
|
+
context "when body is nil" do
|
51
|
+
let(:body) { nil }
|
52
|
+
|
53
|
+
it "returns zero" do
|
54
|
+
expect(subject.size).to eq 0
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context "when body is a string" do
|
59
|
+
let(:body) { "Привет, мир!" }
|
60
|
+
|
61
|
+
it "returns string bytesize" do
|
62
|
+
expect(subject.size).to eq 21
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "when body is an IO with size" do
|
67
|
+
let(:body) { FakeIO.new("content") }
|
68
|
+
|
69
|
+
it "returns IO size" do
|
70
|
+
expect(subject.size).to eq 7
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context "when body is an IO without size" do
|
75
|
+
let(:body) { IO.pipe[0] }
|
76
|
+
|
77
|
+
it "raises a RequestError" do
|
78
|
+
expect { subject.size }.to raise_error(HTTP::RequestError)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "when body is an Enumerable" do
|
83
|
+
let(:body) { %w[bees cows] }
|
84
|
+
|
85
|
+
it "raises a RequestError" do
|
86
|
+
expect { subject.size }.to raise_error(HTTP::RequestError)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
describe "#each" do
|
92
|
+
let(:chunks) do
|
93
|
+
chunks = []
|
94
|
+
subject.each { |chunk| chunks << chunk.dup }
|
95
|
+
chunks
|
96
|
+
end
|
97
|
+
|
98
|
+
context "when body is nil" do
|
99
|
+
let(:body) { nil }
|
100
|
+
|
101
|
+
it "yields nothing" do
|
102
|
+
expect(chunks).to eq []
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context "when body is a string" do
|
107
|
+
let(:body) { "content" }
|
108
|
+
|
109
|
+
it "yields the string" do
|
110
|
+
expect(chunks).to eq %w[content]
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "when body is a non-Enumerable IO" do
|
115
|
+
let(:body) { FakeIO.new("a" * 16 * 1024 + "b" * 10 * 1024) }
|
116
|
+
|
117
|
+
it "yields chunks of content" do
|
118
|
+
expect(chunks.inject("", :+)).to eq "a" * 16 * 1024 + "b" * 10 * 1024
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "when body is an Enumerable IO" do
|
123
|
+
let(:body) { StringIO.new("a" * 16 * 1024 + "b" * 10 * 1024) }
|
124
|
+
|
125
|
+
it "yields chunks of content" do
|
126
|
+
expect(chunks.inject("", :+)).to eq "a" * 16 * 1024 + "b" * 10 * 1024
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
context "when body is an Enumerable" do
|
131
|
+
let(:body) { %w[bees cows] }
|
132
|
+
|
133
|
+
it "yields elements" do
|
134
|
+
expect(chunks).to eq %w[bees cows]
|
135
|
+
end
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
@@ -3,105 +3,75 @@
|
|
3
3
|
|
4
4
|
RSpec.describe HTTP::Request::Writer do
|
5
5
|
let(:io) { StringIO.new }
|
6
|
-
let(:body) { "" }
|
6
|
+
let(:body) { HTTP::Request::Body.new("") }
|
7
7
|
let(:headers) { HTTP::Headers.new }
|
8
8
|
let(:headerstart) { "GET /test HTTP/1.1" }
|
9
9
|
|
10
10
|
subject(:writer) { described_class.new(io, body, headers, headerstart) }
|
11
11
|
|
12
|
-
describe "#
|
13
|
-
context "when
|
14
|
-
let(:
|
15
|
-
|
16
|
-
it "does not raise an error" do
|
17
|
-
expect { writer }.not_to raise_error
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
context "when body is a string" do
|
22
|
-
let(:body) { "string body" }
|
23
|
-
|
24
|
-
it "does not raise an error" do
|
25
|
-
expect { writer }.not_to raise_error
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
context "when body is an Enumerable" do
|
30
|
-
let(:body) { %w(bees cows) }
|
12
|
+
describe "#stream" do
|
13
|
+
context "when multiple headers are set" do
|
14
|
+
let(:headers) { HTTP::Headers.coerce "Host" => "example.org" }
|
31
15
|
|
32
|
-
it "
|
33
|
-
|
16
|
+
it "separates headers with carriage return and line feed" do
|
17
|
+
writer.stream
|
18
|
+
expect(io.string).to eq [
|
19
|
+
"#{headerstart}\r\n",
|
20
|
+
"Host: example.org\r\nContent-Length: 0\r\n\r\n"
|
21
|
+
].join
|
34
22
|
end
|
35
23
|
end
|
36
24
|
|
37
|
-
context "when body is
|
38
|
-
let(:body) {
|
25
|
+
context "when body is nonempty" do
|
26
|
+
let(:body) { HTTP::Request::Body.new("content") }
|
39
27
|
|
40
|
-
it "
|
41
|
-
|
28
|
+
it "writes it to the socket and sets Content-Length" do
|
29
|
+
writer.stream
|
30
|
+
expect(io.string).to eq [
|
31
|
+
"#{headerstart}\r\n",
|
32
|
+
"Content-Length: 7\r\n\r\n",
|
33
|
+
"content"
|
34
|
+
].join
|
42
35
|
end
|
43
36
|
end
|
44
|
-
end
|
45
|
-
|
46
|
-
describe "#stream" do
|
47
|
-
context "when body is Enumerable" do
|
48
|
-
let(:body) { %w(bees cows) }
|
49
|
-
let(:headers) { HTTP::Headers.coerce "Transfer-Encoding" => "chunked" }
|
50
37
|
|
51
|
-
|
52
|
-
|
53
|
-
expect(io.string).to end_with "\r\n4\r\nbees\r\n4\r\ncows\r\n0\r\n\r\n"
|
54
|
-
end
|
38
|
+
context "when body is empty" do
|
39
|
+
let(:body) { HTTP::Request::Body.new(nil) }
|
55
40
|
|
56
|
-
it "
|
41
|
+
it "doesn't write anything to the socket and sets Content-Length" do
|
57
42
|
writer.stream
|
58
|
-
expect(io.string).to
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
let(:headers) { HTTP::Headers.new }
|
63
|
-
specify { expect { writer.stream }.to raise_error(HTTP::RequestError) }
|
64
|
-
end
|
65
|
-
|
66
|
-
context "when Transfer-Encoding is not chunked" do
|
67
|
-
let(:headers) { HTTP::Headers.coerce "Transfer-Encoding" => "gzip" }
|
68
|
-
specify { expect { writer.stream }.to raise_error(HTTP::RequestError) }
|
43
|
+
expect(io.string).to eq [
|
44
|
+
"#{headerstart}\r\n",
|
45
|
+
"Content-Length: 0\r\n\r\n"
|
46
|
+
].join
|
69
47
|
end
|
70
48
|
end
|
71
49
|
|
72
|
-
context "when
|
73
|
-
let(:
|
50
|
+
context "when Content-Length header is set" do
|
51
|
+
let(:headers) { HTTP::Headers.coerce "Content-Length" => "12" }
|
52
|
+
let(:body) { HTTP::Request::Body.new("content") }
|
74
53
|
|
75
|
-
it "
|
54
|
+
it "keeps the given value" do
|
76
55
|
writer.stream
|
77
|
-
expect(io.string).to
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
it "keeps given value" do
|
84
|
-
writer.stream
|
85
|
-
expect(io.string).to start_with "#{headerstart}\r\nContent-Length: 12\r\n\r\n"
|
86
|
-
end
|
56
|
+
expect(io.string).to eq [
|
57
|
+
"#{headerstart}\r\n",
|
58
|
+
"Content-Length: 12\r\n\r\n",
|
59
|
+
"content"
|
60
|
+
].join
|
87
61
|
end
|
88
62
|
end
|
89
63
|
|
90
|
-
context "when
|
91
|
-
let(:
|
64
|
+
context "when Transfer-Encoding is chunked" do
|
65
|
+
let(:headers) { HTTP::Headers.coerce "Transfer-Encoding" => "chunked" }
|
66
|
+
let(:body) { HTTP::Request::Body.new(%w[request body]) }
|
92
67
|
|
93
|
-
it "
|
68
|
+
it "writes encoded content and omits Content-Length" do
|
94
69
|
writer.stream
|
95
|
-
expect(io.string).to
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
it "keeps given value" do
|
102
|
-
writer.stream
|
103
|
-
expect(io.string).to start_with "#{headerstart}\r\nContent-Length: 12\r\n\r\n"
|
104
|
-
end
|
70
|
+
expect(io.string).to eq [
|
71
|
+
"#{headerstart}\r\n",
|
72
|
+
"Transfer-Encoding: chunked\r\n\r\n",
|
73
|
+
"7\r\nrequest\r\n4\r\nbody\r\n0\r\n\r\n"
|
74
|
+
].join
|
105
75
|
end
|
106
76
|
end
|
107
77
|
end
|
@@ -94,6 +94,20 @@ RSpec.describe HTTP::Request do
|
|
94
94
|
expect(redirected["Host"]).to eq "blog.example.com"
|
95
95
|
end
|
96
96
|
|
97
|
+
context "with URL with non-standard port given" do
|
98
|
+
subject(:redirected) { request.redirect "http://example.com:8080" }
|
99
|
+
|
100
|
+
its(:uri) { is_expected.to eq HTTP::URI.parse "http://example.com:8080" }
|
101
|
+
|
102
|
+
its(:verb) { is_expected.to eq request.verb }
|
103
|
+
its(:body) { is_expected.to eq request.body }
|
104
|
+
its(:proxy) { is_expected.to eq request.proxy }
|
105
|
+
|
106
|
+
it "presets new Host header" do
|
107
|
+
expect(redirected["Host"]).to eq "example.com:8080"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
97
111
|
context "with schema-less absolute URL given" do
|
98
112
|
subject(:redirected) { request.redirect "//another.example.com/blog" }
|
99
113
|
|
@@ -1,11 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
RSpec.describe HTTP::Response::Body do
|
3
4
|
let(:connection) { double(:sequence_id => 0) }
|
4
5
|
let(:chunks) { [String.new("Hello, "), String.new("World!")] }
|
5
6
|
|
6
|
-
before
|
7
|
+
before do
|
8
|
+
allow(connection).to receive(:readpartial) { chunks.shift }
|
9
|
+
allow(connection).to receive(:body_completed?) { chunks.empty? }
|
10
|
+
end
|
7
11
|
|
8
|
-
subject(:body)
|
12
|
+
subject(:body) { described_class.new(connection, :encoding => Encoding::UTF_8) }
|
9
13
|
|
10
14
|
it "streams bodies from responses" do
|
11
15
|
expect(subject.to_s).to eq("Hello, World!")
|
@@ -37,6 +41,18 @@ RSpec.describe HTTP::Response::Body do
|
|
37
41
|
body.readpartial
|
38
42
|
end
|
39
43
|
end
|
44
|
+
|
45
|
+
it "returns content in specified encoding" do
|
46
|
+
body = described_class.new(connection)
|
47
|
+
expect(connection).to receive(:readpartial).
|
48
|
+
and_return(String.new("content").force_encoding(Encoding::UTF_8))
|
49
|
+
expect(body.readpartial.encoding).to eq Encoding::BINARY
|
50
|
+
|
51
|
+
body = described_class.new(connection, :encoding => Encoding::UTF_8)
|
52
|
+
expect(connection).to receive(:readpartial).
|
53
|
+
and_return(String.new("content").force_encoding(Encoding::BINARY))
|
54
|
+
expect(body.readpartial.encoding).to eq Encoding::UTF_8
|
55
|
+
end
|
40
56
|
end
|
41
57
|
|
42
58
|
context "when body is gzipped" do
|
@@ -47,7 +63,7 @@ RSpec.describe HTTP::Response::Body do
|
|
47
63
|
end
|
48
64
|
subject(:body) do
|
49
65
|
inflater = HTTP::Response::Inflater.new(connection)
|
50
|
-
described_class.new(inflater, Encoding::UTF_8)
|
66
|
+
described_class.new(inflater, :encoding => Encoding::UTF_8)
|
51
67
|
end
|
52
68
|
|
53
69
|
it "decodes body" do
|
@@ -58,7 +74,7 @@ RSpec.describe HTTP::Response::Body do
|
|
58
74
|
it "streams decoded body" do
|
59
75
|
[
|
60
76
|
"Hi, HTTP ",
|
61
|
-
|
77
|
+
"here ☺",
|
62
78
|
nil
|
63
79
|
].each do |part|
|
64
80
|
expect(subject.readpartial).to eq(part)
|
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
RSpec.describe HTTP::Response::Status do
|
3
4
|
describe ".new" do
|
4
5
|
it "fails if given value does not respond to #to_i" do
|
@@ -13,7 +14,7 @@ RSpec.describe HTTP::Response::Status do
|
|
13
14
|
describe "#code" do
|
14
15
|
subject { described_class.new("200.0").code }
|
15
16
|
it { is_expected.to eq 200 }
|
16
|
-
it { is_expected.to be_a
|
17
|
+
it { is_expected.to be_a Integer }
|
17
18
|
end
|
18
19
|
|
19
20
|
describe "#reason" do
|
@@ -39,23 +40,23 @@ RSpec.describe HTTP::Response::Status do
|
|
39
40
|
subject { (100...200).map { |code| described_class.new code } }
|
40
41
|
|
41
42
|
it "is #informational?" do
|
42
|
-
expect(subject).to all
|
43
|
+
expect(subject).to all(satisfy(&:informational?))
|
43
44
|
end
|
44
45
|
|
45
46
|
it "is not #success?" do
|
46
|
-
expect(subject).to all
|
47
|
+
expect(subject).to all(satisfy { |status| !status.success? })
|
47
48
|
end
|
48
49
|
|
49
50
|
it "is not #redirect?" do
|
50
|
-
expect(subject).to all
|
51
|
+
expect(subject).to all(satisfy { |status| !status.redirect? })
|
51
52
|
end
|
52
53
|
|
53
54
|
it "is not #client_error?" do
|
54
|
-
expect(subject).to all
|
55
|
+
expect(subject).to all(satisfy { |status| !status.client_error? })
|
55
56
|
end
|
56
57
|
|
57
58
|
it "is not #server_error?" do
|
58
|
-
expect(subject).to all
|
59
|
+
expect(subject).to all(satisfy { |status| !status.server_error? })
|
59
60
|
end
|
60
61
|
end
|
61
62
|
|
@@ -63,23 +64,23 @@ RSpec.describe HTTP::Response::Status do
|
|
63
64
|
subject { (200...300).map { |code| described_class.new code } }
|
64
65
|
|
65
66
|
it "is not #informational?" do
|
66
|
-
expect(subject).to all
|
67
|
+
expect(subject).to all(satisfy { |status| !status.informational? })
|
67
68
|
end
|
68
69
|
|
69
70
|
it "is #success?" do
|
70
|
-
expect(subject).to all
|
71
|
+
expect(subject).to all(satisfy(&:success?))
|
71
72
|
end
|
72
73
|
|
73
74
|
it "is not #redirect?" do
|
74
|
-
expect(subject).to all
|
75
|
+
expect(subject).to all(satisfy { |status| !status.redirect? })
|
75
76
|
end
|
76
77
|
|
77
78
|
it "is not #client_error?" do
|
78
|
-
expect(subject).to all
|
79
|
+
expect(subject).to all(satisfy { |status| !status.client_error? })
|
79
80
|
end
|
80
81
|
|
81
82
|
it "is not #server_error?" do
|
82
|
-
expect(subject).to all
|
83
|
+
expect(subject).to all(satisfy { |status| !status.server_error? })
|
83
84
|
end
|
84
85
|
end
|
85
86
|
|
@@ -87,23 +88,23 @@ RSpec.describe HTTP::Response::Status do
|
|
87
88
|
subject { (300...400).map { |code| described_class.new code } }
|
88
89
|
|
89
90
|
it "is not #informational?" do
|
90
|
-
expect(subject).to all
|
91
|
+
expect(subject).to all(satisfy { |status| !status.informational? })
|
91
92
|
end
|
92
93
|
|
93
94
|
it "is not #success?" do
|
94
|
-
expect(subject).to all
|
95
|
+
expect(subject).to all(satisfy { |status| !status.success? })
|
95
96
|
end
|
96
97
|
|
97
98
|
it "is #redirect?" do
|
98
|
-
expect(subject).to all
|
99
|
+
expect(subject).to all(satisfy(&:redirect?))
|
99
100
|
end
|
100
101
|
|
101
102
|
it "is not #client_error?" do
|
102
|
-
expect(subject).to all
|
103
|
+
expect(subject).to all(satisfy { |status| !status.client_error? })
|
103
104
|
end
|
104
105
|
|
105
106
|
it "is not #server_error?" do
|
106
|
-
expect(subject).to all
|
107
|
+
expect(subject).to all(satisfy { |status| !status.server_error? })
|
107
108
|
end
|
108
109
|
end
|
109
110
|
|
@@ -111,23 +112,23 @@ RSpec.describe HTTP::Response::Status do
|
|
111
112
|
subject { (400...500).map { |code| described_class.new code } }
|
112
113
|
|
113
114
|
it "is not #informational?" do
|
114
|
-
expect(subject).to all
|
115
|
+
expect(subject).to all(satisfy { |status| !status.informational? })
|
115
116
|
end
|
116
117
|
|
117
118
|
it "is not #success?" do
|
118
|
-
expect(subject).to all
|
119
|
+
expect(subject).to all(satisfy { |status| !status.success? })
|
119
120
|
end
|
120
121
|
|
121
122
|
it "is not #redirect?" do
|
122
|
-
expect(subject).to all
|
123
|
+
expect(subject).to all(satisfy { |status| !status.redirect? })
|
123
124
|
end
|
124
125
|
|
125
126
|
it "is #client_error?" do
|
126
|
-
expect(subject).to all
|
127
|
+
expect(subject).to all(satisfy(&:client_error?))
|
127
128
|
end
|
128
129
|
|
129
130
|
it "is not #server_error?" do
|
130
|
-
expect(subject).to all
|
131
|
+
expect(subject).to all(satisfy { |status| !status.server_error? })
|
131
132
|
end
|
132
133
|
end
|
133
134
|
|
@@ -135,23 +136,23 @@ RSpec.describe HTTP::Response::Status do
|
|
135
136
|
subject { (500...600).map { |code| described_class.new code } }
|
136
137
|
|
137
138
|
it "is not #informational?" do
|
138
|
-
expect(subject).to all
|
139
|
+
expect(subject).to all(satisfy { |status| !status.informational? })
|
139
140
|
end
|
140
141
|
|
141
142
|
it "is not #success?" do
|
142
|
-
expect(subject).to all
|
143
|
+
expect(subject).to all(satisfy { |status| !status.success? })
|
143
144
|
end
|
144
145
|
|
145
146
|
it "is not #redirect?" do
|
146
|
-
expect(subject).to all
|
147
|
+
expect(subject).to all(satisfy { |status| !status.redirect? })
|
147
148
|
end
|
148
149
|
|
149
150
|
it "is not #client_error?" do
|
150
|
-
expect(subject).to all
|
151
|
+
expect(subject).to all(satisfy { |status| !status.client_error? })
|
151
152
|
end
|
152
153
|
|
153
154
|
it "is #server_error?" do
|
154
|
-
expect(subject).to all
|
155
|
+
expect(subject).to all(satisfy(&:server_error?))
|
155
156
|
end
|
156
157
|
end
|
157
158
|
|