taf2-curb 0.5.1.0 → 0.5.2.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.
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.5, 1.8.6, 1.8.7, and 1.9.1)
21
- + A working (lib)curl installation, with development stuff (7.5+, tested with 7.15)
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
- Currently, Curb is tested only on GNU/Linux x86 - YMMV on other platforms.
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 get in touch via the mailing
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.1.0"
24
- #define CURB_VER_NUM 510
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 1
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
- // "#<Net::HTTP http://www.google.com/:80 open=false>"
2558
- snprintf(buf,sizeof(buf),"#<Curl::Easy %s", RSTRING_PTR(rbce->url));
2559
- size_t r = strlen(buf);
2560
- buf[r-1] = '>';
2561
- return rb_str_new(buf,r);
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 = c.delete(:url)
110
- fields = c.delete(:post_fields)
111
- easy = Curl::Easy.new(url)
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
@@ -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.1.0
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-11 00:00:00 -07:00
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/curb_multi.h
44
+ - ext/curb.h
45
45
  - ext/curb_postfield.h
46
- - ext/curb_upload.h
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/alltests.rb
77
+ - tests/tc_curl_multi.rb
78
+ - tests/tc_curl_postfield.rb
78
79
  - tests/bug_curb_easy_blocks_ruby_threads.rb
79
- - tests/bug_instance_post_differs_from_class_post.rb
80
- - tests/bug_multi_segfault.rb
80
+ - tests/unittests.rb
81
81
  - tests/bug_require_last_or_segfault.rb
82
- - tests/helper.rb
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/tc_curl_multi.rb
87
- - tests/tc_curl_postfield.rb
88
- - tests/unittests.rb
87
+ - tests/bug_multi_segfault.rb
88
+ - tests/require_last_or_segfault_script.rb