rest-client 1.1.0 → 1.6.3

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.

Potentially problematic release.


This version of rest-client might be problematic. Click here for more details.

@@ -0,0 +1,19 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
3
+ UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
4
+ dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
5
+ MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
6
+ dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
7
+ AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
8
+ BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
9
+ cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
10
+ AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
11
+ MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
12
+ aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
13
+ ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
14
+ IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
15
+ MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
16
+ A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
17
+ 7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
18
+ 1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
19
+ -----END CERTIFICATE-----
@@ -0,0 +1,14 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
3
+ A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
4
+ cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
5
+ MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
6
+ BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
7
+ YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
8
+ ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
9
+ BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
10
+ I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
11
+ CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
12
+ lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
13
+ AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
14
+ -----END CERTIFICATE-----
@@ -0,0 +1,25 @@
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), '../base')
2
+
3
+ describe RestClient::Request do
4
+ describe "ssl verification" do
5
+ it "is successful with the correct ca_file" do
6
+ request = RestClient::Request.new(
7
+ :method => :get,
8
+ :url => 'https://www.google.com',
9
+ :verify_ssl => OpenSSL::SSL::VERIFY_PEER,
10
+ :ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "verisign.crt")
11
+ )
12
+ expect { request.execute }.to_not raise_error
13
+ end
14
+
15
+ it "is unsuccessful with an incorrect ca_file" do
16
+ request = RestClient::Request.new(
17
+ :method => :get,
18
+ :url => 'https://www.google.com',
19
+ :verify_ssl => OpenSSL::SSL::VERIFY_PEER,
20
+ :ssl_ca_file => File.join(File.dirname(__FILE__), "certs", "equifax.crt")
21
+ )
22
+ expect { request.execute }.to raise_error(RestClient::SSLCertificateNotVerified)
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,38 @@
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
+
3
+ require 'webmock/rspec'
4
+ include WebMock
5
+
6
+ describe RestClient do
7
+
8
+ it "a simple request" do
9
+ body = 'abc'
10
+ stub_request(:get, "www.example.com").to_return(:body => body, :status => 200)
11
+ response = RestClient.get "www.example.com"
12
+ response.code.should == 200
13
+ response.body.should == body
14
+ end
15
+
16
+ it "a simple request with gzipped content" do
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
+ response = RestClient.get "www.example.com"
19
+ response.code.should == 200
20
+ response.body.should == "i'm gziped\n"
21
+ end
22
+
23
+ it "a 404" do
24
+ body = "Ho hai ! I'm not here !"
25
+ stub_request(:get, "www.example.com").to_return(:body => body, :status => 404)
26
+ begin
27
+ RestClient.get "www.example.com"
28
+ raise
29
+ rescue RestClient::ResourceNotFound => e
30
+ e.http_code.should == 404
31
+ e.response.code.should == 404
32
+ e.response.body.should == body
33
+ e.http_body.should == body
34
+ end
35
+ end
36
+
37
+
38
+ end
@@ -1,131 +1,219 @@
1
- require File.dirname(__FILE__) + "/base"
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
2
 
3
3
  describe RestClient::Payload do
