patron 0.7.1 → 0.8.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: 6204d4c97ae0f3c4c096fb8dddef4b7d46a2da8c
4
- data.tar.gz: c424a82c114d4720863e0b60563c4fc98f9dcecb
3
+ metadata.gz: 9e89c04473c18143c350dcbbbf6f98b1c66b2e7e
4
+ data.tar.gz: 5a019a6f724c14056f949eb4fafb538454b959c6
5
5
  SHA512:
6
- metadata.gz: 0dcb73a87308df2a7230569762365bfa9da0e76658b1ee5b609c9c0b4dda31aa34e722adba99892ec3dfbd5cc2a58ca45e14882c3c33b495e498f4fe269e1159
7
- data.tar.gz: 0a433dfd1c155ae7c05e570052d50ecf9e442c149c66a3e9e9bed1ea1746ee214ce27b31a84f3ea29ccbff8230a46b4272f045ea8038c1ec6e5d229bf7705ad6
6
+ metadata.gz: 6468281adbd09ad4cbc02eaaa64c36926e108ecd6c9b7a38ffcf8223e5c9930147197c858dac1d30b0f728ece4065f97f32604e07f4016036363b5e110f30ce6
7
+ data.tar.gz: 897c874cf04b2f3d8fa5e327a5cc78bd86d3ba4a6b27828812c67bc3433cdc0d4c4e6bad266ef655a9349d8f7d711cd95d60bd8c166ede3c8456c788fcc21197
@@ -2,5 +2,6 @@ rvm:
2
2
  - 1.9.3
3
3
  - 2.1.5
4
4
  - 2.2.2
5
+ - 2.3.0
5
6
  sudo: false
6
7
  cache: bundler
@@ -0,0 +1 @@
1
+ --markup markdown
@@ -1,3 +1,11 @@
1
+ ### 0.8.0
2
+
3
+ * Add `Response#inspectable_body`, `Response#decoded_body`. `decoded_body` will atempt to decode
4
+ the HTTP response into your internal encoding, using the charset header that the server has
5
+ provided. Note that this operation may fail - if the server said that the body is in a certain
6
+ encoding, but this is then overridden with, say, `meta` elements in the HTML Patron is _not_
7
+ going to parse the HTML to figure out how to decode.
8
+
1
9
  ### 0.7.0
2
10
 
