taf2-curb 0.5.1.0 → 0.5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +8 -7
- data/ext/curb.h +3 -3
- data/ext/curb_easy.c +32 -5
- data/lib/curb.rb +70 -3
- data/tests/tc_curl_multi.rb +23 -0
- metadata +16 -16
data/README
CHANGED
@@ -17,9 +17,9 @@ Ruby license. See the LICENSE file for the gory details.
|
|
17
17
|
|
18
18
|
## You will need
|
19
19
|
|
20
|
-
+ A working Ruby installation (1.8+, tested with 1.8.
|
21
|
-
+ A working (lib)curl installation, with development stuff (7.5+, tested with 7.
|
22
|
-
+ A sane build environment
|
20
|
+
+ A working Ruby installation (1.8+, tested with 1.8.6, 1.8.7, 1.9.1, and 1.9.2)
|
21
|
+
+ A working (lib)curl installation, with development stuff (7.5+, tested with 7.19.x)
|
22
|
+
+ A sane build environment (e.g. gcc, make)
|
23
23
|
|
24
24
|
## Installation...
|
25
25
|
|
@@ -36,10 +36,9 @@ them like so:
|
|
36
36
|
|
37
37
|
$ rake install EXTCONF_OPTS='--with-curl-dir=/path/to/libcurl --prefix=/what/ever'
|
38
38
|
|
39
|
-
|
39
|
+
Curb is tested only on GNU/Linux x86 and Mac OSX - YMMV on other platforms.
|
40
40
|
If you do use another platform and experience problems, or if you can
|
41
|
-
expand on the above instructions, please
|
42
|
-
list on Curb's Rubyforge page.
|
41
|
+
expand on the above instructions, please report the issue at http://github.com/taf2/curb/issues
|
43
42
|
|
44
43
|
Curb has fairly extensive RDoc comments in the source. You can build the
|
45
44
|
documentation with:
|
@@ -106,7 +105,7 @@ documentation with:
|
|
106
105
|
c.multipart_form_post = true
|
107
106
|
c.http_post(Curl::PostField.file('myfile.rb'))
|
108
107
|
|
109
|
-
### Multi Interface (Basic):
|
108
|
+
### Multi Interface (Basic HTTP GET):
|
110
109
|
|
111
110
|
# make multiple GET requests
|
112
111
|
easy_options = {:follow_location => true}
|
@@ -117,6 +116,8 @@ documentation with:
|
|
117
116
|
puts easy.last_effective_url
|
118
117
|
end
|
119
118
|
|
119
|
+
### Multi Interface (Basic HTTP POST):
|
120
|
+
|
120
121
|
# make multiple POST requests
|
121
122
|
easy_options = {:follow_location => true, :multipart_form_post => true}
|
122
123
|
multi_options = {:pipeline => true}
|
data/ext/curb.h
CHANGED
@@ -20,11 +20,11 @@
|
|
20
20
|
#include "curb_macros.h"
|
21
21
|
|
22
22
|
// These should be managed from the Rake 'release' task.
|
23
|
-
#define CURB_VERSION "0.5.
|
24
|
-
#define CURB_VER_NUM
|
23
|
+
#define CURB_VERSION "0.5.2.0"
|
24
|
+
#define CURB_VER_NUM 520
|
25
25
|
#define CURB_VER_MAJ 0
|
26
26
|
#define CURB_VER_MIN 5
|
27
|
-
#define CURB_VER_MIC
|
27
|
+
#define CURB_VER_MIC 2
|
28
28
|
#define CURB_VER_PATCH 0
|
29
29
|
|
30
30
|
|
data/ext/curb_easy.c
CHANGED
@@ -1954,6 +1954,27 @@ static VALUE ruby_curl_easy_set_head_option(VALUE self, VALUE onoff) {
|
|
1954
1954
|
|
1955
1955
|
return onoff;
|
1956
1956
|
}
|
1957
|
+
/*
|
1958
|
+
*call-seq:
|
1959
|
+
* easy = Curl::Easy.new("url") do|c|
|
1960
|
+
* c.delete = true
|
1961
|
+
* end
|
1962
|
+
* easy.perform
|
1963
|
+
*/
|
1964
|
+
static VALUE ruby_curl_easy_set_delete_option(VALUE self, VALUE onoff) {
|
1965
|
+
ruby_curl_easy *rbce;
|
1966
|
+
|
1967
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
1968
|
+
|
1969
|
+
if( onoff == Qtrue ) {
|
1970
|
+
curl_easy_setopt(rbce->curl, CURLOPT_CUSTOMREQUEST, "DELETE");
|
1971
|
+
}
|
1972
|
+
else {
|
1973
|
+
curl_easy_setopt(rbce->curl, CURLOPT_CUSTOMREQUEST, NULL);
|
1974
|
+
}
|
1975
|
+
|
1976
|
+
return onoff;
|
1977
|
+
}
|
1957
1978
|
|
1958
1979
|
/*
|
1959
1980
|
* call-seq:
|
@@ -2554,11 +2575,16 @@ static VALUE ruby_curl_easy_inspect(VALUE self) {
|
|
2554
2575
|
char buf[64];
|
2555
2576
|
ruby_curl_easy *rbce;
|
2556
2577
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
2557
|
-
|
2558
|
-
|
2559
|
-
|
2560
|
-
|
2561
|
-
|
2578
|
+
/* if we don't have a url set... we'll crash... */
|
2579
|
+
if(rbce->url != Qnil && rb_type(rbce->url) == T_STRING) {
|
2580
|
+
size_t len = 13+((RSTRING_LEN(rbce->url) > 50) ? 50 : RSTRING_LEN(rbce->url));
|
2581
|
+
/* "#<Net::HTTP http://www.google.com/:80 open=false>" */
|
2582
|
+
memcpy(buf,"#<Curl::Easy ", 13);
|
2583
|
+
memcpy(buf+13,RSTRING_PTR(rbce->url), (len - 13));
|
2584
|
+
buf[len-1] = '>';
|
2585
|
+
return rb_str_new(buf,len);
|
2586
|
+
}
|
2587
|
+
return rb_str_new2("#<Curl::Easy");
|
2562
2588
|
}
|
2563
2589
|
|
2564
2590
|
|
@@ -2847,6 +2873,7 @@ void init_curb_easy() {
|
|
2847
2873
|
rb_define_method(cCurlEasy, "http_head", ruby_curl_easy_perform_head, 0);
|
2848
2874
|
rb_define_method(cCurlEasy, "http_put", ruby_curl_easy_perform_put, 1);
|
2849
2875
|
rb_define_method(cCurlEasy, "head=", ruby_curl_easy_set_head_option, 1);
|
2876
|
+
rb_define_method(cCurlEasy, "delete=", ruby_curl_easy_set_delete_option, 1);
|
2850
2877
|
|
2851
2878
|
/* Post-perform info methods */
|
2852
2879
|
rb_define_method(cCurlEasy, "body_str", ruby_curl_easy_body_str_get, 0);
|
data/lib/curb.rb
CHANGED
@@ -106,20 +106,87 @@ module Curl
|
|
106
106
|
|
107
107
|
urls_with_config.each do|conf|
|
108
108
|
c = conf.dup # avoid being destructive to input
|
109
|
-
url
|
110
|
-
fields
|
111
|
-
|
109
|
+
url = c.delete(:url)
|
110
|
+
fields = c.delete(:post_fields)
|
111
|
+
headers = c.delete(:headers)
|
112
|
+
|
113
|
+
easy = Curl::Easy.new(url)
|
112
114
|
# set the post post using the url fields
|
113
115
|
easy.post_body = fields.map{|f,k| "#{easy.escape(f)}=#{easy.escape(k)}"}.join('&')
|
114
116
|
# configure the easy handle
|
115
117
|
easy_options.each do|k,v|
|
116
118
|
easy.send("#{k}=",v)
|
117
119
|
end
|
120
|
+
|
121
|
+
# headers is a special key
|
122
|
+
headers.each {|k,v| easy.headers[k] = v } if headers
|
123
|
+
|
118
124
|
easy.on_complete {|curl| blk.call curl } if blk
|
119
125
|
m.add(easy)
|
120
126
|
end
|
121
127
|
m.perform
|
122
128
|
end
|
129
|
+
|
130
|
+
# call-seq:
|
131
|
+
#
|
132
|
+
# Curl::Multi.http( [
|
133
|
+
# { :url => 'url1', :method => :post,
|
134
|
+
# :post_fields => {'field1' => 'value1', 'field2' => 'value2'} },
|
135
|
+
# { :url => 'url2', :method => :get,
|
136
|
+
# :follow_location => true, :max_redirects => 3 },
|
137
|
+
# { :url => 'url3', :method => :put, :put_data => File.open('file.txt','rb') },
|
138
|
+
# { :url => 'url4', :method => :head }
|
139
|
+
# ], {:pipeline => true})
|
140
|
+
#
|
141
|
+
# Blocking call to issue multiple HTTP requests with varying verb's.
|
142
|
+
#
|
143
|
+
# urls_with_config: is a hash of url's pointing to the easy handle options as well as the special option :method, that can by one of [:get, :post, :put, :delete, :head], when no verb is provided e.g. :method => nil -> GET is used
|
144
|
+
# multi_options: options for the multi handle
|
145
|
+
# blk: a callback, that yeilds when a handle is completed
|
146
|
+
#
|
147
|
+
def http(urls_with_config, multi_options, &blk)
|
148
|
+
m = Curl::Multi.new
|
149
|
+
# configure the multi handle
|
150
|
+
multi_options.each { |k,v| m.send("#{k}=", v) }
|
151
|
+
|
152
|
+
urls_with_config.each do|conf|
|
153
|
+
c = conf.dup # avoid being destructive to input
|
154
|
+
url = c.delete(:url)
|
155
|
+
method = c.delete(:method)
|
156
|
+
headers = c.delete(:headers)
|
157
|
+
|
158
|
+
easy = Curl::Easy.new(url)
|
159
|
+
|
160
|
+
case method
|
161
|
+
when :post
|
162
|
+
fields = c.delete(:post_fields)
|
163
|
+
# set the post post using the url fields
|
164
|
+
easy.post_body = fields.map{|f,k| "#{easy.escape(f)}=#{easy.escape(k)}"}.join('&')
|
165
|
+
when :put
|
166
|
+
easy.put_data = c.delete(:put_data)
|
167
|
+
when :head
|
168
|
+
easy.head = true
|
169
|
+
when :delete
|
170
|
+
easy.delete = true
|
171
|
+
when :get
|
172
|
+
else
|
173
|
+
# XXX: nil is treated like a GET
|
174
|
+
end
|
175
|
+
|
176
|
+
# headers is a special key
|
177
|
+
headers.each {|k,v| easy.headers[k] = v } if headers
|
178
|
+
|
179
|
+
#
|
180
|
+
# use the remaining options as specific configuration to the easy handle
|
181
|
+
# bad options should raise an undefined method error
|
182
|
+
#
|
183
|
+
c.each { |k,v| easy.send("#{k}=",v) }
|
184
|
+
|
185
|
+
easy.on_complete {|curl,code| blk.call(curl,code,method) } if blk
|
186
|
+
m.add(easy)
|
187
|
+
end
|
188
|
+
m.perform
|
189
|
+
end
|
123
190
|
end
|
124
191
|
end
|
125
192
|
end
|
data/tests/tc_curl_multi.rb
CHANGED
@@ -325,6 +325,29 @@ class TestCurbCurlMulti < Test::Unit::TestCase
|
|
325
325
|
end
|
326
326
|
end
|
327
327
|
|
328
|
+
def test_multi_easy_http_01
|
329
|
+
urls = [
|
330
|
+
{ :url => TestServlet.url + '?q=1', :method => :post, :post_fields => {'field1' => 'value1', 'k' => 'j'}},
|
331
|
+
{ :url => TestServlet.url + '?q=2', :method => :post, :post_fields => {'field2' => 'value2', 'foo' => 'bar', 'i' => 'j' }},
|
332
|
+
{ :url => TestServlet.url + '?q=3', :method => :post, :post_fields => {'field3' => 'value3', 'field4' => 'value4'}},
|
333
|
+
{ :url => TestServlet.url, :method => :put, :put_data => "message",
|
334
|
+
:headers => {'Content-Type' => 'application/json' } },
|
335
|
+
{ :url => TestServlet.url, :method => :get }
|
336
|
+
]
|
337
|
+
Curl::Multi.http(urls, {:pipeline => true}) do|easy, code, method|
|
338
|
+
assert_equal nil, code
|
339
|
+
case method
|
340
|
+
when :post
|
341
|
+
assert_match /POST/, easy.body_str
|
342
|
+
when :get
|
343
|
+
assert_match /GET/, easy.body_str
|
344
|
+
when :put
|
345
|
+
assert_match /PUT/, easy.body_str
|
346
|
+
end
|
347
|
+
#puts "#{easy.body_str.inspect}, #{method.inspect}, #{code.inspect}"
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
328
351
|
def test_mutli_recieves_500
|
329
352
|
m = Curl::Multi.new
|
330
353
|
e = Curl::Easy.new("http://127.0.0.1:9129/methods")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: taf2-curb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ross Bamford
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2009-08-
|
13
|
+
date: 2009-08-23 00:00:00 -07:00
|
14
14
|
default_executable:
|
15
15
|
dependencies: []
|
16
16
|
|
@@ -32,18 +32,18 @@ files:
|
|
32
32
|
- lib/curb.rb
|
33
33
|
- lib/curl.rb
|
34
34
|
- ext/curb.c
|
35
|
-
- ext/curb_easy.c
|
36
|
-
- ext/curb_errors.c
|
37
|
-
- ext/curb_multi.c
|
38
35
|
- ext/curb_postfield.c
|
36
|
+
- ext/curb_multi.c
|
37
|
+
- ext/curb_errors.c
|
38
|
+
- ext/curb_easy.c
|
39
39
|
- ext/curb_upload.c
|
40
|
-
- ext/curb.h
|
41
40
|
- ext/curb_easy.h
|
42
41
|
- ext/curb_errors.h
|
42
|
+
- ext/curb_upload.h
|
43
43
|
- ext/curb_macros.h
|
44
|
-
- ext/
|
44
|
+
- ext/curb.h
|
45
45
|
- ext/curb_postfield.h
|
46
|
-
- ext/
|
46
|
+
- ext/curb_multi.h
|
47
47
|
has_rdoc: true
|
48
48
|
homepage: http://curb.rubyforge.org/
|
49
49
|
licenses:
|
@@ -74,15 +74,15 @@ signing_key:
|
|
74
74
|
specification_version: 2
|
75
75
|
summary: Ruby libcurl bindings
|
76
76
|
test_files:
|
77
|
-
- tests/
|
77
|
+
- tests/tc_curl_multi.rb
|
78
|
+
- tests/tc_curl_postfield.rb
|
78
79
|
- tests/bug_curb_easy_blocks_ruby_threads.rb
|
79
|
-
- tests/
|
80
|
-
- tests/bug_multi_segfault.rb
|
80
|
+
- tests/unittests.rb
|
81
81
|
- tests/bug_require_last_or_segfault.rb
|
82
|
-
- tests/
|
83
|
-
- tests/require_last_or_segfault_script.rb
|
82
|
+
- tests/bug_instance_post_differs_from_class_post.rb
|
84
83
|
- tests/tc_curl_download.rb
|
84
|
+
- tests/alltests.rb
|
85
|
+
- tests/helper.rb
|
85
86
|
- tests/tc_curl_easy.rb
|
86
|
-
- tests/
|
87
|
-
- tests/
|
88
|
-
- tests/unittests.rb
|
87
|
+
- tests/bug_multi_segfault.rb
|
88
|
+
- tests/require_last_or_segfault_script.rb
|