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 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