curb 0.7.18 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -120,7 +120,7 @@ Same thing, more manual:
120
120
 
121
121
  c = Curl::Easy.new("http://my.rails.box/files/upload")
122
122
  c.multipart_form_post = true
123
- c.http_post(Curl::PostField.file('myfile.rb'))
123
+ c.http_post(Curl::PostField.file('thing[file]', 'myfile.rb'))
124
124
 
125
125
  ### Multi Interface (Basic HTTP GET):
126
126
 
data/ext/curb.h CHANGED
@@ -20,12 +20,12 @@
20
20
  #include "curb_macros.h"
21
21
 
22
22
  // These should be managed from the Rake 'release' task.
23
- #define CURB_VERSION "0.7.18"
24
- #define CURB_VER_NUM 718
23
+ #define CURB_VERSION "0.8.0"
24
+ #define CURB_VER_NUM 800
25
25
  #define CURB_VER_MAJ 0
26
- #define CURB_VER_MIN 7
27
- #define CURB_VER_MIC 1
28
- #define CURB_VER_PATCH 8
26
+ #define CURB_VER_MIN 8
27
+ #define CURB_VER_MIC 0
28
+ #define CURB_VER_PATCH 0
29
29
 
30
30
 
31
31
  // Maybe not yet defined in Ruby
@@ -219,6 +219,7 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
219
219
  rbce->ssl_version = -1;
220
220
  rbce->use_ssl = -1;
221
221
  rbce->ftp_filemethod = -1;
222
+ rbce->resolve_mode = CURL_IPRESOLVE_WHATEVER;
222
223
 
223
224
  /* bool opts */
224
225
  rbce->proxy_tunnel = 0;
@@ -1715,6 +1716,36 @@ static VALUE ruby_curl_easy_on_failure_set(int argc, VALUE *argv, VALUE self) {
1715
1716
  CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, failure_proc);
1716
1717
  }
1717
1718
 
