curb 1.0.0 → 1.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dce5f49b09bacccf705e3d25ba29031dd4fc82c2721860eef02bb4a8af2dd0e2
4
- data.tar.gz: 9456ed69688f2236bdd17f338e26faaf46b91f0fd4e51b3a48d5551ff8fdc433
3
+ metadata.gz: e28b1d05b46460867acfadc87bbe422d58d8f2cdb93397fa6ded906b01cd7dab
4
+ data.tar.gz: 33e7037c1c2b23a793ec96c73bc80c008939c880702f884d2b258d4afd18c368
5
5
  SHA512:
6
- metadata.gz: df6ab81576ef567878331724c1600c59ff923be34d3a71bd31d07e4999880743e73c31a502bab8aaece54099fd5142bf954dbf004fffd38f0e6698750e3f9682
7
- data.tar.gz: 5b7b867979da88d328e9f71a4a6eb7183430de26902311cb8678b443a6c53cf50aa62952f277bc2c2821bafc2af48c0e28067f7dce512ff7c2912b195bc27ad5
6
+ metadata.gz: 6eb448726a4fdce1e0832e36a45b2c8e0a078fbc2c04b3fe34f87fc38397f5c4ecc4fe621aed5637750c5c7a7a9d05b30c03f9f7db153c23d3694eb6adb464e8
7
+ data.tar.gz: 624e3f39af79eff874784a662776debc2b405378c6cdc963a50dee525d36aa225cc5f40558f9b35b396c222416006f66c29fc6193e651b5aa84093fdd52cb2ba
data/README.markdown CHANGED
@@ -1,22 +1,57 @@
1
- # Curb - Libcurl bindings for Ruby [![Build Status](https://travis-ci.org/taf2/curb.svg?branch=master)](https://travis-ci.org/taf2/curb)
1
+ # Curb - Libcurl bindings for Ruby
2
2
 
