rest-client 1.6.7 → 1.6.8.rc1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rest-client might be problematic. Click here for more details.
- checksums.yaml +7 -0
- data/.gitignore +8 -0
- data/.rspec +1 -0
- data/.travis.yml +3 -0
- data/AUTHORS +75 -0
- data/Gemfile +7 -0
- data/README.rdoc +39 -23
- data/Rakefile +15 -32
- data/history.md +10 -1
- data/lib/restclient.rb +2 -6
- data/lib/restclient/exceptions.rb +11 -6
- data/lib/restclient/net_http_ext.rb +5 -5
- data/lib/restclient/payload.rb +10 -5
- data/lib/restclient/platform.rb +29 -0
- data/lib/restclient/request.rb +57 -13
- data/lib/restclient/response.rb +3 -1
- data/lib/restclient/version.rb +7 -0
- data/rest-client.gemspec +26 -0
- data/spec/abstract_response_spec.rb +12 -12
- data/spec/base.rb +1 -4
- data/spec/exceptions_spec.rb +17 -17
- data/spec/integration/capath_digicert/244b5494.0 +19 -0
- data/spec/integration/capath_digicert/81b9768f.0 +19 -0
- data/spec/integration/capath_digicert/README +8 -0
- data/spec/integration/capath_digicert/digicert.crt +19 -0
- data/spec/integration/certs/digicert.crt +19 -0
- data/spec/integration/request_spec.rb +52 -2
- data/spec/integration_spec.rb +9 -9
- data/spec/master_shake.jpg +0 -0
- data/spec/payload_spec.rb +40 -30
- data/spec/raw_response_spec.rb +4 -4
- data/spec/request2_spec.rb +5 -10
- data/spec/request_spec.rb +129 -130
- data/spec/resource_spec.rb +20 -18
- data/spec/response_spec.rb +37 -37
- data/spec/restclient_spec.rb +1 -1
- metadata +123 -85
- data/VERSION +0 -1
- data/spec/integration/certs/equifax.crt +0 -19
@@ -0,0 +1,19 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
|
3
|
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
|
4
|
+
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
|
5
|
+
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
|
6
|
+
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
|
7
|
+
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
|
8
|
+
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
|
9
|
+
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
|
10
|
+
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
|
11
|
+
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
|
12
|
+
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
|
13
|
+
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
|
14
|
+
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
|
15
|
+
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
|
16
|
+
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
|
17
|
+
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
18
|
+
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
|
19
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,8 @@
|
|
1
|
+
The CA path symlinks can be created by c_rehash(1ssl).
|
2
|
+
|
3
|
+
But in order for the tests to work on Windows, they have to be regular files.
|
4
|
+
You can turn them all into regular files by running this on a GNU system:
|
5
|
+
|
6
|
+
for file in $(find . -type l); do
|
7
|
+
cp -iv --remove-destination $(readlink -e $file) $file
|
8
|
+
done
|
@@ -0,0 +1,19 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
|
3
|
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
|
4
|
+
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
|
5
|
+
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
|
6
|
+
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
|
7
|
+
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
|
8
|
+
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
|
9
|
+
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
|
10
|
+
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
|
11
|
+
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
|
12
|
+
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
|
13
|
+
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
|
14
|
+
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
|
15
|
+
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
|
16
|
+
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
|
17
|
+
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
18
|
+
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
|
19
|
+
-----END CERTIFICATE-----
|
@@ -0,0 +1,19 @@
|
|
1
|
+
-----BEGIN CERTIFICATE-----
|
2
|
+
MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG
|
3
|
+
EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw
|
4
|
+
KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw
|
5
|
+
MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ
|
6
|
+
MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu
|
7
|
+
Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t
|
8
|
+
Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS
|
9
|
+
OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3
|
10
|
+
MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ
|
11
|
+
NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe
|
12
|
+
h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB
|
13
|
+
Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY
|
14
|
+
JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ
|
15
|
+
V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp
|
16
|
+
myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK
|
17
|
+
mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
|
18
|
+
vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K
|
19
|
+
-----END CERTIFICATE-----
|
@@ -5,13 +5,23 @@ describe RestClient::Request do
|
|
5
5
|
it "is successful with the correct ca_file" do
|
6
6
|
request = RestClient::Request.new(
|
7
7
|
:method => :get,
|
8
|
-
:url => 'https://www.mozilla.
|
8
|
+
:url => 'https://www.mozilla.org',
|
9
9
|
:verify_ssl => OpenSSL::SSL::VERIFY_PEER,
|
10
|
-
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "
|
10
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "digicert.crt")
|
11
11
|
)
|
12
12
|
expect { request.execute }.to_not raise_error
|
13
13
|
end
|
14
14
|
|
15
|
+
# I don' think this feature is useful anymore (under 1.9.3 at the very least).
|
16
|
+
#
|
17
|
+
# Exceptions in verify_callback are ignored; RestClient has to catch OpenSSL::SSL::SSLError
|
18
|
+
# and either re-throw it as is, or throw SSLCertificateNotVerified
|
19
|
+
# based on the contents of the message field of the original exception
|
20
|
+
#.
|
21
|
+
# The client has to handle OpenSSL::SSL::SSLError exceptions anyway,
|
22
|
+
# why make them handle both OpenSSL *AND* RestClient exceptions???
|
23
|
+
#
|
24
|
+
# also see https://github.com/ruby/ruby/blob/trunk/ext/openssl/ossl.c#L237
|
15
25
|
it "is unsuccessful with an incorrect ca_file" do
|
16
26
|
request = RestClient::Request.new(
|
17
27
|
:method => :get,
|
@@ -21,5 +31,45 @@ describe RestClient::Request do
|
|
21
31
|
)
|
22
32
|
expect { request.execute }.to raise_error(RestClient::SSLCertificateNotVerified)
|
23
33
|
end
|
34
|
+
|
35
|
+
it "executes the verify_callback" do
|
36
|
+
ran_callback = false
|
37
|
+
request = RestClient::Request.new(
|
38
|
+
:method => :get,
|
39
|
+
:url => 'https://www.mozilla.org',
|
40
|
+
:verify_ssl => true,
|
41
|
+
:ssl_verify_callback => lambda { |preverify_ok, store_ctx|
|
42
|
+
ran_callback = true
|
43
|
+
preverify_ok
|
44
|
+
},
|
45
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "digicert.crt")
|
46
|
+
)
|
47
|
+
expect {request.execute }.to_not raise_error
|
48
|
+
ran_callback.should eq(true)
|
49
|
+
end
|
50
|
+
|
51
|
+
it "fails verification when the callback returns false",
|
52
|
+
:unless => RestClient::Platform.mac? do
|
53
|
+
request = RestClient::Request.new(
|
54
|
+
:method => :get,
|
55
|
+
:url => 'https://www.mozilla.org',
|
56
|
+
:verify_ssl => true,
|
57
|
+
:ssl_verify_callback => lambda { |preverify_ok, store_ctx| false },
|
58
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "digicert.crt")
|
59
|
+
)
|
60
|
+
expect { request.execute }.to raise_error(RestClient::SSLCertificateNotVerified)
|
61
|
+
end
|
62
|
+
|
63
|
+
it "succeeds verification when the callback returns true",
|
64
|
+
:unless => RestClient::Platform.mac? do
|
65
|
+
request = RestClient::Request.new(
|
66
|
+
:method => :get,
|
67
|
+
:url => 'https://www.mozilla.org',
|
68
|
+
:verify_ssl => true,
|
69
|
+
:ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "verisign.crt"),
|
70
|
+
:ssl_verify_callback => lambda { |preverify_ok, store_ctx| true }
|
71
|
+
)
|
72
|
+
expect { request.execute }.to_not raise_error
|
73
|
+
end
|
24
74
|
end
|
25
75
|
end
|
data/spec/integration_spec.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
|
2
2
|
|
3
3
|
require 'webmock/rspec'
|
4
|
-
include WebMock
|
4
|
+
include WebMock::API
|
5
5
|
|
6
6
|
describe RestClient do
|
7
7
|
|
@@ -9,15 +9,15 @@ describe RestClient do
|
|
9
9
|
body = 'abc'
|
10
10
|
stub_request(:get, "www.example.com").to_return(:body => body, :status => 200)
|
11
11
|
response = RestClient.get "www.example.com"
|
12
|
-
response.code.should
|
13
|
-
response.body.should
|
12
|
+
response.code.should eq 200
|
13
|
+
response.body.should eq body
|
14
14
|
end
|
15
15
|
|
16
16
|
it "a simple request with gzipped content" do
|
17
17
|
stub_request(:get, "www.example.com").with(:headers => { 'Accept-Encoding' => 'gzip, deflate' }).to_return(:body => "\037\213\b\b\006'\252H\000\003t\000\313T\317UH\257\312,HM\341\002\000G\242(\r\v\000\000\000", :status => 200, :headers => { 'Content-Encoding' => 'gzip' } )
|
18
18
|
response = RestClient.get "www.example.com"
|
19
|
-
response.code.should
|
20
|
-
response.body.should
|
19
|
+
response.code.should eq 200
|
20
|
+
response.body.should eq "i'm gziped\n"
|
21
21
|
end
|
22
22
|
|
23
23
|
it "a 404" do
|
@@ -27,10 +27,10 @@ describe RestClient do
|
|
27
27
|
RestClient.get "www.example.com"
|
28
28
|
raise
|
29
29
|
rescue RestClient::ResourceNotFound => e
|
30
|
-
e.http_code.should
|
31
|
-
e.response.code.should
|
32
|
-
e.response.body.should
|
33
|
-
e.http_body.should
|
30
|
+
e.http_code.should eq 404
|
31
|
+
e.response.code.should eq 404
|
32
|
+
e.response.body.should eq body
|
33
|
+
e.http_body.should eq body
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
data/spec/master_shake.jpg
CHANGED
Binary file
|
data/spec/payload_spec.rb
CHANGED
@@ -1,29 +1,30 @@
|
|
1
|
+
# encoding: binary
|
1
2
|
require File.join(File.dirname(File.expand_path(__FILE__)), 'base')
|
2
3
|
|
3
4
|
describe RestClient::Payload do
|
4
5
|
context "A regular Payload" do
|
5
6
|
it "should use standard enctype as default content-type" do
|
6
7
|
RestClient::Payload::UrlEncoded.new({}).headers['Content-Type'].
|
7
|
-
should
|
8
|
+
should eq 'application/x-www-form-urlencoded'
|
8
9
|
end
|
9
10
|
|
10
11
|
it "should form properly encoded params" do
|
11
12
|
RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s.
|
12
|
-
should
|
13
|
+
should eq "foo=bar"
|
13
14
|
["foo=bar&baz=qux", "baz=qux&foo=bar"].should include(
|
14
15
|
RestClient::Payload::UrlEncoded.new({:foo => 'bar', :baz => 'qux'}).to_s)
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should escape parameters" do
|
18
19
|
RestClient::Payload::UrlEncoded.new({'foo ' => 'bar'}).to_s.
|
19
|
-
should
|
20
|
+
should eq "foo%20=bar"
|
20
21
|
end
|
21
22
|
|
22
23
|
it "should properly handle hashes as parameter" do
|
23
24
|
RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz'}}).to_s.
|
24
|
-
should
|
25
|
+
should eq "foo[bar]=baz"
|
25
26
|
RestClient::Payload::UrlEncoded.new({:foo => {:bar => {:baz => 'qux'}}}).to_s.
|
26
|
-
should
|
27
|
+
should eq "foo[bar][baz]=qux"
|
27
28
|
end
|
28
29
|
|
29
30
|
it "should handle many attributes inside a hash" do
|
@@ -43,18 +44,18 @@ describe RestClient::Payload do
|
|
43
44
|
|
44
45
|
it "should form properly use symbols as parameters" do
|
45
46
|
RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s.
|
46
|
-
should
|
47
|
+
should eq "foo=bar"
|
47
48
|
RestClient::Payload::UrlEncoded.new({:foo => {:bar => :baz}}).to_s.
|
48
|
-
should
|
49
|
+
should eq "foo[bar]=baz"
|
49
50
|
end
|
50
51
|
|
51
52
|
it "should properly handle arrays as repeated parameters" do
|
52
53
|
RestClient::Payload::UrlEncoded.new({:foo => ['bar']}).to_s.
|
53
|
-
should
|
54
|
+
should eq "foo[]=bar"
|
54
55
|
RestClient::Payload::UrlEncoded.new({:foo => ['bar', 'baz']}).to_s.
|
55
|
-
should
|
56
|
+
should eq "foo[]=bar&foo[]=baz"
|
56
57
|
end
|
57
|
-
|
58
|
+
|
58
59
|
it 'should not close if stream already closed' do
|
59
60
|
p = RestClient::Payload::UrlEncoded.new({'foo ' => 'bar'})
|
60
61
|
3.times {p.close}
|
@@ -65,10 +66,10 @@ describe RestClient::Payload do
|
|
65
66
|
context "A multipart Payload" do
|
66
67
|
it "should use standard enctype as default content-type" do
|
67
68
|
m = RestClient::Payload::Multipart.new({})
|
68
|
-
m.stub
|
69
|
-
m.headers['Content-Type'].should
|
69
|
+
m.stub(:boundary).and_return(123)
|
70
|
+
m.headers['Content-Type'].should eq 'multipart/form-data; boundary=123'
|
70
71
|
end
|
71
|
-
|
72
|
+
|
72
73
|
it 'should not error on close if stream already closed' do
|
73
74
|
m = RestClient::Payload::Multipart.new(:file => File.new(File.join(File.dirname(File.expand_path(__FILE__)), 'master_shake.jpg')))
|
74
75
|
3.times {m.close}
|
@@ -76,7 +77,7 @@ describe RestClient::Payload do
|
|
76
77
|
|
77
78
|
it "should form properly separated multipart data" do
|
78
79
|
m = RestClient::Payload::Multipart.new([[:bar, "baz"], [:foo, "bar"]])
|
79
|
-
m.to_s.should
|
80
|
+
m.to_s.should eq <<-EOS
|
80
81
|
--#{m.boundary}\r
|
81
82
|
Content-Disposition: form-data; name="bar"\r
|
82
83
|
\r
|
@@ -91,7 +92,7 @@ bar\r
|
|
91
92
|
|
92
93
|
it "should not escape parameters names" do
|
93
94
|
m = RestClient::Payload::Multipart.new([["bar ", "baz"]])
|
94
|
-
m.to_s.should
|
95
|
+
m.to_s.should eq <<-EOS
|
95
96
|
--#{m.boundary}\r
|
96
97
|
Content-Disposition: form-data; name="bar "\r
|
97
98
|
\r
|
@@ -103,12 +104,12 @@ baz\r
|
|
103
104
|
it "should form properly separated multipart data" do
|
104
105
|
f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
|
105
106
|
m = RestClient::Payload::Multipart.new({:foo => f})
|
106
|
-
m.to_s.should
|
107
|
+
m.to_s.should eq <<-EOS
|
107
108
|
--#{m.boundary}\r
|
108
109
|
Content-Disposition: form-data; name="foo"; filename="master_shake.jpg"\r
|
109
110
|
Content-Type: image/jpeg\r
|
110
111
|
\r
|
111
|
-
#{
|
112
|
+
#{File.open(f.path, 'rb'){|bin| bin.read}}\r
|
112
113
|
--#{m.boundary}--\r
|
113
114
|
EOS
|
114
115
|
end
|
@@ -116,12 +117,12 @@ Content-Type: image/jpeg\r
|
|
116
117
|
it "should ignore the name attribute when it's not set" do
|
117
118
|
f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
|
118
119
|
m = RestClient::Payload::Multipart.new({nil => f})
|
119
|
-
m.to_s.should
|
120
|
+
m.to_s.should eq <<-EOS
|
120
121
|
--#{m.boundary}\r
|
121
122
|
Content-Disposition: form-data; filename="master_shake.jpg"\r
|
122
123
|
Content-Type: image/jpeg\r
|
123
124
|
\r
|
124
|
-
#{
|
125
|
+
#{File.open(f.path, 'rb'){|bin| bin.read}}\r
|
125
126
|
--#{m.boundary}--\r
|
126
127
|
EOS
|
127
128
|
end
|
@@ -131,19 +132,19 @@ Content-Type: image/jpeg\r
|
|
131
132
|
f.instance_eval "def content_type; 'text/plain'; end"
|
132
133
|
f.instance_eval "def original_filename; 'foo.txt'; end"
|
133
134
|
m = RestClient::Payload::Multipart.new({:foo => f})
|
134
|
-
m.to_s.should
|
135
|
+
m.to_s.should eq <<-EOS
|
135
136
|
--#{m.boundary}\r
|
136
137
|
Content-Disposition: form-data; name="foo"; filename="foo.txt"\r
|
137
138
|
Content-Type: text/plain\r
|
138
139
|
\r
|
139
|
-
#{
|
140
|
+
#{File.open(f.path, 'rb'){|bin| bin.read}}\r
|
140
141
|
--#{m.boundary}--\r
|
141
142
|
EOS
|
142
143
|
end
|
143
144
|
|
144
145
|
it "should handle hash in hash parameters" do
|
145
146
|
m = RestClient::Payload::Multipart.new({:bar => {:baz => "foo"}})
|
146
|
-
m.to_s.should
|
147
|
+
m.to_s.should eq <<-EOS
|
147
148
|
--#{m.boundary}\r
|
148
149
|
Content-Disposition: form-data; name="bar[baz]"\r
|
149
150
|
\r
|
@@ -155,12 +156,12 @@ foo\r
|
|
155
156
|
f.instance_eval "def content_type; 'text/plain'; end"
|
156
157
|
f.instance_eval "def original_filename; 'foo.txt'; end"
|
157
158
|
m = RestClient::Payload::Multipart.new({:foo => {:bar => f}})
|
158
|
-
m.to_s.should
|
159
|
+
m.to_s.should eq <<-EOS
|
159
160
|
--#{m.boundary}\r
|
160
161
|
Content-Disposition: form-data; name="foo[bar]"; filename="foo.txt"\r
|
161
162
|
Content-Type: text/plain\r
|
162
163
|
\r
|
163
|
-
#{
|
164
|
+
#{File.open(f.path, 'rb'){|bin| bin.read}}\r
|
164
165
|
--#{m.boundary}--\r
|
165
166
|
EOS
|
166
167
|
end
|
@@ -171,23 +172,23 @@ Content-Type: text/plain\r
|
|
171
172
|
it "should properly determine the size of file payloads" do
|
172
173
|
f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
|
173
174
|
payload = RestClient::Payload.generate(f)
|
174
|
-
payload.size.should
|
175
|
-
payload.length.should
|
175
|
+
payload.size.should eq 76_988
|
176
|
+
payload.length.should eq 76_988
|
176
177
|
end
|
177
178
|
|
178
179
|
it "should properly determine the size of other kinds of streaming payloads" do
|
179
180
|
s = StringIO.new 'foo'
|
180
181
|
payload = RestClient::Payload.generate(s)
|
181
|
-
payload.size.should
|
182
|
-
payload.length.should
|
182
|
+
payload.size.should eq 3
|
183
|
+
payload.length.should eq 3
|
183
184
|
|
184
185
|
begin
|
185
186
|
f = Tempfile.new "rest-client"
|
186
187
|
f.write 'foo bar'
|
187
188
|
|
188
189
|
payload = RestClient::Payload.generate(f)
|
189
|
-
payload.size.should
|
190
|
-
payload.length.should
|
190
|
+
payload.size.should eq 7
|
191
|
+
payload.length.should eq 7
|
191
192
|
ensure
|
192
193
|
f.close
|
193
194
|
end
|
@@ -230,5 +231,14 @@ Content-Type: text/plain\r
|
|
230
231
|
it "should recognize other payloads that can be streamed" do
|
231
232
|
RestClient::Payload.generate(StringIO.new('foo')).should be_kind_of(RestClient::Payload::Streamed)
|
232
233
|
end
|
234
|
+
|
235
|
+
# hashery gem introduces Hash#read convenience method. Existence of #read method used to determine of content is streameable :/
|
236
|
+
it "shouldn't treat hashes as streameable" do
|
237
|
+
RestClient::Payload.generate({"foo" => 'bar'}).should be_kind_of(RestClient::Payload::UrlEncoded)
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
class HashMapForTesting < Hash
|
242
|
+
alias :read :[]
|
233
243
|
end
|
234
244
|
end
|
data/spec/raw_response_spec.rb
CHANGED
@@ -2,16 +2,16 @@ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
|
|
2
2
|
|
3
3
|
describe RestClient::RawResponse do
|
4
4
|
before do
|
5
|
-
@tf =
|
6
|
-
@net_http_res =
|
5
|
+
@tf = double("Tempfile", :read => "the answer is 42", :open => true)
|
6
|
+
@net_http_res = double('net http response')
|
7
7
|
@response = RestClient::RawResponse.new(@tf, @net_http_res, {})
|
8
8
|
end
|
9
9
|
|
10
10
|
it "behaves like string" do
|
11
|
-
@response.to_s.should
|
11
|
+
@response.to_s.should eq 'the answer is 42'
|
12
12
|
end
|
13
13
|
|
14
14
|
it "exposes a Tempfile" do
|
15
|
-
@response.file.should
|
15
|
+
@response.file.should eq @tf
|
16
16
|
end
|
17
17
|
end
|
data/spec/request2_spec.rb
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
|
2
2
|
|
3
3
|
require 'webmock/rspec'
|
4
|
-
include WebMock
|
4
|
+
include WebMock::API
|
5
5
|
|
6
6
|
describe RestClient::Request do
|
7
7
|
|
8
8
|
it "manage params for get requests" do
|
9
9
|
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
10
|
-
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body.should
|
10
|
+
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}).body.should eq 'foo'
|
11
11
|
|
12
12
|
stub_request(:get, 'http://some/resource').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar', 'params' => 'a'}).to_return(:body => 'foo', :status => 200)
|
13
|
-
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body.should
|
13
|
+
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => :a}).body.should eq 'foo'
|
14
14
|
end
|
15
15
|
|
16
16
|
it "can use a block to process response" do
|
@@ -20,21 +20,16 @@ describe RestClient::Request do
|
|
20
20
|
end
|
21
21
|
stub_request(:get, 'http://some/resource?a=b&c=d').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate', 'Foo'=>'bar'}).to_return(:body => 'foo', :status => 200)
|
22
22
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :get, :headers => {:foo => :bar, :params => {:a => :b, 'c' => 'd'}}, :block_response => block)
|
23
|
-
response_value.should
|
23
|
+
response_value.should eq "foo"
|
24
24
|
end
|
25
25
|
|
26
26
|
it 'closes payload if not nil' do
|
27
27
|
test_file = File.new(File.join( File.dirname(File.expand_path(__FILE__)), 'master_shake.jpg'))
|
28
|
-
initial_count = tmp_count
|
29
28
|
|
30
29
|
stub_request(:post, 'http://some/resource').with(:headers => {'Accept'=>'*/*; q=0.5, application/xml', 'Accept-Encoding'=>'gzip, deflate'}).to_return(:body => 'foo', :status => 200)
|
31
30
|
RestClient::Request.execute(:url => 'http://some/resource', :method => :post, :payload => {:file => test_file})
|
32
31
|
|
33
|
-
|
32
|
+
test_file.closed?.should be_true
|
34
33
|
end
|
35
34
|
|
36
35
|
end
|
37
|
-
|
38
|
-
def tmp_count
|
39
|
-
Dir.glob(Dir::tmpdir + "/*").size
|
40
|
-
end
|