taf2-curb 0.4.3.0 → 0.4.4.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -106,7 +106,16 @@ HTTP POST file upload:
106
106
  c.multipart_form_post = true
107
107
  c.http_post(Curl::PostField.file('myfile.rb'))
108
108
 
109
- Multi Interface:
109
+ Multi Interface (Basic):
110
+ easy_options = {:follow_location => true}
111
+ multi_options = {:pipeline => true}
112
+
113
+ Curl::Multi.get('url1','url2','url3','url4','url5', easy_options, multi_options) do|easy|
114
+ # do something interesting with the easy response
115
+ puts easy.last_effective_url
116
+ end
117
+
118
+ Multi Interface (Advanced):
110
119
  responses = {}
111
120
  requests = ["http://www.google.co.uk/", "http://www.ruby-lang.org/"]
112
121
  m = Curl::Multi.new
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.4.3.0"
24
- #define CURB_VER_NUM 430
23
+ #define CURB_VERSION "0.4.4.0"
24
+ #define CURB_VER_NUM 440
25
25
  #define CURB_VER_MAJ 0
26
26
  #define CURB_VER_MIN 4
27
- #define CURB_VER_MIC 3
27
+ #define CURB_VER_MIC 4
28
28
  #define CURB_VER_PATCH 0
29
29
 
30
30
 
data/ext/curb_easy.c CHANGED
@@ -678,6 +678,58 @@ static VALUE ruby_curl_easy_useragent_get(VALUE self) {
678
678
  CURB_OBJECT_GETTER(ruby_curl_easy, useragent);
679
679
  }
680
680
 
681
+ /*
682
+ * call-seq:
683
+ * easy.post_body = "some=form%20data&to=send" => string or nil
684
+ *
685
+ * Sets the POST body of this Curl::Easy instance. This is expected to be
686
+ * URL encoded; no additional processing or encoding is done on the string.
687
+ * The content-type header will be set to application/x-www-form-urlencoded.
688
+ *
689
+ * This is handy if you want to perform a POST against a Curl::Multi instance.
690
+ */
691
+ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
692
+ ruby_curl_easy *rbce;
693
+ CURL *curl;
694
+
695
+ char *data;
696
+ long len;
697
+
698
+ Data_Get_Struct(self, ruby_curl_easy, rbce);
699
+
700
+ curl = rbce->curl;
701
+
702
+ if ( post_body == Qnil ) {
703
+ rbce->postdata_buffer = Qnil;
704
+
705
+ } else {
706
+ data = StringValuePtr(post_body);
707
+ len = RSTRING_LEN(post_body);
708
+
709
+ // Store the string, since it has to hang around for the duration of the
710
+ // request. See CURLOPT_POSTFIELDS in the libcurl docs.
711
+ rbce->postdata_buffer = post_body;
712
+
713
+ curl_easy_setopt(curl, CURLOPT_POST, 1);
714
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
715
+ curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, len);
716
+
717
+ return post_body;
718
+ }
719
+
720
+ return Qnil;
721
+ }
722
+
723
+ /*
724
+ * call-seq:
725
+ * easy.post_body => "string" or nil
726
+ *
727
+ * Obtain the POST body used in this Curl::Easy instance.
728
+ */
729
+ static VALUE ruby_curl_easy_post_body_get(VALUE self) {
730
+ CURB_OBJECT_GETTER(ruby_curl_easy, postdata_buffer);
731
+ }
732
+
681
733
  /* ================== IMMED ATTRS ==================*/
682
734
 