4
- context "A regular Payload" do
5
- it "should use standard enctype as default content-type" do
6
- RestClient::Payload::UrlEncoded.new({}).headers['Content-Type'].
7
- should == 'application/x-www-form-urlencoded'
8
- end
9
-
10
- it "should form properly encoded params" do
11
- RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s.
12
- should == "foo=bar"
13
- end
14
-
15
- it "should properly handle hashes as parameter" do
16
- RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz' }}).to_s.
17
- should == "foo[bar]=baz"
18
- RestClient::Payload::UrlEncoded.new({:foo => {:bar => {:baz => 'qux' }}}).to_s.
19
- should == "foo[bar][baz]=qux"
20
- end
21
-
22
- it "should form properly use symbols as parameters" do
23
- RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s.
24
- should == "foo=bar"
25
- RestClient::Payload::UrlEncoded.new({:foo => {:bar => :baz }}).to_s.
26
- should == "foo[bar]=baz"
27
- end
28
-
29
- end
30
-
31
- context "A multipart Payload" do
32
- it "should use standard enctype as default content-type" do
33
- m = RestClient::Payload::Multipart.new({})
34
- m.stub!(:boundary).and_return(123)
35
- m.headers['Content-Type'].should == 'multipart/form-data; boundary="123"'
36
- end
37
-
38
- it "should form properly seperated multipart data" do
39
- m = RestClient::Payload::Multipart.new([[:bar , "baz"], [:foo, "bar"]])
40
- m.to_s.should == <<-EOS
4
+ context "A regular Payload" do
5
+ it "should use standard enctype as default content-type" do
6
+ RestClient::Payload::UrlEncoded.new({}).headers['Content-Type'].
7
+ should == 'application/x-www-form-urlencoded'
8
+ end
9
+
10
+ it "should form properly encoded params" do
11
+ RestClient::Payload::UrlEncoded.new({:foo => 'bar'}).to_s.
12
+ should == "foo=bar"
13
+ ["foo=bar&baz=qux", "baz=qux&foo=bar"].should include(
14
+ RestClient::Payload::UrlEncoded.new({:foo => 'bar', :baz => 'qux'}).to_s)
15
+ end
16
+
17
+ it "should escape parameters" do
18
+ RestClient::Payload::UrlEncoded.new({'foo ' => 'bar'}).to_s.
19
+ should == "foo%20=bar"
20
+ end
21
+
22
+ it "should properly handle hashes as parameter" do
23
+ RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz' }}).to_s.
24
+ should == "foo[bar]=baz"
25
+ RestClient::Payload::UrlEncoded.new({:foo => {:bar => {:baz => 'qux' }}}).to_s.
26
+ should == "foo[bar][baz]=qux"
27
+ end
28
+
29
+ it "should handle many attributes inside a hash" do
30
+ parameters = RestClient::Payload::UrlEncoded.new({:foo => {:bar => 'baz', :baz => 'qux'}}).to_s
31
+ parameters.should include("foo[bar]=baz", "foo[baz]=qux")
32
+ end
33
+
34
+ it "should handle attributes inside a an array inside an hash" do
35
+ parameters = RestClient::Payload::UrlEncoded.new({"foo" => [{"bar" => 'baz'}, {"bar" => 'qux'}]}).to_s
36
+ parameters.should include("foo[bar]=baz", "foo[bar]=qux")
37
+ end
38
+
39
+ it "should handle attributes inside a an array inside an array inside an hash" do
40
+ parameters = RestClient::Payload::UrlEncoded.new({"foo" => [ [{"bar" => 'baz'}, {"bar" => 'qux'}]]}).to_s
41
+ parameters.should include("foo[bar]=baz", "foo[bar]=qux")
42
+ end
43
+
44
+ it "should form properly use symbols as parameters" do
45
+ RestClient::Payload::UrlEncoded.new({:foo => :bar}).to_s.
46
+ should == "foo=bar"
47
+ RestClient::Payload::UrlEncoded.new({:foo => {:bar => :baz }}).to_s.
48
+ should == "foo[bar]=baz"
49
+ end
50
+
51
+ it "should properly handle arrays as repeated parameters" do
52
+ RestClient::Payload::UrlEncoded.new({:foo => ['bar']}).to_s.
53
+ should == "foo[]=bar"
54
+ RestClient::Payload::UrlEncoded.new({:foo => ['bar', 'baz']}).to_s.
55
+ should == "foo[]=bar&foo[]=baz"
56
+ end
57
+
58
+ end
59
+
60
+ context "A multipart Payload" do
61
+ it "should use standard enctype as default content-type" do
62
+ m = RestClient::Payload::Multipart.new({})
63
+ m.stub!(:boundary).and_return(123)
64
+ m.headers['Content-Type'].should == 'multipart/form-data; boundary=123'
65
+ end
66
+
67
+ it "should form properly separated multipart data" do
68
+ m = RestClient::Payload::Multipart.new([[:bar, "baz"], [:foo, "bar"]])
69
+ m.to_s.should == <<-EOS
41
70
  --#{m.boundary}\r
42
- Content-Disposition: multipart/form-data; name="bar"\r
71
+ Content-Disposition: form-data; name="bar"\r
43
72
  \r
44
73
  baz\r
45
74
  --#{m.boundary}\r
46
- Content-Disposition: multipart/form-data; name="foo"\r
75
+ Content-Disposition: form-data; name="foo"\r
47
76
  \r
48
77
  bar\r
49
78
  --#{m.boundary}--\r
50
- EOS
51
- end
79
+ EOS
80
+ end
52
81
 
53
- it "should form properly seperated multipart data" do
54
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
55
- m = RestClient::Payload::Multipart.new({:foo => f})
56
- m.to_s.should == <<-EOS
82
+ it "should not escape parameters names" do
83
+ m = RestClient::Payload::Multipart.new([["bar ", "baz"]])
84
+ m.to_s.should == <<-EOS
57
85
  --#{m.boundary}\r
