rest-client 2.0.2 → 2.1.0
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 +5 -5
- data/.gitignore +1 -0
- data/.mailmap +10 -0
- data/.rubocop +2 -0
- data/.rubocop-disables.yml +46 -44
- data/.rubocop.yml +5 -0
- data/.travis.yml +31 -17
- data/AUTHORS +8 -0
- data/README.md +126 -9
- data/Rakefile +12 -4
- data/history.md +53 -0
- data/lib/restclient.rb +0 -1
- data/lib/restclient/abstract_response.rb +28 -2
- data/lib/restclient/exceptions.rb +3 -3
- data/lib/restclient/payload.rb +29 -4
- data/lib/restclient/raw_response.rb +17 -6
- data/lib/restclient/request.rb +94 -67
- data/lib/restclient/resource.rb +16 -6
- data/lib/restclient/response.rb +14 -4
- data/lib/restclient/utils.rb +47 -8
- data/lib/restclient/version.rb +2 -2
- data/rest-client.gemspec +3 -2
- data/spec/ISS.jpg +0 -0
- data/spec/helpers.rb +37 -5
- data/spec/integration/capath_digicert/3513523f.0 +22 -0
- data/spec/integration/capath_digicert/399e7759.0 +22 -0
- data/spec/integration/capath_digicert/digicert.crt +20 -17
- data/spec/integration/certs/digicert.crt +20 -17
- data/spec/integration/httpbin_spec.rb +41 -0
- data/spec/integration/integration_spec.rb +0 -7
- data/spec/unit/abstract_response_spec.rb +7 -7
- data/spec/unit/payload_spec.rb +51 -19
- data/spec/unit/raw_response_spec.rb +6 -2
- data/spec/unit/request2_spec.rb +8 -8
- data/spec/unit/request_spec.rb +53 -65
- data/spec/unit/resource_spec.rb +7 -7
- data/spec/unit/response_spec.rb +33 -22
- data/spec/unit/restclient_spec.rb +3 -2
- data/spec/unit/utils_spec.rb +10 -10
- metadata +34 -13
- data/spec/integration/capath_digicert/244b5494.0 +0 -19
- data/spec/integration/capath_digicert/81b9768f.0 +0 -19
- data/spec/unit/master_shake.jpg +0 -0
data/lib/restclient/resource.rb
CHANGED
@@ -51,7 +51,8 @@ module RestClient
|
|
51
51
|
Request.execute(options.merge(
|
52
52
|
:method => :get,
|
53
53
|
:url => url,
|
54
|
-
:headers => headers
|
54
|
+
:headers => headers,
|
55
|
+
:log => log), &(block || @block))
|
55
56
|
end
|
56
57
|
|
57
58
|
def head(additional_headers={}, &block)
|
@@ -59,7 +60,8 @@ module RestClient
|
|
59
60
|
Request.execute(options.merge(
|
60
61
|
:method => :head,
|
61
62
|
:url => url,
|
62
|
-
:headers => headers
|
63
|
+
:headers => headers,
|
64
|
+
:log => log), &(block || @block))
|
63
65
|
end
|
64
66
|
|
65
67
|
def post(payload, additional_headers={}, &block)
|
@@ -68,7 +70,8 @@ module RestClient
|
|
68
70
|
:method => :post,
|
69
71
|
:url => url,
|
70
72
|
:payload => payload,
|
71
|
-
:headers => headers
|
73
|
+
:headers => headers,
|
74
|
+
:log => log), &(block || @block))
|
72
75
|
end
|
73
76
|
|
74
77
|
def put(payload, additional_headers={}, &block)
|
@@ -77,7 +80,8 @@ module RestClient
|
|
77
80
|
:method => :put,
|
78
81
|
:url => url,
|
79
82
|
:payload => payload,
|
80
|
-
:headers => headers
|
83
|
+
:headers => headers,
|
84
|
+
:log => log), &(block || @block))
|
81
85
|
end
|
82
86
|
|
83
87
|
def patch(payload, additional_headers={}, &block)
|
@@ -86,7 +90,8 @@ module RestClient
|
|
86
90
|
:method => :patch,
|
87
91
|
:url => url,
|
88
92
|
:payload => payload,
|
89
|
-
:headers => headers
|
93
|
+
:headers => headers,
|
94
|
+
:log => log), &(block || @block))
|
90
95
|
end
|
91
96
|
|
92
97
|
def delete(additional_headers={}, &block)
|
@@ -94,7 +99,8 @@ module RestClient
|
|
94
99
|
Request.execute(options.merge(
|
95
100
|
:method => :delete,
|
96
101
|
:url => url,
|
97
|
-
:headers => headers
|
102
|
+
:headers => headers,
|
103
|
+
:log => log), &(block || @block))
|
98
104
|
end
|
99
105
|
|
100
106
|
def to_s
|
@@ -121,6 +127,10 @@ module RestClient
|
|
121
127
|
options[:open_timeout]
|
122
128
|
end
|
123
129
|
|
130
|
+
def log
|
131
|
+
options[:log] || RestClient.log
|
132
|
+
end
|
133
|
+
|
124
134
|
# Construct a subresource, preserving authentication.
|
125
135
|
#
|
126
136
|
# Example:
|
data/lib/restclient/response.rb
CHANGED
@@ -38,15 +38,25 @@ module RestClient
|
|
38
38
|
"<RestClient::Response #{code.inspect} #{body_truncated(10).inspect}>"
|
39
39
|
end
|
40
40
|
|
41
|
-
|
41
|
+
# Initialize a Response object. Because RestClient::Response is
|
42
|
+
# (unfortunately) a subclass of String for historical reasons,
|
43
|
+
# Response.create is the preferred initializer.
|
44
|
+
#
|
45
|
+
# @param [String, nil] body The response body from the Net::HTTPResponse
|
46
|
+
# @param [Net::HTTPResponse] net_http_res
|
47
|
+
# @param [RestClient::Request] request
|
48
|
+
# @param [Time] start_time
|
49
|
+
def self.create(body, net_http_res, request, start_time=nil)
|
42
50
|
result = self.new(body || '')
|
43
51
|
|
44
|
-
result.response_set_vars(net_http_res, request)
|
52
|
+
result.response_set_vars(net_http_res, request, start_time)
|
45
53
|
fix_encoding(result)
|
46
54
|
|
47
55
|
result
|
48
56
|
end
|
49
57
|
|
58
|
+
# Set the String encoding according to the 'Content-Type: charset' header,
|
59
|
+
# if possible.
|
50
60
|
def self.fix_encoding(response)
|
51
61
|
charset = RestClient::Utils.get_encoding_from_headers(response.headers)
|
52
62
|
encoding = nil
|
@@ -54,8 +64,8 @@ module RestClient
|
|
54
64
|
begin
|
55
65
|
encoding = Encoding.find(charset) if charset
|
56
66
|
rescue ArgumentError
|
57
|
-
if
|
58
|
-
|
67
|
+
if response.log
|
68
|
+
response.log << "No such encoding: #{charset.inspect}"
|
59
69
|
end
|
60
70
|
end
|
61
71
|
|
data/lib/restclient/utils.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'http/accept'
|
2
|
+
|
1
3
|
module RestClient
|
2
4
|
# Various utility methods
|
3
5
|
module Utils
|
@@ -13,8 +15,8 @@ module RestClient
|
|
13
15
|
#
|
14
16
|
# @param headers [Hash<Symbol,String>]
|
15
17
|
#
|
16
|
-
# @return [String, nil]
|
17
|
-
#
|
18
|
+
# @return [String, nil] Return the string encoding or nil if no header is
|
19
|
+
# found.
|
18
20
|
#
|
19
21
|
# @example
|
20
22
|
# >> get_encoding_from_headers({:content_type => 'text/plain; charset=UTF-8'})
|
@@ -24,19 +26,52 @@ module RestClient
|
|
24
26
|
type_header = headers[:content_type]
|
25
27
|
return nil unless type_header
|
26
28
|
|
27
|
-
|
29
|
+
# TODO: remove this hack once we drop support for Ruby 2.0
|
30
|
+
if RUBY_VERSION.start_with?('2.0')
|
31
|
+
_content_type, params = deprecated_cgi_parse_header(type_header)
|
32
|
+
|
33
|
+
if params.include?('charset')
|
34
|
+
return params.fetch('charset').gsub(/(\A["']*)|(["']*\z)/, '')
|
35
|
+
end
|
36
|
+
|
37
|
+
else
|
28
38
|
|
29
|
-
|
30
|
-
|
39
|
+
begin
|
40
|
+
_content_type, params = cgi_parse_header(type_header)
|
41
|
+
rescue HTTP::Accept::ParseError
|
42
|
+
return nil
|
43
|
+
else
|
44
|
+
params['charset']
|
45
|
+
end
|
31
46
|
end
|
47
|
+
end
|
32
48
|
|
33
|
-
|
49
|
+
# Parse a Content-Type like header.
|
50
|
+
#
|
51
|
+
# Return the main content-type and a hash of params.
|
52
|
+
#
|
53
|
+
# @param [String] line
|
54
|
+
# @return [Array(String, Hash)]
|
55
|
+
#
|
56
|
+
def self.cgi_parse_header(line)
|
57
|
+
types = HTTP::Accept::MediaTypes.parse(line)
|
58
|
+
|
59
|
+
if types.empty?
|
60
|
+
raise HTTP::Accept::ParseError.new("Found no types in header line")
|
61
|
+
end
|
62
|
+
|
63
|
+
[types.first.mime_type, types.first.parameters]
|
34
64
|
end
|
35
65
|
|
36
66
|
# Parse semi-colon separated, potentially quoted header string iteratively.
|
37
67
|
#
|
38
68
|
# @private
|
39
69
|
#
|
70
|
+
# @deprecated This method is deprecated and only exists to support Ruby
|
71
|
+
# 2.0, which is not supported by HTTP::Accept.
|
72
|
+
#
|
73
|
+
# @todo remove this method when dropping support for Ruby 2.0
|
74
|
+
#
|
40
75
|
def self._cgi_parseparam(s)
|
41
76
|
return enum_for(__method__, s) unless block_given?
|
42
77
|
|
@@ -66,11 +101,15 @@ module RestClient
|
|
66
101
|
# probably doesn't read or perform particularly well in ruby.
|
67
102
|
# https://github.com/python/cpython/blob/3.4/Lib/cgi.py#L301-L331
|
68
103
|
#
|
69
|
-
#
|
70
104
|
# @param [String] line
|
71
105
|
# @return [Array(String, Hash)]
|
72
106
|
#
|
73
|
-
|
107
|
+
# @deprecated This method is deprecated and only exists to support Ruby
|
108
|
+
# 2.0, which is not supported by HTTP::Accept.
|
109
|
+
#
|
110
|
+
# @todo remove this method when dropping support for Ruby 2.0
|
111
|
+
#
|
112
|
+
def self.deprecated_cgi_parse_header(line)
|
74
113
|
parts = _cgi_parseparam(';' + line)
|
75
114
|
key = parts.next
|
76
115
|
pdict = {}
|
data/lib/restclient/version.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module RestClient
|
2
|
-
VERSION_INFO = [2,
|
3
|
-
VERSION = VERSION_INFO.map(&:to_s).join('.')
|
2
|
+
VERSION_INFO = [2, 1, 0].freeze
|
3
|
+
VERSION = VERSION_INFO.map(&:to_s).join('.').freeze
|
4
4
|
|
5
5
|
def self.version
|
6
6
|
VERSION
|
data/rest-client.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |s|
|
|
8
8
|
s.authors = ['REST Client Team']
|
9
9
|
s.description = 'A simple HTTP and REST client for Ruby, inspired by the Sinatra microframework style of specifying actions: get, put, post, delete.'
|
10
10
|
s.license = 'MIT'
|
11
|
-
s.email = 'rest
|
11
|
+
s.email = 'discuss@rest-client.groups.io'
|
12
12
|
s.executables = ['restclient']
|
13
13
|
s.extra_rdoc_files = ['README.md', 'history.md']
|
14
14
|
s.files = `git ls-files -z`.split("\0")
|
@@ -21,8 +21,9 @@ Gem::Specification.new do |s|
|
|
21
21
|
s.add_development_dependency('pry', '~> 0')
|
22
22
|
s.add_development_dependency('pry-doc', '~> 0')
|
23
23
|
s.add_development_dependency('rdoc', '>= 2.4.2', '< 6.0')
|
24
|
-
s.add_development_dependency('rubocop', '~> 0')
|
24
|
+
s.add_development_dependency('rubocop', '~> 0.49')
|
25
25
|
|
26
|
+
s.add_dependency('http-accept', '>= 1.7.0', '< 2.0')
|
26
27
|
s.add_dependency('http-cookie', '>= 1.0.2', '< 2.0')
|
27
28
|
s.add_dependency('mime-types', '>= 1.16', '< 4.0')
|
28
29
|
s.add_dependency('netrc', '~> 0.8')
|
data/spec/ISS.jpg
ADDED
Binary file
|
data/spec/helpers.rb
CHANGED
@@ -1,10 +1,36 @@
|
|
1
1
|
require 'uri'
|
2
2
|
|
3
3
|
module Helpers
|
4
|
-
|
5
|
-
|
4
|
+
|
5
|
+
# @param [Hash] opts A hash of methods, passed directly to the double
|
6
|
+
# definition. Use this to stub other required methods.
|
7
|
+
#
|
8
|
+
# @return double for Net::HTTPResponse
|
9
|
+
def res_double(opts={})
|
10
|
+
instance_double('Net::HTTPResponse', {to_hash: {}, body: 'response body'}.merge(opts))
|
11
|
+
end
|
12
|
+
|
13
|
+
# Given a Net::HTTPResponse or double and a Request or double, create a
|
14
|
+
# RestClient::Response object.
|
15
|
+
#
|
16
|
+
# @param net_http_res_double an rspec double for Net::HTTPResponse
|
17
|
+
# @param request A RestClient::Request or rspec double
|
18
|
+
#
|
19
|
+
# @return [RestClient::Response]
|
20
|
+
#
|
21
|
+
def response_from_res_double(net_http_res_double, request=nil, duration: 1)
|
22
|
+
request ||= request_double()
|
23
|
+
start_time = Time.now - duration
|
24
|
+
|
25
|
+
response = RestClient::Response.create(net_http_res_double.body, net_http_res_double, request, start_time)
|
26
|
+
|
27
|
+
# mock duration to ensure it gets the value we expect
|
28
|
+
allow(response).to receive(:duration).and_return(duration)
|
29
|
+
|
30
|
+
response
|
6
31
|
end
|
7
32
|
|
33
|
+
# Redirect stderr to a string for the duration of the passed block.
|
8
34
|
def fake_stderr
|
9
35
|
original_stderr = $stderr
|
10
36
|
$stderr = StringIO.new
|
@@ -14,9 +40,15 @@ module Helpers
|
|
14
40
|
$stderr = original_stderr
|
15
41
|
end
|
16
42
|
|
43
|
+
# Create a double for RestClient::Request
|
17
44
|
def request_double(url: 'http://example.com', method: 'get')
|
18
|
-
|
19
|
-
|
20
|
-
|
45
|
+
instance_double('RestClient::Request',
|
46
|
+
url: url, uri: URI.parse(url), method: method, user: nil, password: nil,
|
47
|
+
cookie_jar: HTTP::CookieJar.new, redirection_history: nil,
|
48
|
+
args: {url: url, method: method})
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_image_path
|
52
|
+
File.dirname(__FILE__) + "/ISS.jpg"
|
21
53
|
end
|
22
54
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4
|
+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
5
|
+
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
6
|
+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
7
|
+
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
8
|
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
9
|
+
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
10
|
+
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
11
|
+
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
12
|
+
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
13
|
+
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
14
|
+
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
15
|
+
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
16
|
+
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
17
|
+
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
18
|
+
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
19
|
+
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
20
|
+
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
21
|
+
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
22
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,22 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4
|
+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
5
|
+
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
6
|
+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
7
|
+
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
8
|
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
9
|
+
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
10
|
+
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
11
|
+
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
12
|
+
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
13
|
+
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
14
|
+
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
15
|
+
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
16
|
+
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
17
|
+
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
18
|
+
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
19
|
+
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
20
|
+
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
21
|
+
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
22
|
+
-----END CERTIFICATE-----
|
@@ -1,19 +1,22 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
2
|
+
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4
|
+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
5
|
+
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
6
|
+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
7
|
+
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
8
|
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
9
|
+
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
10
|
+
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
11
|
+
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
12
|
+
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
13
|
+
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
14
|
+
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
15
|
+
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
16
|
+
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
17
|
+
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
18
|
+
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
19
|
+
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
20
|
+
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
21
|
+
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
19
22
|
-----END CERTIFICATE-----
|
@@ -1,19 +1,22 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
2
|
+
MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
|
3
|
+
MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
|
4
|
+
d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
|
5
|
+
QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
|
6
|
+
MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
|
7
|
+
b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
|
8
|
+
9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
|
9
|
+
CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
|
10
|
+
nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
|
11
|
+
43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
|
12
|
+
T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
|
13
|
+
gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
|
14
|
+
BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
|
15
|
+
TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
|
16
|
+
DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
|
17
|
+
hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
|
18
|
+
06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
|
19
|
+
PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
|
20
|
+
YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
|
21
|
+
CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
|
19
22
|
-----END CERTIFICATE-----
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require_relative '_lib'
|
2
2
|
require 'json'
|
3
3
|
|
4
|
+
require 'zlib'
|
5
|
+
|
4
6
|
describe RestClient::Request do
|
5
7
|
before(:all) do
|
6
8
|
WebMock.disable!
|
@@ -83,5 +85,44 @@ describe RestClient::Request do
|
|
83
85
|
expect(ex.http_code).to eq 401
|
84
86
|
}
|
85
87
|
end
|
88
|
+
|
89
|
+
it 'handles gzipped/deflated responses' do
|
90
|
+
[['gzip', 'gzipped'], ['deflate', 'deflated']].each do |encoding, var|
|
91
|
+
raw = execute_httpbin(encoding, method: :get)
|
92
|
+
|
93
|
+
begin
|
94
|
+
data = JSON.parse(raw)
|
95
|
+
rescue StandardError
|
96
|
+
puts "Failed to parse: " + raw.inspect
|
97
|
+
raise
|
98
|
+
end
|
99
|
+
|
100
|
+
expect(data['method']).to eq 'GET'
|
101
|
+
expect(data.fetch(var)).to be true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'does not uncompress response when accept-encoding is set' do
|
106
|
+
# == gzip ==
|
107
|
+
raw = execute_httpbin('gzip', method: :get, headers: {accept_encoding: 'gzip, deflate'})
|
108
|
+
|
109
|
+
# check for gzip magic number
|
110
|
+
expect(raw.body).to start_with("\x1F\x8B".b)
|
111
|
+
|
112
|
+
decoded = Zlib::GzipReader.new(StringIO.new(raw.body)).read
|
113
|
+
parsed = JSON.parse(decoded)
|
114
|
+
|
115
|
+
expect(parsed['method']).to eq 'GET'
|
116
|
+
expect(parsed.fetch('gzipped')).to be true
|
117
|
+
|
118
|
+
# == delate ==
|
119
|
+
raw = execute_httpbin('deflate', method: :get, headers: {accept_encoding: 'gzip, deflate'})
|
120
|
+
|
121
|
+
decoded = Zlib::Inflate.new.inflate(raw.body)
|
122
|
+
parsed = JSON.parse(decoded)
|
123
|
+
|
124
|
+
expect(parsed['method']).to eq 'GET'
|
125
|
+
expect(parsed.fetch('deflated')).to be true
|
126
|
+
end
|
86
127
|
end
|
87
128
|
end
|