3
+ * [CI Build Status](https://github.com/taf2/curb/actions/workflows/CI.yml)
3
4
  * [rubydoc rdoc](http://www.rubydoc.info/github/taf2/curb/)
4
5
  * [github project](http://github.com/taf2/curb/tree/master)
5
6
 
6
7
  Curb (probably CUrl-RuBy or something) provides Ruby-language bindings for the
7
8
  libcurl(3), a fully-featured client-side URL transfer library.
8
- cURL and libcurl live at [http://curl.haxx.se/](http://curl.haxx.se/) .
9
+ cURL and libcurl live at [https://curl.se/libcurl/](https://curl.se/libcurl/) .
9
10
 
10
11
  Curb is a work-in-progress, and currently only supports libcurl's `easy` and `multi` modes.
11
12
 
12
13
  ## License
13
14
 
14
- Curb is copyright (c)2006 Ross Bamford, and released under the terms of the
15
+ Curb is copyright (c) 2006 Ross Bamford, and released under the terms of the
15
16
  Ruby license. See the LICENSE file for the gory details.
16
17
 
18
+ ## Easy mode
19
+
20
+ GET request
21
+ ```
22
+ res = Curl.get("https://www.google.com/") {|http|
23
+ http.timeout = 10 # raise exception if request/response not handled within 10 seconds
24
+ }
25
+ puts res.code
26
+ puts res.head
27
+ puts res.body
28
+ ```
29
+
30
+ POST request
31
+ ```
32
+ res = Curl.post("https://your-server.com/endpoint", {post: "this"}.to_json) {|http|
33
+ http.headers["Content-Type"] = "application/json"
34
+ }
35
+ puts res.code
36
+ puts res.head
37
+ puts res.body
38
+ ```
39
+
40
+ PATCH request
41
+ ```
42
+ res = Curl.patch("https://your-server.com/endpoint", {post: "this"}.to_json) {|http|
43
+ http.headers["Content-Type"] = "application/json"
44
+ }
45
+ puts res.code
46
+ puts res.head
47
+ puts res.body
48
+ ```
49
+
50
+
51
+
17
52
  ## You will need
18
53
 
19
- * A working Ruby installation (`1.8.7+` will work but `2.1+` preferred)
54
+ * A working Ruby installation (`2.0.0+` will work but `2.1+` preferred) (it's possible it still works with 1.8.7 but you'd have to tell me if not...)
20
55
  * A working libcurl development installation
21
56
  (Ideally one of the versions listed in the compatibility chart below that maps to your `curb` version)
22
57
  * A sane build environment (e.g. gcc, make)
@@ -29,7 +64,8 @@ tested and reported to work across a variety of platforms / rubies)
29
64
 
30
65
  | Gem Version | Release Date | libcurl versions |
31
66
  | ----------- | ----------- | ---------------- |
32
- | 0.9.8 | Jan 2019 | 7.58 - 7.63 |
67
+ | 1.0.0 | Jan 2022 | 7.58 - 7.81 |
68
+ | 0.9.8 | Jan 2019 | 7.58 - 7.81 |
33
69
  | 0.9.7 | Nov 2018 | 7.56 - 7.60 |
34
70
  | 0.9.6 | May 2018 | 7.51 - 7.59 |
35
71
  | 0.9.5 | May 2018 | 7.51 - 7.59 |
@@ -43,7 +79,7 @@ tested and reported to work across a variety of platforms / rubies)
43
79
  $ gem install curb
44
80
 
45
81
  On Windows, make sure you're using the [DevKit](http://rubyinstaller.org/downloads/) and
46
- the [development version of libcurl](http://curl.haxx.se/gknw.net/7.39.0/dist-w32/curl-7.39.0-devel-mingw32.zip). Unzip, then run this in your command
82
+ the [development version of libcurl](http://curl.se/gknw.net/7.39.0/dist-w32/curl-7.39.0-devel-mingw32.zip). Unzip, then run this in your command
47
83
  line (alter paths to your curl location, but remember to use forward slashes):
48
84
 
49
85
  gem install curb --platform=ruby -- --with-curl-lib=C:/curl-7.39.0-devel-mingw32/lib --with-curl-include=C:/curl-7.39.0-devel-mingw32/include
data/Rakefile CHANGED
@@ -2,6 +2,7 @@
2
2
  #
3
3
  require 'rake/clean'
4
4
  require 'rake/testtask'
5
+ require "ruby_memcheck"
5
6
 
6
7
  CLEAN.include '**/*.o'
7
8
  CLEAN.include "**/*.#{(defined?(RbConfig) ? RbConfig : Config)::MAKEFILE_CONFIG['DLEXT']}"
@@ -10,13 +11,6 @@ CLOBBER.include '**/*.log'
10
11
  CLOBBER.include '**/Makefile'
11
12
  CLOBBER.include '**/extconf.h'
12
13
 
13
- # Not available for really old rubies, but that's ok.
14
- begin
15
- require 'pry'
16
- rescue LoadError
17
- puts "Failed to load pry."
18
- end
19
-
20
14
  # Load support ruby and rake files (in this order)
21
15
  Dir.glob('tasks/*.rb').each { |r| load r}
22
16
  Dir.glob('tasks/*.rake').each { |r| load r}
@@ -97,6 +91,14 @@ else
97
91
  task :alltests => [:unittests, :bugtests]
98
92
  end
99
93
 
94
+ RubyMemcheck.config(binary_name: 'curb_core')
95
+ namespace :test do
96
+ RubyMemcheck::TestTask.new(valgrind: :compile) do|t|
97
+ t.test_files = FileList['tests/tc_*.rb']
98
+ t.verbose = false
99
+ end
100
+ end
101
+
100
102
  Rake::TestTask.new(:unittests) do |t|
101
103
  t.test_files = FileList['tests/tc_*.rb']
102
104
  t.verbose = false
data/ext/curb.c CHANGED
@@ -235,12 +235,16 @@ static VALUE ruby_curl_http2_q(VALUE mod) {
235
235
  #endif
236
236
  }
237
237
 
238
+ static void finalize_curb_core(VALUE data) {
239
+ curl_global_cleanup();
240
+ }
241
+
238
242
  void Init_curb_core() {
239
- // TODO we need to call curl_global_cleanup at exit!
240
243
  curl_version_info_data *ver;
241
244
  VALUE curlver, curllongver, curlvernum;
242
245
 
243
246
  curl_global_init(CURL_GLOBAL_ALL);
247
+ rb_set_end_proc(finalize_curb_core, Qnil);
244
248
  ver = curl_version_info(CURLVERSION_NOW);
245
249
 
246
250
  mCurl = rb_define_module("Curl");
@@ -1072,6 +1076,10 @@ void Init_curb_core() {
1072
1076
  CURB_DEFINE(CURLOPT_HAPROXYPROTOCOL);
1073
1077
  #endif
1074
1078
 
1079
+ #if HAVE_CURLOPT_PROXY_SSL_VERIFYHOST
1080
+ CURB_DEFINE(CURLOPT_PROXY_SSL_VERIFYHOST);
1081
+ #endif
1082
+
1075
1083
  #if HAVE_CURLPROTO_RTMPTE
1076
1084
  CURB_DEFINE(CURLPROTO_RTMPTE);
1077
1085
  #endif
data/ext/curb.h CHANGED
@@ -28,11 +28,11 @@
28
28
  #include "curb_macros.h"
29
29
 
30
30
  // These should be managed from the Rake 'release' task.
31
- #define CURB_VERSION "1.0.0"
32
- #define CURB_VER_NUM 1000
31
+ #define CURB_VERSION "1.0.5"
32
+ #define CURB_VER_NUM 1005
33
33
  #define CURB_VER_MAJ 1
34
34
  #define CURB_VER_MIN 0
35
- #define CURB_VER_MIC 0
35
+ #define CURB_VER_MIC 5
36
36
  #define CURB_VER_PATCH 0
37
37
 
38
38
 
data/ext/curb_easy.c CHANGED
@@ -34,7 +34,7 @@ static FILE * rb_io_stdio_file(rb_io_t *fptr) {
34
34
 
35
35
  /* ================== CURL HANDLER FUNCS ==============*/
36
36
 
37
- static VALUE callback_exception(VALUE unused) {
37
+ static VALUE callback_exception(VALUE unused, VALUE exception) {
38
38
  return Qfalse;
39
39
  }
40
40
 
@@ -329,9 +329,9 @@ static VALUE ruby_curl_easy_allocate(VALUE klass) {
329
329
 
330
330
  /*
331
331
  * call-seq:
332
- * Curl::Easy.new => #<Curl::Easy...>
333
- * Curl::Easy.new(url = nil) => #<Curl::Easy...>
334
- * Curl::Easy.new(url = nil) { |self| ... } => #<Curl::Easy...>
332
+ * Curl::Easy.new => #<Curl::Easy...>
333
+ * Curl::Easy.new(url = nil) => #<Curl::Easy...>
334
+ * Curl::Easy.new(url = nil) { |self| ... } => #<Curl::Easy...>
335
335
  *
336
336
  * Initialize a new Curl::Easy instance, optionally supplying the URL.
337
337
  * The block form allows further configuration to be supplied before
@@ -376,8 +376,8 @@ static VALUE ruby_curl_easy_initialize(int argc, VALUE *argv, VALUE self) {
376
376
 
377
377
  /*
378
378
  * call-seq:
379
- * easy.clone => #&lt;easy clone&gt;
380
- * easy.dup => #&lt;easy clone&gt;
379
+ * easy.clone => <easy clone>
380
+ * easy.dup => <easy clone>
381
381
  *
382
382
  * Clone this Curl::Easy instance, creating a new instance.
383
383
  * This method duplicates the underlying CURL* handle.
@@ -957,7 +957,7 @@ static VALUE ruby_curl_easy_ftp_commands_set(VALUE self, VALUE ftp_commands) {
957
957
  }
958
958
 
959
959
  /*
960
- * call-seq
960
+ * call-seq:
961
961
  * easy.ftp_commands => array or nil
962
962
  */
963
963
  static VALUE ruby_curl_easy_ftp_commands_get(VALUE self) {
@@ -976,7 +976,7 @@ static VALUE ruby_curl_easy_resolve_set(VALUE self, VALUE resolve) {
976
976
  }
977
977
 
978
978
  /*
979
- * call-seq
979
+ * call-seq:
980
980
  * easy.resolve => array or nil
981
981
  */
982
982
  static VALUE ruby_curl_easy_resolve_get(VALUE self) {
@@ -1311,7 +1311,7 @@ static VALUE ruby_curl_easy_connect_timeout_set(VALUE self, VALUE connect_timeou
1311
1311
  * Obtain the maximum time in seconds that you allow the connection to the
1312
1312
  * server to take.
1313
1313
  */
1314
- static VALUE ruby_curl_easy_connect_timeout_get(VALUE self, VALUE connect_timeout) {
1314
+ static VALUE ruby_curl_easy_connect_timeout_get(VALUE self) {
1315
1315
  CURB_IMMED_GETTER(ruby_curl_easy, connect_timeout, 0);
1316
1316
  }
1317
1317
 
@@ -1337,7 +1337,7 @@ static VALUE ruby_curl_easy_connect_timeout_ms_set(VALUE self, VALUE connect_tim
1337
1337
  * Obtain the maximum time in milliseconds that you allow the connection to the
1338
1338
  * server to take.
1339
1339
  */
1340
- static VALUE ruby_curl_easy_connect_timeout_ms_get(VALUE self, VALUE connect_timeout_ms) {
1340
+ static VALUE ruby_curl_easy_connect_timeout_ms_get(VALUE self) {
1341
1341
  CURB_IMMED_GETTER(ruby_curl_easy, connect_timeout_ms, 0);
1342
1342
  }
1343
1343
 
@@ -1360,7 +1360,7 @@ static VALUE ruby_curl_easy_dns_cache_timeout_set(VALUE self, VALUE dns_cache_ti
1360
1360
  *
1361
1361
  * Obtain the dns cache timeout in seconds.
1362
1362
  */
1363
- static VALUE ruby_curl_easy_dns_cache_timeout_get(VALUE self, VALUE dns_cache_timeout) {
1363
+ static VALUE ruby_curl_easy_dns_cache_timeout_get(VALUE self) {
1364
1364
  CURB_IMMED_GETTER(ruby_curl_easy, dns_cache_timeout, -1);
1365
1365
  }
1366
1366
 
@@ -1387,7 +1387,7 @@ static VALUE ruby_curl_easy_ftp_response_timeout_set(VALUE self, VALUE ftp_respo
1387
1387
  *
1388
1388
  * Obtain the maximum time that libcurl will wait for FTP command responses.
1389
1389
  */
1390
- static VALUE ruby_curl_easy_ftp_response_timeout_get(VALUE self, VALUE ftp_response_timeout) {
1390
+ static VALUE ruby_curl_easy_ftp_response_timeout_get(VALUE self) {
1391
1391
  CURB_IMMED_GETTER(ruby_curl_easy, ftp_response_timeout, 0);
1392
1392
  }
1393
1393
 
@@ -1410,7 +1410,7 @@ static VALUE ruby_curl_easy_low_speed_limit_set(VALUE self, VALUE low_speed_limi
1410
1410
  * Obtain the minimum transfer speed over +low_speed+time+ below which the
1411
1411
  * transfer will be aborted.
1412
1412
  */
1413
- static VALUE ruby_curl_easy_low_speed_limit_get(VALUE self, VALUE low_speed_limit) {
1413
+ static VALUE ruby_curl_easy_low_speed_limit_get(VALUE self) {
1414
1414
  CURB_IMMED_GETTER(ruby_curl_easy, low_speed_limit, 0);
1415
1415
  }
1416
1416
 
@@ -1432,7 +1432,7 @@ static VALUE ruby_curl_easy_low_speed_time_set(VALUE self, VALUE low_speed_time)
1432
1432
  * Obtain the time that the transfer should be below +low_speed_limit+ for
1433
1433
  * the library to abort it.
1434
1434
  */
1435
- static VALUE ruby_curl_easy_low_speed_time_get(VALUE self, VALUE low_speed_time) {
1435
+ static VALUE ruby_curl_easy_low_speed_time_get(VALUE self) {
1436
1436
  CURB_IMMED_GETTER(ruby_curl_easy, low_speed_time, 0);
1437
1437
  }
1438
1438
 
@@ -1452,7 +1452,7 @@ static VALUE ruby_curl_easy_max_send_speed_large_set(VALUE self, VALUE max_send_
1452
1452
  *
1453
1453
  * Get the maximal sending transfer speed (in bytes per second)
1454
1454
  */
1455
- static VALUE ruby_curl_easy_max_send_speed_large_get(VALUE self, VALUE max_send_speed_large) {
1455
+ static VALUE ruby_curl_easy_max_send_speed_large_get(VALUE self) {
1456
1456
  CURB_IMMED_GETTER(ruby_curl_easy, max_send_speed_large, 0);
1457
1457
  }
1458
1458
 
@@ -1472,7 +1472,7 @@ static VALUE ruby_curl_easy_max_recv_speed_large_set(VALUE self, VALUE max_recv_
1472
1472
  *
1473
1473
  * Get the maximal receiving transfer speed (in bytes per second)
1474
1474
  */
1475
- static VALUE ruby_curl_easy_max_recv_speed_large_get(VALUE self, VALUE max_recv_speed_large) {
1475
+ static VALUE ruby_curl_easy_max_recv_speed_large_get(VALUE self) {
1476
1476
  CURB_IMMED_GETTER(ruby_curl_easy, max_recv_speed_large, 0);
1477
1477
  }
1478
1478
 
@@ -1496,7 +1496,7 @@ static VALUE ruby_curl_easy_username_set(VALUE self, VALUE username) {
1496
1496
  *
1497
1497
  * Get the current username
1498
1498
  */
1499
- static VALUE ruby_curl_easy_username_get(VALUE self, VALUE username) {
1499
+ static VALUE ruby_curl_easy_username_get(VALUE self) {
1500
1500
  #if HAVE_CURLOPT_USERNAME
1501
1501
  CURB_OBJECT_HGETTER(ruby_curl_easy, username);
1502
1502
  #else
@@ -1524,7 +1524,7 @@ static VALUE ruby_curl_easy_password_set(VALUE self, VALUE password) {
1524
1524
  *
1525
1525
  * Get the current password
1526
1526
  */
1527
- static VALUE ruby_curl_easy_password_get(VALUE self, VALUE password) {
1527
+ static VALUE ruby_curl_easy_password_get(VALUE self) {
1528
1528
  #if HAVE_CURLOPT_PASSWORD
1529
1529
  CURB_OBJECT_HGETTER(ruby_curl_easy, password);
1530
1530
  #else
@@ -1558,7 +1558,7 @@ static VALUE ruby_curl_easy_ssl_version_set(VALUE self, VALUE ssl_version) {
1558
1558
  *
1559
1559
  * Get the version of SSL/TLS that libcurl will attempt to use.
1560
1560
  */
1561
- static VALUE ruby_curl_easy_ssl_version_get(VALUE self, VALUE ssl_version) {
1561
+ static VALUE ruby_curl_easy_ssl_version_get(VALUE self) {
1562
1562
  CURB_IMMED_GETTER(ruby_curl_easy, ssl_version, -1);
1563
1563
  }
1564
1564
 
@@ -1579,7 +1579,7 @@ static VALUE ruby_curl_easy_use_ssl_set(VALUE self, VALUE use_ssl) {
1579
1579
  *
1580
1580
  * Get the desired level for using SSL on FTP connections.
1581
1581
  */
1582
- static VALUE ruby_curl_easy_use_ssl_get(VALUE self, VALUE use_ssl) {
1582
+ static VALUE ruby_curl_easy_use_ssl_get(VALUE self) {
1583
1583
  CURB_IMMED_GETTER(ruby_curl_easy, use_ssl, -1);
1584
1584
  }
1585
1585
 
@@ -1595,12 +1595,12 @@ static VALUE ruby_curl_easy_ftp_filemethod_set(VALUE self, VALUE ftp_filemethod)
1595
1595
  }
1596
1596
 
1597
1597
  /*
1598
- * call-seq
1598
+ * call-seq:
1599
1599
  * easy.ftp_filemethod => fixnum
1600
1600
  *
1601
1601
  * Get the configuration for how libcurl will reach files on the server.
1602
1602
  */
1603
- static VALUE ruby_curl_easy_ftp_filemethod_get(VALUE self, VALUE ftp_filemethod) {
1603
+ static VALUE ruby_curl_easy_ftp_filemethod_get(VALUE self) {
1604
1604
  CURB_IMMED_GETTER(ruby_curl_easy, ftp_filemethod, -1);
1605
1605
  }
1606
1606
 
@@ -1967,7 +1967,7 @@ static VALUE ruby_curl_easy_resolve_mode_set(VALUE self, VALUE resolve_mode) {
1967
1967
 
1968
1968
  /*
1969
1969
  * call-seq:
1970
- * easy.on_body { |body_data| ... } => &lt;old handler&gt;
1970
+ * easy.on_body { |body_data| ... } => <old handler>
1971
1971
  *
1972
1972
  * Assign or remove the +on_body+ handler for this Curl::Easy instance.
1973
1973
  * To remove a previously-supplied handler, call this method with no
@@ -1986,7 +1986,7 @@ static VALUE ruby_curl_easy_on_body_set(int argc, VALUE *argv, VALUE self) {
1986
1986
 
1987
1987
  /*
1988
1988
  * call-seq:
1989
- * easy.on_success { |easy| ... } => &lt;old handler&gt;
1989
+ * easy.on_success { |easy| ... } => <old handler>
1990
1990
  *
1991
1991
  * Assign or remove the +on_success+ handler for this Curl::Easy instance.
1992
1992
  * To remove a previously-supplied handler, call this method with no
@@ -2001,7 +2001,7 @@ static VALUE ruby_curl_easy_on_success_set(int argc, VALUE *argv, VALUE self) {
2001
2001
 
2002
2002
  /*
2003
2003
  * call-seq:
2004
- * easy.on_failure {|easy,code| ... } => &lt;old handler&gt;
2004
+ * easy.on_failure {|easy,code| ... } => <old handler>
2005
2005
  *
2006
2006
  * Assign or remove the +on_failure+ handler for this Curl::Easy instance.
2007
2007
  * To remove a previously-supplied handler, call this method with no
@@ -2016,7 +2016,7 @@ static VALUE ruby_curl_easy_on_failure_set(int argc, VALUE *argv, VALUE self) {
2016
2016
 
2017
2017
  /*
2018
2018
  * call-seq:
2019
- * easy.on_missing {|easy,code| ... } => &lt;old handler;&gt;
2019
+ * easy.on_missing {|easy,code| ... } => <old handler;>
2020
2020
  *
2021
2021
  * Assign or remove the on_missing handler for this Curl::Easy instance.
2022
2022
  * To remove a previously-supplied handler, call this method with no attached
@@ -2031,7 +2031,7 @@ static VALUE ruby_curl_easy_on_missing_set(int argc, VALUE *argv, VALUE self) {
2031
2031
 
2032
2032
  /*
2033
2033
  * call-seq:
2034
- * easy.on_redirect {|easy,code| ... } => &lt;old handler;&gt;
2034
+ * easy.on_redirect {|easy,code| ... } => <old handler;>
2035
2035
  *
2036
2036
  * Assign or remove the on_redirect handler for this Curl::Easy instance.
2037
2037
  * To remove a previously-supplied handler, call this method with no attached
@@ -2046,7 +2046,7 @@ static VALUE ruby_curl_easy_on_redirect_set(int argc, VALUE *argv, VALUE self) {
2046
2046
 
2047
2047
  /*
2048
2048
  * call-seq:
2049
- * easy.on_complete {|easy| ... } => &lt;old handler&gt;
2049
+ * easy.on_complete {|easy| ... } => <old handler>
2050
2050
  *
2051
2051
  * Assign or remove the +on_complete+ handler for this Curl::Easy instance.
2052
2052
  * To remove a previously-supplied handler, call this method with no
@@ -2060,7 +2060,7 @@ static VALUE ruby_curl_easy_on_complete_set(int argc, VALUE *argv, VALUE self) {
2060
2060
 
2061
2061
  /*
2062
2062
  * call-seq:
2063
- * easy.on_header { |header_data| ... } => &lt;old handler&gt;
2063
+ * easy.on_header { |header_data| ... } => <old handler>
2064
2064
  *
2065
2065
  * Assign or remove the +on_header+ handler for this Curl::Easy instance.
2066
2066
  * To remove a previously-supplied handler, call this method with no
@@ -2076,7 +2076,7 @@ static VALUE ruby_curl_easy_on_header_set(int argc, VALUE *argv, VALUE self) {
2076
2076
 
2077
2077
  /*
2078
2078
  * call-seq:
2079
- * easy.on_progress { |dl_total, dl_now, ul_total, ul_now| ... } => &lt;old handler&gt;
2079
+ * easy.on_progress { |dl_total, dl_now, ul_total, ul_now| ... } => <old handler>
2080
2080
  *
2081
2081
  * Assign or remove the +on_progress+ handler for this Curl::Easy instance.
2082
2082
  * To remove a previously-supplied handler, call this method with no
@@ -2097,7 +2097,7 @@ static VALUE ruby_curl_easy_on_progress_set(int argc, VALUE *argv, VALUE self) {
2097
2097
 
2098
2098
  /*
2099
2099
  * call-seq:
2100
- * easy.on_debug { |type, data| ... } => &lt;old handler&gt;
2100
+ * easy.on_debug { |type, data| ... } => <old handler>
2101
2101
  *
2102
2102
  * Assign or remove the +on_debug+ handler for this Curl::Easy instance.
2103
2103
  * To remove a previously-supplied handler, call this method with no
@@ -2122,7 +2122,7 @@ static VALUE ruby_curl_easy_on_debug_set(int argc, VALUE *argv, VALUE self) {
2122
2122
  /***********************************************
2123
2123
  * This is an rb_iterate callback used to set up http headers.
2124
2124
  */
2125
- static VALUE cb_each_http_header(VALUE header, VALUE wrap) {
2125
+ static VALUE cb_each_http_header(VALUE header, VALUE wrap, int _c, const VALUE *_ptr, VALUE unused) {
2126
2126
  struct curl_slist **list;
2127
2127
  VALUE header_str = Qnil;
2128
2128
 
@@ -2136,11 +2136,14 @@ static VALUE cb_each_http_header(VALUE header, VALUE wrap) {
2136
2136
 
2137
2137
  name = rb_obj_as_string(rb_ary_entry(header, 0));
2138
2138
  value = rb_obj_as_string(rb_ary_entry(header, 1));
2139
-
2140
- // This is a bit inefficient, but we don't want to be modifying
2141
- // the actual values in the original hash.
2142
- header_str = rb_str_plus(name, rb_str_new2(": "));
2143
- header_str = rb_str_plus(header_str, value);
2139
+ if (rb_str_strlen(value) == 0) { // removing the header e.g. Accept: with nothing trailing should remove it see: https://curl.se/libcurl/c/CURLOPT_HTTPHEADER.html
2140
+ header_str = rb_str_plus(name, rb_str_new2(":"));
2141
+ } else {
2142
+ // This is a bit inefficient, but we don't want to be modifying
2143
+ // the actual values in the original hash.
2144
+ header_str = rb_str_plus(name, rb_str_new2(": "));
2145
+ header_str = rb_str_plus(header_str, value);
2146
+ }
2144
2147
  } else {
2145
2148
  header_str = rb_obj_as_string(header);
2146
2149
  }
@@ -2154,7 +2157,7 @@ static VALUE cb_each_http_header(VALUE header, VALUE wrap) {
2154
2157
  /***********************************************
2155
2158
  * This is an rb_iterate callback used to set up http proxy headers.
2156
2159
  */
2157
- static VALUE cb_each_http_proxy_header(VALUE proxy_header, VALUE wrap) {
2160
+ static VALUE cb_each_http_proxy_header(VALUE proxy_header, VALUE wrap, int _c, const VALUE *_ptr, VALUE unused) {
2158
2161
  struct curl_slist **list;
2159
2162
  VALUE proxy_header_str = Qnil;
2160
2163
 
@@ -2186,7 +2189,7 @@ static VALUE cb_each_http_proxy_header(VALUE proxy_header, VALUE wrap) {
2186
2189
  /***********************************************
2187
2190
  * This is an rb_iterate callback used to set up ftp commands.
2188
2191
  */
2189
- static VALUE cb_each_ftp_command(VALUE ftp_command, VALUE wrap) {
2192
+ static VALUE cb_each_ftp_command(VALUE ftp_command, VALUE wrap, int _c, const VALUE *_ptr, VALUE unused) {
2190
2193
  struct curl_slist **list;
2191
2194
  VALUE ftp_command_string;
2192
2195
  Data_Get_Struct(wrap, struct curl_slist *, list);
@@ -2200,7 +2203,7 @@ static VALUE cb_each_ftp_command(VALUE ftp_command, VALUE wrap) {
2200
2203
  /***********************************************
2201
2204
  * This is an rb_iterate callback used to set up the resolve list.
2202
2205
  */
2203
- static VALUE cb_each_resolve(VALUE resolve, VALUE wrap) {
2206
+ static VALUE cb_each_resolve(VALUE resolve, VALUE wrap, int _c, const VALUE *_ptr, VALUE unused) {
2204
2207
  struct curl_slist **list;
2205
2208
  VALUE resolve_string;
2206
2209
  Data_Get_Struct(wrap, struct curl_slist *, list);
@@ -2599,7 +2602,7 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
2599
2602
  }
2600
2603
 
2601
2604
  // set values on cleanup to nil
2602
- rb_easy_del("multi");
2605
+ //rb_easy_del("multi");
2603
2606
 
2604
2607
  return Qnil;
2605
2608
  }
@@ -2775,6 +2778,10 @@ static VALUE ruby_curl_easy_perform_put(VALUE self, VALUE data) {
2775
2778
  * your own body handler, this string will be empty.
2776
2779
  */
2777
2780
  static VALUE ruby_curl_easy_body_str_get(VALUE self) {
2781
+ /*
2782
+ TODO: can we force_encoding on the return here if we see charset=utf-8 in the content-type header?
2783
+ Content-Type: application/json; charset=utf-8
2784
+ */
2778
2785
  CURB_OBJECT_HGETTER(ruby_curl_easy, body_data);
2779
2786
  }
2780
2787
 
@@ -3646,6 +3653,11 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
3646
3653
  case CURLOPT_SSL_SESSIONID_CACHE:
3647
3654
  curl_easy_setopt(rbce->curl, CURLOPT_SSL_SESSIONID_CACHE, NUM2LONG(val));
3648
3655
  break;
3656
+ #endif
3657
+ #if HAVE_CURLOPT_PROXY_SSL_VERIFYHOST
3658
+ case CURLOPT_PROXY_SSL_VERIFYHOST:
3659
+ curl_easy_setopt(rbce->curl, CURLOPT_PROXY_SSL_VERIFYHOST, NUM2LONG(val));
3660
+ break;
3649
3661
  #endif
3650
3662
  default:
3651
3663
  rb_raise(rb_eTypeError, "Curb unsupported option");
@@ -3763,6 +3775,7 @@ static VALUE ruby_curl_easy_error_message(VALUE klass, VALUE code) {
3763
3775
  }
3764
3776
 
3765
3777
  /* =================== INIT LIB =====================*/
3778
+ // TODO: https://bugs.ruby-lang.org/issues/18007
3766
3779
  void init_curb_easy() {
3767
3780
  idCall = rb_intern("call");
3768
3781
  idJoin = rb_intern("join");
@@ -3908,6 +3921,7 @@ void init_curb_easy() {
3908
3921
 
3909
3922
  rb_define_method(cCurlEasy, "last_effective_url", ruby_curl_easy_last_effective_url_get, 0);
3910
3923
  rb_define_method(cCurlEasy, "response_code", ruby_curl_easy_response_code_get, 0);
3924
+ rb_define_method(cCurlEasy, "code", ruby_curl_easy_response_code_get, 0);
3911
3925
  #if defined(HAVE_CURLINFO_PRIMARY_IP)
3912
3926
  rb_define_method(cCurlEasy, "primary_ip", ruby_curl_easy_primary_ip_get, 0);
3913
3927
  #endif
data/ext/curb_macros.h CHANGED
@@ -156,4 +156,16 @@
156
156
  #define CURB_DEFINE(name) \
157
157
  rb_define_const(mCurl, #name, LONG2NUM(name))
158
158
 
159
+ /* copy and raise exception */
160
+ #define CURB_CHECK_RB_CALLBACK_RAISE(did_raise) \
161
+ VALUE exception = rb_hash_aref(did_raise, rb_easy_hkey("error")); \
162
+ if (FIX2INT(rb_hash_size(did_raise)) > 0 && exception != Qnil) { \
163
+ rb_hash_clear(did_raise); \
164
+ VALUE message = rb_funcall(exception, rb_intern("message"), 0); \
165
+ VALUE aborted_exception = rb_exc_new_str(eCurlErrAbortedByCallback, message); \
166
+ VALUE backtrace = rb_funcall(exception, rb_intern("backtrace"), 0); \
167
+ rb_funcall(aborted_exception, rb_intern("set_backtrace"), 1, backtrace); \
168
+ rb_exc_raise(aborted_exception); \
169
+ }
170
+
159
171
  #endif