58
- Content-Disposition: multipart/form-data; name="foo"; filename="master_shake.jpg"\r
86
+ Content-Disposition: form-data; name="bar "\r
87
+ \r
88
+ baz\r
89
+ --#{m.boundary}--\r
90
+ EOS
91
+ end
92
+
93
+ it "should form properly separated multipart data" do
94
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
95
+ m = RestClient::Payload::Multipart.new({:foo => f})
96
+ m.to_s.should == <<-EOS
97
+ --#{m.boundary}\r
98
+ Content-Disposition: form-data; name="foo"; filename="master_shake.jpg"\r
99
+ Content-Type: image/jpeg\r
100
+ \r
101
+ #{IO.read(f.path)}\r
102
+ --#{m.boundary}--\r
103
+ EOS
104
+ end
105
+
106
+ it "should ignore the name attribute when it's not set" do
107
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
108
+ m = RestClient::Payload::Multipart.new({nil => f})
109
+ m.to_s.should == <<-EOS
110
+ --#{m.boundary}\r
111
+ Content-Disposition: form-data; filename="master_shake.jpg"\r
59
112
  Content-Type: image/jpeg\r
60
113
  \r
61
114
  #{IO.read(f.path)}\r
62
115
  --#{m.boundary}--\r
63
- EOS
64
- end
65
-
66
- it "should detect optional (original) content type and filename" do
67
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
68
- f.instance_eval "def content_type; 'text/plain'; end"
69
- f.instance_eval "def original_filename; 'foo.txt'; end"
70
- m = RestClient::Payload::Multipart.new({:foo => f})
71
- m.to_s.should == <<-EOS
116
+ EOS
117
+ end
118
+
119
+ it "should detect optional (original) content type and filename" do
120
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
121
+ f.instance_eval "def content_type; 'text/plain'; end"
122
+ f.instance_eval "def original_filename; 'foo.txt'; end"
123
+ m = RestClient::Payload::Multipart.new({:foo => f})
124
+ m.to_s.should == <<-EOS
72
125
  --#{m.boundary}\r
73
- Content-Disposition: multipart/form-data; name="foo"; filename="foo.txt"\r
126
+ Content-Disposition: form-data; name="foo"; filename="foo.txt"\r
74
127
  Content-Type: text/plain\r
75
128
  \r
76
129
  #{IO.read(f.path)}\r
77
130
  --#{m.boundary}--\r
78
- EOS
79
- end
131
+ EOS
132
+ end
80
133
 
81
- it "should handle hash in hash parameters" do
82
- m = RestClient::Payload::Multipart.new({:bar => {:baz => "foo"}})
83
- m.to_s.should == <<-EOS
134
+ it "should handle hash in hash parameters" do
135
+ m = RestClient::Payload::Multipart.new({:bar => {:baz => "foo"}})
136
+ m.to_s.should == <<-EOS
84
137
  --#{m.boundary}\r
85
- Content-Disposition: multipart/form-data; name="bar[baz]"\r
138
+ Content-Disposition: form-data; name="bar[baz]"\r
86
139
  \r
87
140
  foo\r
88
141
  --#{m.boundary}--\r
89
- EOS
142
+ EOS
90
143
 
91
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
92
- f.instance_eval "def content_type; 'text/plain'; end"
93
- f.instance_eval "def original_filename; 'foo.txt'; end"
94
- m = RestClient::Payload::Multipart.new({:foo => {:bar => f}})
95
- m.to_s.should == <<-EOS
144
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
145
+ f.instance_eval "def content_type; 'text/plain'; end"
146
+ f.instance_eval "def original_filename; 'foo.txt'; end"
147
+ m = RestClient::Payload::Multipart.new({:foo => {:bar => f}})
148
+ m.to_s.should == <<-EOS
96
149
  --#{m.boundary}\r
97
- Content-Disposition: multipart/form-data; name="foo[bar]"; filename="foo.txt"\r
150
+ Content-Disposition: form-data; name="foo[bar]"; filename="foo.txt"\r
98
151
  Content-Type: text/plain\r
99
152
  \r
100
153
  #{IO.read(f.path)}\r
101
154
  --#{m.boundary}--\r
