typhoeus 1.1.2 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 905784a1cba9775195bba5751eac56a93e29c313
4
- data.tar.gz: 7802bff9112dfe764bee3ef0a5620988e1f5c23e
3
+ metadata.gz: df7045af2adbad5bf0b5bc883e8bc259a2f63544
4
+ data.tar.gz: 16d738d8b00c774fe54a78c32becde597ad69569
5
5
  SHA512:
6
- metadata.gz: a135cd5834f863538735ee0c971b26fb83141a9da7e74be98678c331b1cfba97c2cb22ec163b1eb85b95fae18055288c4e0c21e34d45780b264922db2f5415dd
7
- data.tar.gz: 1218163c756609a25e0635d6e390d38c474035fcb7a1077ef748248d218fbb97b3373234d5006a018bb9a45fd458b40202029db9790ed887952e2ecef3072f77
6
+ metadata.gz: c5f8427b91d383cd94bc48c4f944b3bc7dbce619e0eccda0f84d428eb575ff9f7b65530f18789cb1aa99f02e4f03293af9987cffb12686542af13b9fb49bba51
7
+ data.tar.gz: e01422dc678ff40ac31b695bc1dea8d0c3b843e0ecd2ad61fa386d9b290a0950db93e37289215aedaee3aad60a7cc2acd48efc4baf59ae4fc96f3198d5df460a
@@ -9,6 +9,7 @@ rvm:
9
9
  - 2.1.8
10
10
  - 2.2.4
11
11
  - 2.3.0
12
+ - 2.4.1
12
13
  - ruby-head
13
14
  - jruby-head
14
15
  - jruby-18mode
@@ -6,7 +6,7 @@ module Typhoeus
6
6
  # Values can be strings (normal case) or arrays of strings (for duplicates headers)
7
7
  #
8
8
  # @api private
9
- class Header < Hash
9
+ class Header < DelegateClass(Hash)
10
10
 
11
11
  # Create a new header.
12
12
  #
@@ -15,10 +15,14 @@ module Typhoeus
15
15
  #
16
16
  # @param [ String ] raw The raw header.
17
17
  def initialize(raw)
18
+ super({})
18
19
  @raw = raw
19
20
  @sanitized = {}
20
21
  parse
21
- set_default_proc_on(self, lambda { |h, k| @sanitized[k.to_s.downcase] })
22
+ end
23
+
24
+ def [](key)
25
+ fetch(key) { @sanitized[key.to_s.downcase] }
22
26
  end
23
27
 
24
28
  # Parses the raw header.
@@ -32,9 +36,9 @@ module Typhoeus
32
36
  process_pair(k, v)
33
37
  end
34
38
  when String
35
- raw.lines.each do |header|
39
+ raw.split(/\r?\n(?!\s)/).each do |header|
36
40
  header.strip!
37
- next if header.empty? || header.start_with?( 'HTTP/1.' )
41
+ next if header.empty? || header.start_with?( 'HTTP/' )
38
42
  process_line(header)
39
43
  end
40
44
  end
@@ -47,7 +51,7 @@ module Typhoeus
47
51
  # @return [ void ]
48
52
  def process_line(header)
49
53
  key, value = header.split(':', 2)
50
- process_pair(key.strip, value.strip)
54
+ process_pair(key.strip, (value ? value.strip.gsub(/\r?\n\s*/, ' ') : ''))
51
55
  end
52
56
 
53
57
  # Sets key value pair for self and @sanitized.
@@ -47,9 +47,13 @@ module Typhoeus
47
47
  def response_headers
48
48
  return options[:response_headers] if options[:response_headers]
49
49
  if mock? && h = options[:headers]
50
- h.map{ |k,v| [k, v.respond_to?(:join) ? v.join : v] }.
51
- map{ |e| "#{e.first}: #{e.last}" }.
52
- join("\r\n")
50
+ status_code = return_code || "200"
51
+ reason_phrase = status_code == "200" ? "OK" : "Mock Reason Phrase"
52
+ status_line = "HTTP/1.1 #{status_code} #{reason_phrase}"
53
+ actual_headers = h.map{ |k,v| [k, v.respond_to?(:join) ? v.join(',') : v] }.
54
+ map{ |e| "#{e.first}: #{e.last}" }
55
+
56
+ [status_line, *actual_headers].join("\r\n")
53
57
  end
54
58
  end
55
59
 
@@ -46,7 +46,18 @@ module Typhoeus
46
46
  #
47
47
  # @return [ Boolean ] Return true if successful, false else.
48
48
  def success?
49
- (mock || return_code == :ok) && response_code && response_code >= 200 && response_code < 300
49
+ (mock || return_code == :ok) && response_code && has_good_response_code?
50
+ end
51
+
52
+ # Return wether the response is a failure.
53
+ #
54
+ # @example Return if the response was failed.
55
+ # response.failure?
56
+ #
57
+ # @return [ Boolean ] Return true if failure, false else.
58
+
59
+ def failure?
60
+ (mock || return_code == :internal_server_error) && response_code && has_bad_response_code?
50
61
  end
51
62
 
52
63
  # Return wether the response is modified.
@@ -81,6 +92,16 @@ module Typhoeus
81
92
  end
82
93
  end
83
94
  end
95
+
96
+ # :nodoc:
97
+ def has_good_response_code?
98
+ response_code >= 200 && response_code < 300
99
+ end
100
+
101
+ # :nodoc:
102
+ def has_bad_response_code?
103
+ !has_good_response_code?
104
+ end
84
105
  end
85
106
  end
86
107
  end
@@ -1,5 +1,5 @@
1
1
  module Typhoeus
2
2
 
3
3
  # The current Typhoeus version.
4
- VERSION = '1.1.2'
4
+ VERSION = '1.3.0'
5
5
  end
