taf2-curb 0.4.3.0 → 0.4.4.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
@@ -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