3
11
  * Allow Ruby File objects to be passed as `data` to `Session#put`, `Sesion#post` etc.
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- patron (0.7.1)
4
+ patron (0.8.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -31,29 +31,38 @@ module Patron
31
31
 
32
32
  # Gets raised when the URL passed to Patron used a protocol that it does not support.
33
33
  # This most likely the result of a misspelled protocol string.
34
- class UnsupportedProtocol < Error; end
34
+ class UnsupportedProtocol < Error; end
35
35
 
36
36
  # Gets raised when a request is attempted with an unsupported SSL version.
37
- class UnsupportedSSLVersion < Error; end
37
+ class UnsupportedSSLVersion < Error; end
38
38
 
39
39
  # Gets raised when the URL was not properly formatted.
40
- class URLFormatError < Error; end
40
+ class URLFormatError < Error; end
41
41
 
42
42
  # Gets raised when the remote host name could not be resolved.
43
- class HostResolutionError < Error; end
43
+ class HostResolutionError < Error; end
44
44
 
45
45
  # Gets raised when failing to connect to the remote host.
46
- class ConnectionFailed < Error; end
46
+ class ConnectionFailed < Error; end
47
47
 
48
48
  # Gets raised when the response was shorter or larger than expected.
49
49
  # This happens when the server first reports an expected transfer size,
50
50
  # and then delivers data that doesn't match the previously given size.
51
- class PartialFileError < Error; end
51
+ class PartialFileError < Error; end
52
52
 
53
53
  # Gets raised on an operation timeout. The specified time-out period was reached.
54
- class TimeoutError < Error; end
54
+ class TimeoutError < Error; end
55
55
 
56
56
  # Gets raised on too many redirects. When following redirects, Patron hit the maximum amount.
57
- class TooManyRedirects < Error; end
57
+ class TooManyRedirects < Error; end
58
58
 
59
+ # Gets raised when the server specifies an encoding that could not be found, or has an invalid name,
60
+ # or when the server "lies" about the encoding of the response body (such as can be the case
61
+ # when the server specifies an encoding in `Content-Type`) which the HTML generator then overrides
62
+ # with a `meta` element.
63
+ class HeaderCharsetInvalid < Error; end
64
+
65
+ # Gets raised when you try to use `decoded_body` but it can't
66
+ # be represented by your Ruby process's current internal encoding
67
+ class NonRepresentableBody < HeaderCharsetInvalid; end
59
68
  end
@@ -28,6 +28,8 @@ module Patron
28
28
 
29
29
  # Represents the response from the HTTP server.
30
30
  class Response
31
+ include ResponseDecoding
32
+
31
33
  # @return [String] the original URL used to perform the request (contains the final URL after redirects)
32
34
  attr_reader :url
33
35
 
@@ -40,14 +42,16 @@ module Patron
40
42
  # @return [Fixnum] how many redirects were followed when fulfilling this request
41
43
  attr_reader :redirect_count
42
44
 
43
- # @return [String, nil] the response body, or nil if the response was written directly to a file
45
+ # @return [String, nil] the response body as a String encoded as `Encoding::BINARY` or
46
+ # or `nil` if the response was written directly to a file
44
47
  attr_reader :body
45
-
48
+
46
49
  # @return [Hash] the response headers. If there were multiple headers received for the same value
47
50
  # (like "Cookie"), the header values will be within an Array under the key for the header, in order.
48
51
  attr_reader :headers
49
52
 
50
- # @return [String] the recognized name of the charset for the response
53
+ # @return [String] the recognized name of the charset for the response. The name is not checked
54
+ # to be a valid charset name, just stored. To check the charset for validity, use #body_decodable?
51
55
  attr_reader :charset
52
56
 
53
57
  # Overridden so that the output is shorter and there is no response body printed
@@ -56,24 +60,15 @@ module Patron
56
60
  "#<Patron::Response @status_line='#{@status_line}'>"
57
61
  end
58
62
 
59
- def initialize(url, status, redirect_count, header_data, body, default_charset = nil)
60
- # Don't let a response clear out the default charset, which would cause encoding to fail
61
- default_charset = "ASCII-8BIT" unless default_charset
62
- @url = url
63
+ def initialize(url, status, redirect_count, raw_header_data, body, default_charset = nil)
64
+ @url = url.force_encoding(Encoding::ASCII) # the URL is always an ASCII subset, _always_.
63
65
  @status = status
64
66
  @redirect_count = redirect_count
65
- @body = body
66
-
67
- @charset = determine_charset(header_data, body) || default_charset
68
-
69
- [url, header_data].each do |attr|
70
- convert_to_default_encoding!(attr)
71
- end
67
+ @body = body.force_encoding(Encoding::BINARY) if body
72
68
 
69
+ header_data = decode_header_data(raw_header_data)
73
70
  parse_headers(header_data)
74
- if @headers["Content-Type"] && @headers["Content-Type"][0, 5] == "text/"
75
- convert_to_default_encoding!(@body)
76
- end
71
+ @charset = charset_from_content_type
77
72
  end
78
73
 
79
74
  # Tells whether the HTTP response code is less than 400
@@ -90,30 +85,58 @@ module Patron
90
85
  status >= 400
91
86
  end
92
87
 
93
- private
94
-
95
- def determine_charset(header_data, body)
96
- header_data.match(charset_regex) || (body && body.match(charset_regex))
97
-
98
- charset = $1
99
- validate_charset(charset) ? charset : nil
88
+ # Tells whether the response body can be decoded losslessly into the curren internal encoding
89
+ #
90
+ # @return [Boolean] true if the body is decodable, false if otherwise
91
+ def body_decodable?
92
+ return true if @body.nil?
93
+ return true if decoded_body
94
+ rescue HeaderCharsetInvalid, NonRepresentableBody
95
+ false
100
96
  end
101
97
 
102
- def charset_regex
103
- /(?:charset|encoding)="?([a-z0-9-]+)"?/i
98
+ # Returns the response body converted into the Ruby process internal encoding (the one set as `Encoding.default_internal`).
99
+ # As the response gets returned, the response body is not assumed to be in any encoding whatsoever - it will be explicitly
100
+ # set to `Encoding::BINARY` (as if you were reading a file in binary mode).
101
+ #
102
+ # When you call `decoded_body`, the method will
103
+ # look at the `Content-Type` response header, and check if that header specified a charset. If it did, the method will then
104
+ # check whether the specified charset is valid (whether it is possible to find a matching `Encoding` class in the VM).
105
+ # Once that succeeds, the method will check whether the response body _is_ in the encoding that the server said it is.
106
+ #
107
+ # This might not be the case - you can, for instance, easily serve an HTML document with a UTF-8 header (with the header
108
+ # being configured somewhere on the webserver level) and then have the actual HTML document override it with a
109
+ # `meta` element or `charset` containing an overriding charset. However, parsing the response body is outside of scope for
110
+ # Patron, so if this situation happens (the server sets a charset in the header but this header does not match what the server
111
+ # actually sends in the body) you will get an exception stating this is a problem.
112
+ #
113
+ # The next step is actually converting the body to the internal Ruby encoding. That stage may raise an exception as well, if
114
+ # you are using an internal encoding which can't represent the response body faithfully. For example, if you run Ruby with
115
+ # a CJK internal encoding, and the response you are trying to decode uses Greek characters and is UTF-8, you are going to
116
+ # get an exception since it is impossible to coerce those characters to your internal encoding.
117
+ #
118
+ # @raise {Patron::HeaderCharsetInvalid} when the server supplied a wrong or incorrect charset, {Patron::NonRepresentableBody}
119
+ # when unable to decode the body into the current process encoding.
120
+ # @return [String, nil]
121
+ def decoded_body
122
+ return unless @body
123
+ @decoded_body ||= decode_body(true)
104
124
  end
105
-
106
- def validate_charset(charset)
107
- charset && Encoding.find(charset) && true
108
- rescue ArgumentError
109
- false
125
+
126
+ # Works the same as `decoded_body`, with one substantial difference: characters which can't be represented
127
+ # in your process' default encoding are going to be replaced with question marks. This can be used for raising
128
+ # errors when you receive responses which indicate errors on the server you are calling. For example, if you expect
129
+ # a binary download, and the server sends you an error message and you don't really want to bother figuring out
130
+ # the encoding it has - but you need to append this response to an error log or similar.
131
+ #
132
+ # @see Patron::Response#decoded_body
133
+ # @return [String, nil]
134
+ def inspectable_body
135
+ return unless @body
136
+ @inspectable_body ||= decode_body(false)
110
137
  end
111
138
 
112
- def convert_to_default_encoding!(str)
113
- if str.respond_to?(:encode) && Encoding.default_internal
114
- str.force_encoding(charset).encode!(Encoding.default_internal)
115
- end
116
- end
139
+ private
117
140
 
118
141
  # Called by the C code to parse and set the headers
119
142
  def parse_headers(header_data)
@@ -138,6 +161,5 @@ module Patron
138
161
  end
139
162
  end
140
163
  end
141
-
142
164
  end
143
165
  end
@@ -0,0 +1,128 @@
1
+ ## -------------------------------------------------------------------
2
+ ##
3
+ ## Patron HTTP Client: Response class
4
+ ## Copyright (c) 2008 The Hive http://www.thehive.com/
5
+ ##
6
+ ## Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ ## of this software and associated documentation files (the "Software"), to deal
8
+ ## in the Software without restriction, including without limitation the rights
9
+ ## to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ ## copies of the Software, and to permit persons to whom the Software is
11
+ ## furnished to do so, subject to the following conditions:
12
+ ##
13
+ ## The above copyright notice and this permission notice shall be included in
14
+ ## all copies or substantial portions of the Software.
15
+ ##
16
+ ## THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ ## IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ ## FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ ## AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ ## LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ ## OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ ## THE SOFTWARE.
23
+ ##
24
+ ## -------------------------------------------------------------------
25
+
26
+
27
+ module Patron
28
+ # Contains methods used for decoding the HTTP response body. These are only ever used internally
29
+ # by the Response class.
30
+ module ResponseDecoding
31
+
32
+ private
33
+
34
+ CHARSET_CONTENT_TYPE_RE = /(?:charset|encoding)="?([a-z0-9-]+)"?/i.freeze
35
+
36
+ MISREPORTED_ENCODING_ERROR = <<-EOF
37
+ The server stated that the response has the charset matching %{declared}, but the actual
38
+ response body failed to decode as such (not flagged as `valid_encoding?')
39
+ Maybe the response body has a different encoding than suggested by the
40
+ server, or a binary response has been tagged by the server as text by mistake.
41
+ If you are performing requests against servers that are known to report wrong or invalid charsets, use
42
+ `Response#body' instead and handle the character set coercion externally. For instance, you may elect to parse
43
+ the resulting HTML/XML for charset declarations.
44
+ EOF
45
+
46
+ INVALID_CHARSET_NAME_ERROR = <<-EOF
47
+ The server specified an invalid charset in the Content-Type header (%{content_type}), \
48
+ or Ruby does not support this charset. If you are performing requests against servers \
49
+ that are known to report wrong or invalid charsets, use 'Response#body` instead \
50
+ and handle the character set coercion at call site.
51
+ EOF
52
+
53
+ INTERNAL_CHARSET_MISMATCH_ERROR = <<-EOF
54
+ The response body is %{source_encoding}, but the current \
55
+ `Encoding.default_internal' (or the encoding for a new empty string if you never \
56
+ set `Encoding.default_internal') - %{target_encoding} - cannot be used to represent the response body in \
57
+ a lossless way. Your options are:
58
+ a) using `Response#body' instead
59
+ b) switching your Ruby process to an encoding that supports the needed repertoire
60
+ c) using `Response#inspectable_body' to convert the body in a lossy way
61
+ EOF
62
+
63
+ def decode_body(strict)
64
+ # Try to detect the body encoding from headers
65
+ body_encoding = encoding_from_headers_or_binary
66
+
67
+ # See if the body actually _is_ in this encoding.
68
+ encoding_matched = @body.force_encoding(body_encoding).valid_encoding?
69
+ if !encoding_matched
70
+ raise HeaderCharsetInvalid, MISREPORTED_ENCODING_ERROR % {declared: body_encoding}
71
+ end
72
+
73
+ if strict
74
+ convert_encoding_and_raise(@body)
75
+ else
76
+ @body.encode(internal_encoding, :undefined => :replace, :replace => '?')
77
+ end
78
+ end
79
+
80
+ def convert_encoding_and_raise(str)
81
+ internal = internal_encoding
82
+ str.encode(internal)
83
+ rescue Encoding::UndefinedConversionError => e
84
+ enc = str.encoding == Encoding::BINARY ? 'binary' : str.encoding.to_s
85
+ raise NonRepresentableBody,
86
+ INTERNAL_CHARSET_MISMATCH_ERROR % {source_encoding: enc, target_encoding: internal}
87
+ end
88
+
89
+ def charset_from_content_type
90
+ return $1 if @headers["Content-Type"].to_s =~ CHARSET_CONTENT_TYPE_RE
91
+ end
92
+
93
+ def encoding_from_headers_or_binary
94
+ return Encoding::BINARY unless charset_name = charset_from_content_type
95
+ Encoding.find(charset_name)
96
+ rescue ArgumentError => e # invalid charset name
97
+ raise HeaderCharsetInvalid,
98
+ INVALID_CHARSET_NAME_ERROR % {content_type: @headers['Content-Type'].inspect}
99
+ end
100
+
101
+ def internal_encoding
102
+ # Use a trick here - instead of using `default_internal` we will create
103
+ # an empty string, and then get it's encoding instead. For example, this holds
104
+ # true on 2.1+ on OSX:
105
+ #
106
+ # Encoding.default_internal #=> nil
107
+ # ''.encoding #=> #<Encoding:UTF-8>
108
+ Encoding.default_internal || ''.encoding
109
+ end
110
+
111
+ def decode_header_data(str)
112
+ # Header data is tricky. Strictly speaking, it _must_ be ISO-encoded. However, Content-Disposition
113
+ # sometimes gets sent as raw UTF8 - and most browsers (except for localized IE versions on Windows)
114
+ # treat it as such. So a fallback chain of 8859-1->UTF8->binary seems the most sane.
115
+ tries = [Encoding::ISO8859_1, Encoding::UTF_8, Encoding::BINARY]
116
+ tries.each do |possible_enc|
117
+ begin
118
+ return str.encode(possible_enc)
119
+ rescue ::Encoding::UndefinedConversionError
120
+ next
121
+ end
122
+ end
123
+ str # if it doesn't encode, just give back what we got
124
+ end
125
+ end
126
+
127
+ private_constant :ResponseDecoding if respond_to?(:private_constant)
128
+ end
@@ -27,6 +27,7 @@
27
27
  require 'uri'
28
28
  require 'patron/error'
29
29
  require 'patron/request'
30
+ require 'patron/response_decoding'
30
31
  require 'patron/response'
31
32
  require 'patron/session_ext'
32
33
  require 'patron/util'
@@ -347,9 +348,9 @@ module Patron
347
348
  # the Request object, and not it's public methods.
348
349
  #
349
350
  # @param action[String] the HTTP verb
350
- # @paran url[#to_s] the addition to the base url component, or a complete URL
351
- # @paran headers[Hash] a hash of headers, "Accept" will be automatically set to an empty string if not provided
352
- # @paran options[Hash] any overriding options (will shadow the options from the Session object)
351
+ # @param url[#to_s] the addition to the base url component, or a complete URL
352
+ # @param headers[Hash] a hash of headers, "Accept" will be automatically set to an empty string if not provided
353
+ # @param options[Hash] any overriding options (will shadow the options from the Session object)
353
354
  # @return [Patron::Request] the request that will be passed to ++handle_request++
354
355
  def build_request(action, url, headers, options = {})
355
356
  # If the Expect header isn't set uploads are really slow
@@ -1,3 +1,3 @@
1
1
  module Patron
2
- VERSION = "0.7.1"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -32,6 +32,12 @@ require 'base64'
32
32
  require 'fileutils'
33
33
 
34
34
  describe Patron::Response do
35
+ around(:each) do |example|
36
+ previous_internal = Encoding.default_internal
37
+ example.run
38
+ Encoding.default_internal = previous_internal
39
+ end
40
+
35
41
  before(:each) do
36
42
  @session = Patron::Session.new
37
43
  @session.base_url = "http://localhost:9001"
@@ -75,47 +81,67 @@ describe Patron::Response do
75
81
  response = @session.get("/repetitiveheader")
76
82
  expect(response.headers['Set-Cookie']).to be == ["a=1","b=2"]
77
83
  end
84
+
85
+ describe '#decoded_body and #inspectable_body' do
86
+ it "should raise with explicitly binary response bodies but allow an inspectable body" do
87
+ Encoding.default_internal = Encoding::UTF_8
88
+ response = @session.get("/picture")
89
+ expect(response.headers['Content-Type']).to be == 'image/png'
90
+ expect(response.body.encoding).to be == Encoding::BINARY
91
+ expect(response).not_to be_body_decodable
92
+ expect {
93
+ response.decoded_body
94
+ }.to raise_error(Patron::NonRepresentableBody)
95
+
96
+ inspectable = response.inspectable_body
97
+ expect(inspectable.encoding).to eq(Encoding::UTF_8)
98
+ expect(inspectable).to be_valid_encoding
99
+ end
100
+
101
+ it "should encode body in the internal charset" do
102
+ allow(Encoding).to receive(:default_internal).and_return("UTF-8")
78
103
 
79
- it "should works with non-text files" do
80
- response = @session.get("/picture")
81
- expect(response.headers['Content-Type']).to be == 'image/png'
82
- expect(response.body.encoding).to be == Encoding::ASCII_8BIT
83
- end
84
-
85
- it "should not allow a default charset to be nil" do
86
- allow(Encoding).to receive(:default_internal).and_return("UTF-8")
87
- expect {
88
- Patron::Response.new("url", "status", 0, "", "", nil)
89
- }.to_not raise_error
90
- end
91
-
92
- it "should be able to serialize and deserialize itself" do
93
- expect(Marshal.load(Marshal.dump(@request))).to eql(@request)
94
- end
95
-
96
- it "should encode body in the internal charset" do
97
- allow(Encoding).to receive(:default_internal).and_return("UTF-8")
98
-
99
- greek_encoding = Encoding.find("ISO-8859-7")
100
- utf_encoding = Encoding.find("UTF-8")
104
+ greek_encoding = Encoding.find("ISO-8859-7")
105
+ utf_encoding = Encoding.find("UTF-8")
101
106
 
102
- headers = "HTTP/1.1 200 OK \r\nContent-Type: text/css\r\n"
103
- body = "charset=ISO-8859-7 Ππ".encode(greek_encoding) # Greek alphabet
107
+ headers = "HTTP/1.1 200 OK \r\nContent-Type: text/css;charset=ISO-8859-7\r\n"
108
+ body = "Ππ".encode(greek_encoding) # Greek alphabet
104
109
 
105
- response = Patron::Response.new("url", "status", 0, headers, body, nil)
110
+ response = Patron::Response.new("url", "status", 0, headers, body, nil)
106
111
 
107
- expect(response.body.encoding).to eql(utf_encoding)
112
+ expect(response).to be_body_decodable
113
+ expect(response.decoded_body.encoding).to eql(utf_encoding)
114
+ end
115
+
116
+ it "should fallback to default charset when header or body charset is not valid" do
117
+ allow(Encoding).to receive(:default_internal).and_return("UTF-8")
118
+
119
+ encoding = Encoding.find("UTF-8")
120
+ headers = "HTTP/1.1 200 OK \r\nContent-Type: text/css; charset=invalid\r\n"
121
+ body = "who knows which encoding this CSS is in?"
122
+
123
+ response = Patron::Response.new("url", "status", 0, headers, body, "UTF-8")
124
+ expect(response.charset).to eq('invalid')
125
+
126
+ expect(response).not_to be_body_decodable
127
+ expect {
128
+ response.decoded_body
129
+ }.to raise_error(Patron::HeaderCharsetInvalid)
130
+ end
108
131
  end
109
132
 
110
- it "should fallback to default charset when header or body charset is not valid" do
111
- allow(Encoding).to receive(:default_internal).and_return("UTF-8")
112
-
133
+ it "decodes a header that contains UTF-8 even though internal encoding is ASCII" do
134
+ Encoding.default_internal = Encoding::ASCII
113
135
  encoding = Encoding.find("UTF-8")
114
- headers = "HTTP/1.1 200 OK \r\nContent-Type: text/css\r\n"
115
- body = "charset=invalid"
136
+ headers = "HTTP/1.1 200 OK \r\nContent-Disposition: attachment,filename=\"žфайлец.txt\"\r\n"
137
+ body = "this is a file with a Russian filename set in content-disposition"
116
138
 
117
139
  response = Patron::Response.new("url", "status", 0, headers, body, "UTF-8")
118
-
119
- expect(response.body.encoding).to eql(encoding)
140
+ dispo = response.headers['Content-Disposition']
141
+ expect(dispo.encoding).to eq(Encoding::UTF_8)
142
+ end
143
+
144
+ it "should be able to serialize and deserialize itself" do
145
+ expect(Marshal.load(Marshal.dump(@request))).to eql(@request)
120
146
  end
121
147
  end
@@ -28,6 +28,7 @@ require 'webrick'
28
28
  require 'yaml'
29
29
  require 'base64'
30
30
  require 'fileutils'
31
+ require 'securerandom'
31
32
 
32
33
  describe Patron::Session do
33
34
 
@@ -233,7 +234,7 @@ describe Patron::Session do
233
234
  # but it does get used nevertheless - for instance, it is a usual
234
235
  # practice when interacting with an ElasticSearch cluster where
235
236
  # you can have very deeply going queries, which are still technically GETs
236
- data = SecureRandom.random_bytes(1024 * 24)
237
+ data = Random.new.bytes(1024 * 24)
237
238
  response = @session.request(:get, "/test", {}, :data => data)
238
239
  body = YAML::load(response.body)
239
240
  expect(body.request_method).to be == "GET"
@@ -241,7 +242,7 @@ describe Patron::Session do
241
242
  end
242
243
 
243
244
  it "should upload data with :put" do
244
- data = SecureRandom.random_bytes(1024 * 24)
245
+ data = Random.new.bytes(1024 * 24)
245
246
  response = @session.put("/test", data)
246
247
  body = YAML::load(response.body)
247
248
  expect(body.request_method).to be == "PUT"
@@ -518,7 +519,7 @@ describe Patron::Session do
518
519
  session = Patron::Session.new do |patron|
519
520
  patron.timeout = args[:timeout]
520
521
  patron.base_url = args[:base_url]
521
- patron.headers = args[:headers]
522
+ patron.headers = args[:headers]
522
523
  end
523
524
 
524
525
  it 'sets the base_url' do
@@ -31,6 +31,7 @@ if ENV["COVERAGE"]
31
31
  end
32
32
 
33
33
  require 'rspec'
34
+
34
35
  # Kill warnings that not raising a specific exception still allows the method
35
36
  # to fail with another exception
36
37
  RSpec::Expectations.configuration.warn_about_potential_false_positives = false
@@ -28,6 +28,7 @@ require 'yaml'
28
28
  require 'webrick'
29
29
  require 'webrick/https'
30
30
  require 'openssl'
31
+ require 'zlib'
31
32
 
32
33
  include WEBrick
33
34
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: patron
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.1
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phillip Toland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-07-11 00:00:00.000000000 Z
11
+ date: 2016-09-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -92,6 +92,7 @@ files:
92
92
  - ".gitignore"
93
93
  - ".rspec"
94
94
  - ".travis.yml"
95
+ - ".yardopts"
95
96
  - CHANGELOG.md
96
97
  - Gemfile
97
98
  - Gemfile.lock
@@ -109,6 +110,7 @@ files:
109
110
  - lib/patron/proxy_type.rb
110
111
  - lib/patron/request.rb
111
112
  - lib/patron/response.rb
113
+ - lib/patron/response_decoding.rb
112
114
  - lib/patron/session.rb
113
115
  - lib/patron/util.rb
114
116
  - lib/patron/version.rb