@@ -55,7 +55,7 @@ describe Typhoeus::Response::Header do
55
55
  Server: gws
56
56
  X-XSS-Protection: 1; mode=block
57
57
  X-Frame-Options: SAMEORIGIN
58
- Transfer-Encoding: chunked'
58
+ Transfer-Encoding: chunked'.gsub(/^\s{8}/, '')
59
59
  end
60
60
 
61
61
  it "sets raw" do
@@ -93,18 +93,55 @@ describe Typhoeus::Response::Header do
93
93
  end
94
94
  end
95
95
 
96
- context 'includes line with only whitespace' do
97
- let(:raw) do
98
- 'HTTP/1.1 200 OK
99
- Date: Fri, 29 Jun 2012 10:09:23 GMT
96
+ context 'includes a multi-line header' do
97
+ let(:raw) do
98
+ 'HTTP/1.1 200 OK
99
+ Date: Fri, 29 Jun 2012 10:09:23 GMT
100
+ Content-Security-Policy: default-src "self";
101
+ img-src * data: "self";
102
+ upgrade-insecure-requests;'.gsub(/^\s{10}/, '')
103
+ end
100
104
 
101
- '
105
+ it "joins header parts" do
106
+ expect(header).to eq({
107
+ 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT',
108
+ 'Content-Security-Policy' => 'default-src "self"; img-src * data: "self"; upgrade-insecure-requests;'
109
+ })
110
+ end
111
+ end
112
+
113
+ context 'includes line with only whitespace' do
114
+ let(:raw) do
115
+ 'HTTP/1.1 200 OK
116
+ Date: Fri, 29 Jun 2012 10:09:23 GMT
117
+
118
+ '.gsub(/^\s{10}/, '')
102
119
  end
103
120
 
104
121
  it 'ignores it' do
105
122
  expect(header).to eq({ 'Date' => 'Fri, 29 Jun 2012 10:09:23 GMT' })
106
123
  end
107
124
  end
125
+
126
+ context 'with broken headers' do
127
+ let(:raw) do
128
+ 'HTTP/1.1 200 OK
129
+ Date:
130
+ Content-Type
131
+ '.gsub(/^\s{10}/, '')
132
+ end
133
+
134
+ it 'returns empty string for invalid headers' do
135
+ expect(header.to_hash).to include({ 'Date' => '', 'Content-Type' => '' })
136
+ end
137
+ end
108
138
  end
109
139
  end
140
+
141
+ it "can be Marshal'd" do
142
+ header = Typhoeus::Response::Header.new("Foo: Bar")
143
+ expect {
144
+ Marshal.dump(header)
145
+ }.not_to raise_error
146
+ end
110
147
  end
@@ -74,6 +74,17 @@ describe Typhoeus::Response::Informations do
74
74
  expect(response.response_headers).to include("\r\n")
75
75
  end
76
76
  end
77
+
78
+ context "when multiple values for a header" do
79
+ let(:options) { { :mock => true, :headers => {"Length" => 1, "Content-Type" => "text/plain", "set-cookie" => ["cookieone=one","cookietwo=two"] } } }
80
+
81
+ it "constructs response_headers" do
82
+ expect(response.response_headers).to include("Length: 1")
83
+ expect(response.response_headers).to include("Content-Type: text/plain")
84
+ expect(response.response_headers).to include("set-cookie: cookieone=one,cookietwo=two")
85
+ expect(response.response_headers).to include("\r\n")
86
+ end
87
+ end
77
88
  end
78
89
  end
79
90
  end
@@ -232,7 +243,7 @@ describe Typhoeus::Response::Informations do
232
243
  end
233
244
 
234
245
  it "returns headers" do
235
- expect(response.headers).to include("Length" => "1")
246
+ expect(response.headers.to_hash).to include("Length" => "1")
236
247
  end
237
248
  end
238
249
  end
@@ -128,6 +128,60 @@ describe Typhoeus::Response::Status do
128
128
  end
129
129
  end
130
130
 
131
+ describe "#failure?" do
132
+ context "when response code between 300-526 and 100-300" do
133
+ let(:options) { {:return_code => return_code, :response_code => 300} }
134
+
135
+ context "when mock" do
136
+ before { response.mock = true }
137
+
138
+ context "when return_code :internal_server_error" do
139
+ let(:return_code) { :internal_server_error }
140
+
141
+ it "returns true" do
142
+ expect(response.failure?).to be_truthy
143
+ end
144
+ end
145
+
146
+ context "when return_code nil" do
147
+ let(:return_code) { nil }
148
+
149
+ it "returns true" do
150
+ expect(response.failure?).to be_truthy
151
+ end
152
+ end
153
+ end
154
+
155
+ context "when no mock" do
156
+ before { response.mock = nil }
157
+
158
+ context "when return_code :internal_server_error" do
159
+ let(:return_code) { :internal_server_error }
160
+
161
+ it "returns true" do
162
+ expect(response.failure?).to be_truthy
163
+ end
164
+ end
165
+
166
+ context "when return_code nil" do
167
+ let(:return_code) { nil }
168
+
169
+ it "returns false" do
170
+ expect(response.failure?).to be_falsey
171
+ end
172
+ end
173
+ end
174
+ end
175
+
176
+ context "when response code is not 300-526" do
177
+ let(:options) { {:return_code => :ok, :response_code => 200} }
178
+
179
+ it "returns false" do
180
+ expect(response.failure?).to be_falsey
181
+ end
182
+ end
183
+ end
184
+
131
185
  describe "#modified?" do
132
186
  context "when response code 304" do
133
187
  let(:options) { {:return_code => :ok, :response_code => 304} }
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typhoeus
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Balatero
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-12-02 00:00:00.000000000 Z
13
+ date: 2017-08-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: ethon