102
- EOS
103
- end
104
-
105
- end
106
-
107
- context "Payload generation" do
108
- it "should recognize standard urlencoded params" do
109
- RestClient::Payload.generate({"foo" => 'bar'}).should be_kind_of(RestClient::Payload::UrlEncoded)
110
- end
111
-
112
- it "should recognize multipart params" do
113
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
114
- RestClient::Payload.generate({"foo" => f}).should be_kind_of(RestClient::Payload::Multipart)
115
- end
116
-
117
- it "should be multipart if forced" do
118
- RestClient::Payload.generate({"foo" => "bar", :multipart => true}).should be_kind_of(RestClient::Payload::Multipart)
119
- end
120
-
121
- it "should return data if no of the above" do
122
- RestClient::Payload.generate("data").should be_kind_of(RestClient::Payload::Base)
123
- end
124
-
125
- it "should recognize nested multipart payloads" do
126
- f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
127
- RestClient::Payload.generate({"foo" => {"file" => f}}).should be_kind_of(RestClient::Payload::Multipart)
128
- end
129
-
130
- end
155
+ EOS
156
+ end
157
+
158
+ end
159
+
160
+ context "streamed payloads" do
161
+ it "should properly determine the size of file payloads" do
162
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
163
+ payload = RestClient::Payload.generate(f)
164
+ payload.size.should == 22_545
165
+ payload.length.should == 22_545
166
+ end
167
+
168
+ it "should properly determine the size of other kinds of streaming payloads" do
169
+ s = StringIO.new 'foo'
170
+ payload = RestClient::Payload.generate(s)
171
+ payload.size.should == 3
172
+ payload.length.should == 3
173
+
174
+ begin
175
+ f = Tempfile.new "rest-client"
176
+ f.write 'foo bar'
177
+
178
+ payload = RestClient::Payload.generate(f)
179
+ payload.size.should == 7
180
+ payload.length.should == 7
181
+ ensure
182
+ f.close
183
+ end
184
+ end
185
+ end
186
+
187
+ context "Payload generation" do
188
+ it "should recognize standard urlencoded params" do
189
+ RestClient::Payload.generate({"foo" => 'bar'}).should be_kind_of(RestClient::Payload::UrlEncoded)
190
+ end
191
+
192
+ it "should recognize multipart params" do
193
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
194
+ RestClient::Payload.generate({"foo" => f}).should be_kind_of(RestClient::Payload::Multipart)
195
+ end
196
+
197
+ it "should be multipart if forced" do
198
+ RestClient::Payload.generate({"foo" => "bar", :multipart => true}).should be_kind_of(RestClient::Payload::Multipart)
199
+ end
200
+
201
+ it "should return data if no of the above" do
202
+ RestClient::Payload.generate("data").should be_kind_of(RestClient::Payload::Base)
203
+ end
204
+
205
+ it "should recognize nested multipart payloads" do
206
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
207
+ RestClient::Payload.generate({"foo" => {"file" => f}}).should be_kind_of(RestClient::Payload::Multipart)
208
+ end
209
+
210
+ it "should recognize file payloads that can be streamed" do
211
+ f = File.new(File.dirname(__FILE__) + "/master_shake.jpg")
212
+ RestClient::Payload.generate(f).should be_kind_of(RestClient::Payload::Streamed)
213
+ end
214
+
215
+ it "should recognize other payloads that can be streamed" do
216
+ RestClient::Payload.generate(StringIO.new('foo')).should be_kind_of(RestClient::Payload::Streamed)
217
+ end
218
+ end
131
219
  end
@@ -1,17 +1,17 @@
1
- require File.dirname(__FILE__) + '/base'
1
+ require File.join( File.dirname(File.expand_path(__FILE__)), 'base')
2
2
 
3
3
  describe RestClient::RawResponse do
4
- before do
5
- @tf = mock("Tempfile", :read => "the answer is 42", :open => true)
6
- @net_http_res = mock('net http response')
7
- @response = RestClient::RawResponse.new(@tf, @net_http_res)
8
- end
4
+ before do
5
+ @tf = mock("Tempfile", :read => "the answer is 42", :open => true)
6
+ @net_http_res = mock('net http response')
7
+ @response = RestClient::RawResponse.new(@tf, @net_http_res, {})
8
+ end
9
9
 
10
- it "behaves like string" do
11
- @response.to_s.should == 'the answer is 42'
12
- end
10
+ it "behaves like string" do
11
+ @response.to_s.should == 'the answer is 42'
12
+ end
13
13
 
14
- it "exposes a Tempfile" do
15
- @response.file.should == @tf
16
- end
14
+ it "exposes a Tempfile" do
15
+ @response.file.should == @tf
16
+ end
17
17
  end