1719
+ /*
1720
+ * call-seq:
1721
+ * easy.on_missing {|easy,code| ... } => <old handler;>
1722
+ *
1723
+ * Assign or remove the on_missing handler for this Curl::Easy instance.
1724
+ * To remove a previously-supplied handler, call this method with no attached
1725
+ * block.
1726
+ *
1727
+ * The +on_missing+ handler is called when request is finished with a
1728
+ * status of 40x
1729
+ */
1730
+ static VALUE ruby_curl_easy_on_missing_set(int argc, VALUE *argv, VALUE self) {
1731
+ CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, missing_proc);
1732
+ }
1733
+
1734
+ /*
1735
+ * call-seq:
1736
+ * easy.on_redirect {|easy,code| ... } => <old handler;>
1737
+ *
1738
+ * Assign or remove the on_redirect handler for this Curl::Easy instance.
1739
+ * To remove a previously-supplied handler, call this method with no attached
1740
+ * block.
1741
+ *
1742
+ * The +on_redirect+ handler is called when request is finished with a
1743
+ * status of 30x
1744
+ */
1745
+ static VALUE ruby_curl_easy_on_redirect_set(int argc, VALUE *argv, VALUE self) {
1746
+ CURB_HANDLER_PROC_HSETTER(ruby_curl_easy, redirect_proc);
1747
+ }
1748
+
1718
1749
  /*
1719
1750
  * call-seq:
1720
1751
  * easy.on_complete {|easy| ... } => <old handler>
@@ -1856,7 +1887,6 @@ VALUE ruby_curl_easy_setup( ruby_curl_easy *rbce ) {
1856
1887
 
1857
1888
  url = rb_check_string_type(_url);
1858
1889
 
1859
- // Need to configure the handler as per settings in rbce
1860
1890
  curl_easy_setopt(curl, CURLOPT_URL, StringValuePtr(url));
1861
1891
 
1862
1892
  // network stuff and auth
@@ -2291,6 +2321,17 @@ static VALUE ruby_curl_easy_perform_post(int argc, VALUE *argv, VALUE self) {
2291
2321
  for (i = 0; i < argc; i++) {
2292
2322
  if (rb_obj_is_instance_of(argv[i], cCurlPostField)) {
2293
2323
  append_to_form(argv[i], &first, &last);
2324
+ } else if (rb_type(argv[i]) == T_ARRAY) {
2325
+ // see: https://github.com/rvanlieshout/curb/commit/8bcdefddc0162484681ebd1a92d52a642666a445
2326
+ int c = 0, argv_len = (int)RARRAY_LEN(argv[i]);
2327
+ for (; c < argv_len; ++c) {
2328
+ if (rb_obj_is_instance_of(rb_ary_entry(argv[i],c), cCurlPostField)) {
2329
+ append_to_form(rb_ary_entry(argv[i],c), &first, &last);
2330
+ } else {
2331
+ rb_raise(eCurlErrInvalidPostField, "You must use PostFields only with multipart form posts");
2332
+ return Qnil;
2333
+ }
2334
+ }
2294
2335
  } else {
2295
2336
  rb_raise(eCurlErrInvalidPostField, "You must use PostFields only with multipart form posts");
2296
2337
  return Qnil;
@@ -2364,10 +2405,9 @@ static VALUE ruby_curl_easy_set_head_option(VALUE self, VALUE onoff) {
2364
2405
 
2365
2406
  Data_Get_Struct(self, ruby_curl_easy, rbce);
2366
2407
 
2367
- if( onoff == Qtrue ) {
2408
+ if (onoff == Qtrue) {
2368
2409
  curl_easy_setopt(rbce->curl, CURLOPT_NOBODY, 1);
2369
- }
2370
- else {
2410
+ } else {
2371
2411
  curl_easy_setopt(rbce->curl, CURLOPT_NOBODY, 0);
2372
2412
  }
2373
2413
 
@@ -2384,13 +2424,13 @@ static VALUE ruby_curl_easy_set_head_option(VALUE self, VALUE onoff) {
2384
2424
  static VALUE ruby_curl_easy_perform_put(VALUE self, VALUE data) {
2385
2425
  ruby_curl_easy *rbce;
2386
2426
  CURL *curl;
2387
-
2427
+
2388
2428
  Data_Get_Struct(self, ruby_curl_easy, rbce);
2389
2429
  curl = rbce->curl;
2390
-
2430
+
2391
2431
  curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, NULL);
2392
2432
  ruby_curl_easy_put_data_set(self, data);
2393
-
2433
+
2394
2434
  return rb_funcall(self, rb_intern("perform"), 0);
2395
2435
  }
2396
2436
 
@@ -3308,6 +3348,8 @@ void init_curb_easy() {
3308
3348
  rb_define_method(cCurlEasy, "on_debug", ruby_curl_easy_on_debug_set, -1);
3309
3349
  rb_define_method(cCurlEasy, "on_success", ruby_curl_easy_on_success_set, -1);
3310
3350
  rb_define_method(cCurlEasy, "on_failure", ruby_curl_easy_on_failure_set, -1);
3351
+ rb_define_method(cCurlEasy, "on_missing", ruby_curl_easy_on_missing_set, -1);
3352
+ rb_define_method(cCurlEasy, "on_redirect", ruby_curl_easy_on_redirect_set, -1);
3311
3353
  rb_define_method(cCurlEasy, "on_complete", ruby_curl_easy_on_complete_set, -1);
3312
3354
 
3313
3355
  rb_define_method(cCurlEasy, "http", ruby_curl_easy_perform_verb, 1);
@@ -374,8 +374,18 @@ static void rb_curl_mutli_handle_complete(VALUE self, CURL *easy_handle, int res
374
374
  val = rb_rescue(call_status_handler1, callargs, callback_exception, Qnil);
375
375
  //rb_funcall( rb_easy_get("success_proc"), idCall, 1, easy );
376
376
  }
377
+ else if (!rb_easy_nil("redirect_proc") &&
378
+ (response_code >= 300 && response_code < 400)) {
379
+ callargs = rb_ary_new3(3, rb_easy_get("redirect_proc"), easy, rb_curl_easy_error(result));
380
+ val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
381
+ }
382
+ else if (!rb_easy_nil("missing_proc") &&
383
+ (response_code >= 400 && response_code < 500)) {
384
+ callargs = rb_ary_new3(3, rb_easy_get("missing_proc"), easy, rb_curl_easy_error(result));
385
+ val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
386
+ }
377
387
  else if (!rb_easy_nil("failure_proc") &&
378
- (response_code >= 300 && response_code <= 999)) {
388
+ (response_code >= 500 && response_code <= 999)) {
379
389
  callargs = rb_ary_new3(3, rb_easy_get("failure_proc"), easy, rb_curl_easy_error(result));
380
390
  val = rb_rescue(call_status_handler2, callargs, callback_exception, Qnil);
381
391
  //rb_funcall( rb_easy_get("failure_proc"), idCall, 2, easy, rb_curl_easy_error(result) );
@@ -0,0 +1,39 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
2
+
3
+ require 'webrick'
4
+ class ::WEBrick::HTTPServer ; def access_log(config, req, res) ; end ; end
5
+ class ::WEBrick::BasicLog ; def log(level, data) ; end ; end
6
+
7
+ require 'curl'
8
+
9
+ class BugCrashOnDebug < Test::Unit::TestCase
10
+
11
+ def test_on_debug
12
+ server = WEBrick::HTTPServer.new( :Port => 9999 )
13
+ server.mount_proc("/test") do|req,res|
14
+ res.body = "hi"
15
+ res['Content-Type'] = "text/html"
16
+ end
17
+ puts 'a'
18
+ thread = Thread.new(server) do|srv|
19
+ srv.start
20
+ end
21
+ puts 'b'
22
+ c = Curl::Easy.new('http://localhost:9999/test')
23
+ c.on_debug do|x|
24
+ puts x.inspect
25
+ raise "error" # this will get swallowed
26
+ end
27
+ c.perform
28
+ puts 'c'
29
+ ensure
30
+ puts 'd'
31
+ server.shutdown
32
+ puts 'e'
33
+ puts thread.exit
34
+ puts 'f'
35
+ end
36
+
37
+ end
38
+
39
+ #test_on_debug
@@ -65,6 +65,14 @@ class TestServlet < WEBrick::HTTPServlet::AbstractServlet
65
65
  end
66
66
 
67
67
  def do_GET(req,res)
68
+ if req.path.match /redirect$/
69
+ res.status = 302
70
+ res['Location'] = '/foo'
71
+ elsif req.path.match /not_here$/
72
+ res.status = 404
73
+ elsif req.path.match /error$/
74
+ res.status = 500
75
+ end
68
76
  respond_with(:GET,req,res)
69
77
  end
70
78
 
@@ -561,13 +561,34 @@ class TestCurbCurlEasy < Test::Unit::TestCase
561
561
  end
562
562
 
563
563
  def test_on_success_with_on_failure
564
- curl = Curl::Easy.new("#{$TEST_URL.gsub(/file:\/\//,'')}/not_here")
564
+ curl = Curl::Easy.new(TestServlet.url + '/error')
565
565
  on_failure_called = false
566
566
  curl.on_success {|c| } # make sure we get the failure call even though this handler is defined
567
567
  curl.on_failure {|c,code| on_failure_called = true }
568
568
  curl.perform
569
+ assert_equal 500, curl.response_code
569
570
  assert on_failure_called, "Failure handler not called"
570
571
  end
572
+
573
+ def test_on_success_with_on_missing
574
+ curl = Curl::Easy.new(TestServlet.url + '/not_here')
575
+ on_missing_called = false
576
+ curl.on_success {|c| } # make sure we get the missing call even though this handler is defined
577
+ curl.on_missing {|c,code| on_missing_called = true }
578
+ curl.perform
579
+ assert_equal 404, curl.response_code
580
+ assert on_missing_called, "Missing handler not called"
581
+ end
582
+
583
+ def test_on_success_with_on_redirect
584
+ curl = Curl::Easy.new(TestServlet.url + '/redirect')
585
+ on_redirect_called = false
586
+ curl.on_success {|c| } # make sure we get the redirect call even though this handler is defined
587
+ curl.on_redirect {|c,code| on_redirect_called = true }
588
+ curl.perform
589
+ assert_equal 302, curl.response_code
590
+ assert on_redirect_called, "Redirect handler not called"
591
+ end
571
592
 
572
593
  def test_get_remote
573
594
  curl = Curl::Easy.new(TestServlet.url)
@@ -600,6 +621,19 @@ class TestCurbCurlEasy < Test::Unit::TestCase
600
621
  end
601
622
  end
602
623
  end
624
+
625
+ # see: https://github.com/rvanlieshout/curb/commit/8bcdefddc0162484681ebd1a92d52a642666a445
626
+ def test_post_multipart_array_remote
627
+ curl = Curl::Easy.new(TestServlet.url)
628
+ curl.multipart_form_post = true
629
+ fields = [
630
+ Curl::PostField.file('foo', File.expand_path(File.join(File.dirname(__FILE__),'..','README'))),
631
+ Curl::PostField.file('bar', File.expand_path(File.join(File.dirname(__FILE__),'..','README')))
632
+ ]
633
+ curl.http_post(fields)
634
+ assert_match /HTTP POST file upload/, curl.body_str
635
+ assert_match /Content-Disposition: form-data/, curl.body_str
636
+ end
603
637
 
604
638
  def test_post_with_body_remote
605
639
  curl = Curl::Easy.new(TestServlet.url)
@@ -703,7 +737,7 @@ class TestCurbCurlEasy < Test::Unit::TestCase
703
737
 
704
738
  def test_put_remote_file
705
739
  curl = Curl::Easy.new(TestServlet.url)
706
- File.open(__FILE__,'r') do|f|
740
+ File.open(__FILE__,'rb') do|f|
707
741
  assert curl.http_put(f)
708
742
  end
709
743
  assert_equal "PUT\n#{File.read(__FILE__)}", curl.body_str
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: curb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.18
4
+ version: 0.8.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-01-16 00:00:00.000000000 Z
13
+ date: 2012-01-19 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Curb (probably CUrl-RuBy or something) provides Ruby-language bindings
16
16
  for the libcurl(3), a fully-featured client-side URL transfer library. cURL and
@@ -46,6 +46,7 @@ files:
46
46
  - ext/curb_postfield.h
47
47
  - ext/curb_upload.h
48
48
  - tests/alltests.rb
49
+ - tests/bug_crash_on_debug.rb
49
50
  - tests/bug_crash_on_progress.rb
50
51
  - tests/bug_curb_easy_blocks_ruby_threads.rb
51
52
  - tests/bug_curb_easy_post_with_string_no_content_length_header.rb
@@ -95,6 +96,7 @@ specification_version: 3
95
96
  summary: Ruby libcurl bindings
96
97
  test_files:
97
98
  - tests/alltests.rb
99
+ - tests/bug_crash_on_debug.rb
98
100
  - tests/bug_crash_on_progress.rb
99
101
  - tests/bug_curb_easy_blocks_ruby_threads.rb
100
102
  - tests/bug_curb_easy_post_with_string_no_content_length_header.rb