683
735
  /*
@@ -1789,7 +1841,7 @@ static VALUE handle_perform(VALUE self, ruby_curl_easy *rbce) {
1789
1841
  if (result != 0) {
1790
1842
  // printf("error: %s\n", errors);
1791
1843
  if (rbce->failure_proc != Qnil) {
1792
- rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, INT2FIX(result) );
1844
+ rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, rb_curl_easy_error(result) );
1793
1845
  } else {
1794
1846
  raise_curl_easy_error_exception(result);
1795
1847
  }
@@ -1801,7 +1853,7 @@ static VALUE handle_perform(VALUE self, ruby_curl_easy *rbce) {
1801
1853
  }
1802
1854
  else if (rbce->failure_proc != Qnil &&
1803
1855
  (response_code >= 300 && response_code <= 999)) {
1804
- rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, INT2FIX(result) );
1856
+ rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, rb_curl_easy_error(result) );
1805
1857
  }
1806
1858
 
1807
1859
  return Qtrue;
@@ -1925,19 +1977,12 @@ static VALUE ruby_curl_easy_perform_post(int argc, VALUE *argv, VALUE self) {
1925
1977
 
1926
1978
  return ret;
1927
1979
  } else {
1928
- long len;
1929
- char *data;
1930
-
1931
- if ((rbce->postdata_buffer = rb_funcall(args_ary, idJoin, 1, rbstrAmp)) == Qnil) {
1980
+ VALUE post_body;
1981
+ if ((post_body = rb_funcall(args_ary, idJoin, 1, rbstrAmp)) == Qnil) {
1932
1982
  rb_raise(eCurlErrError, "Failed to join arguments");
1933
1983
  return Qnil;
1934
1984
  } else {
1935
- data = StringValuePtr(rbce->postdata_buffer);
1936
- len = RSTRING_LEN(rbce->postdata_buffer);
1937
-
1938
- curl_easy_setopt(curl, CURLOPT_POST, 1);
1939
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
1940
- curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, len);
1985
+ ruby_curl_easy_post_body_set(self, post_body);
1941
1986
 
1942
1987
  return handle_perform(self,rbce);
1943
1988
  }
@@ -2847,6 +2892,8 @@ void init_curb_easy() {
2847
2892
  rb_define_method(cCurlEasy, "encoding", ruby_curl_easy_encoding_get, 0);
2848
2893
  rb_define_method(cCurlEasy, "useragent=", ruby_curl_easy_useragent_set, 1);
2849
2894
  rb_define_method(cCurlEasy, "useragent", ruby_curl_easy_useragent_get, 0);
2895
+ rb_define_method(cCurlEasy, "post_body=", ruby_curl_easy_post_body_set, 1);
2896
+ rb_define_method(cCurlEasy, "post_body", ruby_curl_easy_post_body_get, 0);
2850
2897
 
2851
2898
  rb_define_method(cCurlEasy, "local_port=", ruby_curl_easy_local_port_set, 1);
2852
2899
  rb_define_method(cCurlEasy, "local_port", ruby_curl_easy_local_port_get, 0);
data/ext/curb_errors.c CHANGED
@@ -121,8 +121,7 @@ VALUE mCurlErrUnknownOption;
121
121
  VALUE eCurlErrInvalidPostField;
122
122
 
123
123
 
124
- /* rb_raise an approriate exception for the supplied CURLcode */
125
- void raise_curl_easy_error_exception(CURLcode code) {
124
+ VALUE rb_curl_easy_error(CURLcode code) {
126
125
  VALUE exclz;
127
126
  const char *exmsg = NULL;
128
127
 
@@ -437,9 +436,17 @@ void raise_curl_easy_error_exception(CURLcode code) {
437
436
  exmsg = curl_easy_strerror(code);
438
437
  }
439
438
 
440
- rb_raise(exclz, exmsg);
439
+ VALUE results = rb_ary_new2(2);
440
+ rb_ary_push(results, exclz);
441
+ rb_ary_push(results, rb_str_new2(exmsg));
442
+ return results;
441
443
  }
442
- void raise_curl_multi_error_exception(CURLMcode code) {
444
+ /* rb_raise an approriate exception for the supplied CURLcode */
445
+ void raise_curl_easy_error_exception(CURLcode code) {
446
+ VALUE obj = rb_curl_easy_error(code);
447
+ rb_raise(rb_ary_entry(obj,0), RSTRING_PTR(rb_ary_entry(obj,1)));
448
+ }
449
+ VALUE rb_curl_multi_error(CURLMcode code) {
443
450
  VALUE exclz;
444
451
  const char *exmsg = NULL;
445
452
 
@@ -478,7 +485,14 @@ void raise_curl_multi_error_exception(CURLMcode code) {
478
485
  exmsg = curl_multi_strerror(code);
479
486
  }
480
487
 
481
- rb_raise(exclz, exmsg);
488
+ VALUE results = rb_ary_new2(2);
489
+ rb_ary_push(results, exclz);
490
+ rb_ary_push(results, rb_str_new2(exmsg));
491
+ return results;
492
+ }
493
+ void raise_curl_multi_error_exception(CURLMcode code) {
494
+ VALUE obj = rb_curl_multi_error(code);
495
+ rb_raise(rb_ary_entry(obj,0), RSTRING_PTR(rb_ary_entry(obj,1)));
482
496
  }
483
497
 
484
498
  void init_curb_errors() {
data/ext/curb_errors.h CHANGED
@@ -122,5 +122,7 @@ extern VALUE eCurlErrInvalidPostField;
122
122
  void init_curb_errors();
123
123
  void raise_curl_easy_error_exception(CURLcode code);
124
124
  void raise_curl_multi_error_exception(CURLMcode code);
125
+ VALUE rb_curl_easy_error(CURLcode code);
126
+ VALUE rb_curl_multi_error(CURLMcode code);
125
127
 
126
128
  #endif
data/ext/curb_multi.c CHANGED
@@ -1,8 +1,7 @@
1
- /* curb_easy.c - Curl easy mode
1
+ /* curb_multi.c - Curl multi mode
2
2
  * Copyright (c)2008 Todd A. Fisher.
3
3
  * Licensed under the Ruby License. See LICENSE for details.
4
4
  *
5
- * $Id$
6
5
  */
7
6
 
8
7
  #include "curb_config.h"
@@ -58,14 +57,16 @@ static void curl_multi_flush_easy(VALUE key, VALUE easy, ruby_curl_multi *rbcm)
58
57
  }
59
58
 
60
59
  static void curl_multi_free(ruby_curl_multi *rbcm) {
60
+
61
61
  //printf("hash entries: %d\n", RHASH(rbcm->requests)->tbl->num_entries );
62
- if (rbcm && RHASH_LEN(rbcm->requests) > 0) {
62
+ if (rbcm && !rbcm->requests == Qnil && rb_type(rbcm->requests) == T_HASH && RHASH_LEN(rbcm->requests) > 0) {
63
+
63
64
  rb_hash_foreach( rbcm->requests, (int (*)())curl_multi_flush_easy, (VALUE)rbcm );
64
65
 
65
- curl_multi_cleanup(rbcm->handle);
66
66
  //rb_hash_clear(rbcm->requests)
67
67
  rbcm->requests = Qnil;
68
68
  }
69
+ curl_multi_cleanup(rbcm->handle);
69
70
  free(rbcm);
70
71
  }
71
72
 
@@ -257,7 +258,7 @@ static void rb_curl_multi_read_info(VALUE self, CURLM *multi_handle) {
257
258
 
258
259
  if (result != 0) {
259
260
  if (rbce->failure_proc != Qnil) {
260
- rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, INT2FIX(result) );
261
+ rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, rb_curl_easy_error(result) );
261
262
  }
262
263
  }
263
264
  else if (rbce->success_proc != Qnil &&
@@ -267,7 +268,7 @@ static void rb_curl_multi_read_info(VALUE self, CURLM *multi_handle) {
267
268
  }
268
269
  else if (rbce->failure_proc != Qnil &&
269
270
  (response_code >= 300 && response_code <= 999)) {
270
- rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, INT2FIX(result) );
271
+ rb_funcall( rbce->failure_proc, idCall, 2, rbce->self, rb_curl_easy_error(result) );
271
272
  }
272
273
  rbce->self = Qnil;
273
274
  }
@@ -0,0 +1,10 @@
1
+ # From safis http://github.com/taf2/curb/issues#issue/5
2
+ # irb: require 'curb'
3
+ # irb: multi = Curl::Multi.new
4
+ # irb: exit
5
+ # <main>:47140: [BUG] Bus Error
6
+ $:.unshift File.join(File.dirname(__FILE__),'..','ext')
7
+ $:.unshift File.join(File.dirname(__FILE__),'..','lib')
8
+ require 'curb'
9
+ multi = Curl::Multi.new
10
+ exit
data/tests/helper.rb CHANGED
@@ -72,7 +72,7 @@ class TestServlet < WEBrick::HTTPServlet::AbstractServlet
72
72
  end
73
73
 
74
74
  def do_POST(req,res)
75
- respond_with(:POST,req,res)
75
+ respond_with("POST\n#{req.body}",req,res)
76
76
  end
77
77
 
78
78
  def do_PUT(req,res)
@@ -497,7 +497,25 @@ class TestCurbCurlEasy < Test::Unit::TestCase
497
497
  def test_post_remote
498
498
  curl = Curl::Easy.new(TestServlet.url)
499
499
  curl.http_post
500
- assert_equal 'POST', curl.body_str
500
+ assert_equal "POST\n", curl.body_str
501
+ end
502
+
503
+ def test_post_with_body_remote
504
+ curl = Curl::Easy.new(TestServlet.url)
505
+ curl.post_body = 'foo=bar&encoded%20string=val'
506
+
507
+ curl.perform
508
+
509
+ assert_equal "POST\nfoo=bar&encoded%20string=val", curl.body_str
510
+ assert_equal 'foo=bar&encoded%20string=val', curl.post_body
511
+ end
512
+
513
+ def test_form_post_body_remote
514
+ curl = Curl::Easy.new(TestServlet.url)
515
+ curl.http_post('foo=bar', 'encoded%20string=val')
516
+
517
+ assert_equal "POST\nfoo=bar&encoded%20string=val", curl.body_str
518
+ assert_equal 'foo=bar&encoded%20string=val', curl.post_body
501
519
  end
502
520
 
503
521
  def test_delete_remote
@@ -146,7 +146,10 @@ class TestCurbCurlMulti < Test::Unit::TestCase
146
146
  end
147
147
 
148
148
  c1.on_failure do|c,rc|
149
- #puts "failure called: #{c.body_str.inspect}"
149
+ # rc => [Curl::Err::MalformedURLError, "URL using bad/illegal format or missing URL"]
150
+ assert_equal Curl::Easy, c.class
151
+ assert_equal Curl::Err::MalformedURLError, rc.first
152
+ assert_equal "URL using bad/illegal format or missing URL", rc.last
150
153
  end
151
154
 
152
155
  c2.on_success do|c|
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.4.3.0
4
+ version: 0.4.4.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-07-02 00:00:00 -07:00
13
+ date: 2009-07-12 00:00:00 -07:00
14
14
  default_executable:
15
15
  dependencies: []
16
16
 
@@ -83,4 +83,5 @@ test_files:
83
83
  - tests/alltests.rb
84
84
  - tests/helper.rb
85
85
  - tests/tc_curl_easy.rb
86
+ - tests/bug_multi_segfault.rb
86
87
  - tests/require_last_or_segfault_script.rb