curb 0.9.7 → 0.9.8

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
- SHA1:
3
- metadata.gz: 074fa1f2330b83e471e524dcbef1f5ef869fd352
4
- data.tar.gz: 52abfef2028f532f2070406117f66dc779913ccc
2
+ SHA256:
3
+ metadata.gz: 64402c665924d5c24d6fa01dff9dd9f41d522ef1ca6e663d2038a204bd0290b4
4
+ data.tar.gz: 645f0b0f29804b105b9a4caaa1b2132d9d18b5dd4d678072e7e41a1d8d73771a
5
5
  SHA512:
6
- metadata.gz: 1eee7cc31175d70a6720c9f0f86958644e7fd9f179e82cc0b3a90e70dc3e5c4caa2cd0db06a3e1350ae88ef7c030e14e8d2c6e6d2dfba9e8c9b8872fe56fa421
7
- data.tar.gz: 3191554e99e528b7e59801ad5322661fe95ebcfe83ced7f6658f1eda2ee6a2546b990b4c6ff9182a4242f15556443422dcc9be4f4005dfe0c72cb13da517d1b6
6
+ metadata.gz: f86cb2a29633a86820862e35a5a1113c859e55636a50e779ab4235ccc54fb3b38a894edb8fcc090522ceb509ac0c2da329f708a9c109a2f871ce9c718984729c
7
+ data.tar.gz: a2d20ac0b5aee80de2aa37f4c49b923c5e6b19c2b0dd82d4466d14b21f0988644baa893bd23950380efec0ab028c9f1fd9c1dfc6d2ab7c97246c86bb2aad5cf2
data/Rakefile CHANGED
@@ -2,11 +2,6 @@
2
2
  #
3
3
  require 'rake/clean'
4
4
  require 'rake/testtask'
5
- begin
6
- require 'rdoc/task'
7
- rescue LoadError => e
8
- require 'rake/rdoctask'
9
- end
10
5
 
11
6
  CLEAN.include '**/*.o'
12
7
  CLEAN.include "**/*.#{(defined?(RbConfig) ? RbConfig : Config)::MAKEFILE_CONFIG['DLEXT']}"
@@ -15,6 +10,22 @@ CLOBBER.include '**/*.log'
15
10
  CLOBBER.include '**/Makefile'
16
11
  CLOBBER.include '**/extconf.h'
17
12
 
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
+ # Load support ruby and rake files (in this order)
21
+ Dir.glob('tasks/*.rb').each { |r| load r}
22
+ Dir.glob('tasks/*.rake').each { |r| load r}
23
+
24
+ desc 'Print Ruby major version (ie "2_5")'
25
+ task :ruby_version do
26
+ print current_ruby_major
27
+ end
28
+
18
29
  def announce(msg='')
19
30
  $stderr.puts msg
20
31
  end
@@ -43,12 +54,11 @@ end
43
54
  make_program = (/mswin/ =~ RUBY_PLATFORM) ? 'nmake' : 'make'
44
55
  MAKECMD = ENV['MAKE_CMD'] || make_program
45
56
  MAKEOPTS = ENV['MAKE_OPTS'] || ''
46
-
47
57
  CURB_SO = "ext/curb_core.#{(defined?(RbConfig) ? RbConfig : Config)::MAKEFILE_CONFIG['DLEXT']}"
48
58
 
49
59
  file 'ext/Makefile' => 'ext/extconf.rb' do
50
60
  Dir.chdir('ext') do
51
- ruby "extconf.rb #{ENV['EXTCONF_OPTS']}"
61
+ shell('ruby', 'extconf.rb', ENV['EXTCONF_OPTS'].to_s, live_stdout: STDOUT)
52
62
  end
53
63
  end
54
64
 
@@ -89,12 +99,12 @@ if ENV['RELTEST']
89
99
  else
90
100
  task :alltests => [:unittests, :bugtests]
91
101
  end
92
-
102
+
93
103
  Rake::TestTask.new(:unittests) do |t|
94
104
  t.test_files = FileList['tests/tc_*.rb']
95
105
  t.verbose = false
96
106
  end
97
-
107
+
98
108
  Rake::TestTask.new(:bugtests) do |t|
99
109
  t.test_files = FileList['tests/bug_*.rb']
100
110
  t.verbose = false
@@ -136,6 +146,12 @@ end
136
146
 
137
147
  desc "Publish the RDoc documentation to project web site"
138
148
  task :doc_upload => [ :doc ] do
149
+ begin
150
+ require 'rdoc/task'
151
+ rescue LoadError => e
152
+ require 'rake/rdoctask'
153
+ end
154
+
139
155
  if ENV['RELTEST']
140
156
  announce "Release Task Testing, skipping doc upload"
141
157
  else
data/ext/curb.c CHANGED
@@ -352,6 +352,13 @@ void Init_curb_core() {
352
352
  rb_define_const(mCurl, "CURLPROXY_SOCKS5", LONG2NUM(-2));
353
353
  #endif
354
354
 
355
+ /* When passed to Curl::Easy#proxy_type , indicates that the proxy is a SOCKS5 proxy (and that the proxy should resolve the hostname). (libcurl >= 7.17.2) */
356
+ #ifdef HAVE_CURLPROXY_SOCKS5_HOSTNAME
357
+ rb_define_const(mCurl, "CURLPROXY_SOCKS5_HOSTNAME", LONG2NUM(CURLPROXY_SOCKS5_HOSTNAME));
358
+ #else
359
+ rb_define_const(mCurl, "CURLPROXY_SOCKS5_HOSTNAME", LONG2NUM(-2));
360
+ #endif
361
+
355
362
  /* When passed to Curl::Easy#http_auth_types or Curl::Easy#proxy_auth_types, directs libcurl to use Basic authentication. */
356
363
  #ifdef HAVE_CURLAUTH_BASIC
357
364
  rb_define_const(mCurl, "CURLAUTH_BASIC", LONG2NUM(CURLAUTH_BASIC));
@@ -585,6 +592,9 @@ void Init_curb_core() {
585
592
  CURB_DEFINE(CURLOPT_REFERER);
586
593
  CURB_DEFINE(CURLOPT_USERAGENT);
587
594
  CURB_DEFINE(CURLOPT_HTTPHEADER);
595
+ #if HAVE_CURLOPT_PROXYHEADER
596
+ CURB_DEFINE(CURLOPT_PROXYHEADER);
597
+ #endif
588
598
  #if HAVE_CURLOPT_HTTP200ALIASES
589
599
  CURB_DEFINE(CURLOPT_HTTP200ALIASES);
590
600
  #endif
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.9.7"
24
- #define CURB_VER_NUM 907
23
+ #define CURB_VERSION "0.9.8"
24
+ #define CURB_VER_NUM 908
25
25
  #define CURB_VER_MAJ 0
26
26
  #define CURB_VER_MIN 9
27
- #define CURB_VER_MIC 7
27
+ #define CURB_VER_MIC 8
28
28
  #define CURB_VER_PATCH 0
29
29
 
30
30
 
@@ -223,6 +223,10 @@ static void ruby_curl_easy_free(ruby_curl_easy *rbce) {
223
223
  curl_slist_free_all(rbce->curl_headers);
224
224
  }
225
225
 
226
+ if (rbce->curl_proxy_headers) {
227
+ curl_slist_free_all(rbce->curl_proxy_headers);
228
+ }
229
+
226
230
  if (rbce->curl_ftp_commands) {
227
231
  curl_slist_free_all(rbce->curl_ftp_commands);
228
232
  }
@@ -258,6 +262,7 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
258
262
  rbce->opts = rb_hash_new();
259
263
 
260
264
  rbce->curl_headers = NULL;
265
+ rbce->curl_proxy_headers = NULL;
261
266
  rbce->curl_ftp_commands = NULL;
262
267
  rbce->curl_resolve = NULL;
263
268
 
@@ -277,6 +282,8 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
277
282
  rbce->ftp_response_timeout = 0;
278
283
  rbce->low_speed_limit = 0;
279
284
  rbce->low_speed_time = 0;
285
+ rbce->max_send_speed_large = 0;
286
+ rbce->max_recv_speed_large = 0;
280
287
  rbce->ssl_version = -1;
281
288
  rbce->use_ssl = -1;
282
289
  rbce->ftp_filemethod = -1;
@@ -343,7 +350,8 @@ static VALUE ruby_curl_easy_initialize(int argc, VALUE *argv, VALUE self) {
343
350
 
344
351
  rb_easy_set("url", url);
345
352
 
346
- /* set the new_curl pointer to the curl handle */
353
+
354
+ /* set the pointer to the curl handle */
347
355
  ecode = curl_easy_setopt(rbce->curl, CURLOPT_PRIVATE, (void*)self);
348
356
  if (ecode != CURLE_OK) {
349
357
  raise_curl_easy_error_exception(ecode);
@@ -373,6 +381,7 @@ static VALUE ruby_curl_easy_clone(VALUE self) {
373
381
  memcpy(newrbce, rbce, sizeof(ruby_curl_easy));
374
382
  newrbce->curl = curl_easy_duphandle(rbce->curl);
375
383
  newrbce->curl_headers = NULL;
384
+ newrbce->curl_proxy_headers = NULL;
376
385
  newrbce->curl_ftp_commands = NULL;
377
386
  newrbce->curl_resolve = NULL;
378
387
 
@@ -457,6 +466,12 @@ static VALUE ruby_curl_easy_reset(VALUE self) {
457
466
  rbce->curl_headers = NULL;
458
467
  }
459
468
 
469
+ /* Free everything up */
470
+ if (rbce->curl_proxy_headers) {
471
+ curl_slist_free_all(rbce->curl_proxy_headers);
472
+ rbce->curl_proxy_headers = NULL;
473
+ }
474
+
460
475
  return opts_dup;
461
476
  }
462
477
 
@@ -509,6 +524,10 @@ static VALUE ruby_curl_easy_headers_set(VALUE self, VALUE headers) {
509
524
  CURB_OBJECT_HSETTER(ruby_curl_easy, headers);
510
525
  }
511
526
 
527
+ static VALUE ruby_curl_easy_proxy_headers_set(VALUE self, VALUE proxy_headers) {
528
+ CURB_OBJECT_HSETTER(ruby_curl_easy, proxy_headers);
529
+ }
530
+
512
531
  /*
513
532
  * call-seq:
514
533
  * easy.headers => Hash, Array or Str
@@ -524,6 +543,41 @@ static VALUE ruby_curl_easy_headers_get(VALUE self) {
524
543
  return headers;
525
544
  }
526
545
 
546
+ /*
547
+ * call-seq:
548
+ * easy.proxy_headers = "Header: val" => "Header: val"
549
+ * easy.proxy_headers = {"Header" => "val" ..., "Header" => "val"} => {"Header: val", ...}
550
+ * easy.proxy_headers = ["Header: val" ..., "Header: val"] => ["Header: val", ...]
551
+ *
552
+ *
553
+ * For example to set a standard or custom header:
554
+ *
555
+ * easy.proxy_headers["MyHeader"] = "myval"
556
+ *
557
+ * To remove a standard header (this is useful when removing libcurls default
558
+ * 'Expect: 100-Continue' header when using HTTP form posts):
559
+ *
560
+ * easy.proxy_headers["Expect"] = ''
561
+ *
562
+ * Anything passed to libcurl as a header will be converted to a string during
563
+ * the perform step.
564
+ */
565
+
566
+ /*
567
+ * call-seq:
568
+ * easy.proxy_headers => Hash, Array or Str
569
+ *
570
+ * Obtain the custom HTTP proxy_headers for following requests.
571
+ */
572
+ static VALUE ruby_curl_easy_proxy_headers_get(VALUE self) {
573
+ ruby_curl_easy *rbce;
574
+ VALUE proxy_headers;
575
+ Data_Get_Struct(self, ruby_curl_easy, rbce);
576
+ proxy_headers = rb_easy_get("proxy_headers");//rb_hash_aref(rbce->opts, rb_intern("proxy_headers"));
577
+ if (proxy_headers == Qnil) { proxy_headers = rb_easy_set("proxy_headers", rb_hash_new()); }
578
+ return proxy_headers;
579
+ }
580
+
527
581
  /*
528
582
  * call-seq:
529
583
  * easy.interface => string
@@ -1139,7 +1193,7 @@ static VALUE ruby_curl_easy_max_redirects_get(VALUE self) {
1139
1193
 
1140
1194
  /*
1141
1195
  * call-seq:
1142
- * easy.timeout = fixnum or nil => fixnum or nil
1196
+ * easy.timeout = float, fixnum or nil => numeric
1143
1197
  *
1144
1198
  * Set the maximum time in seconds that you allow the libcurl transfer
1145
1199
  * operation to take. Normally, name lookups can take a considerable time
@@ -1148,20 +1202,39 @@ static VALUE ruby_curl_easy_max_redirects_get(VALUE self) {
1148
1202
  *
1149
1203
  * Set to nil (or zero) to disable timeout (it will then only timeout
1150
1204
  * on the system's internal timeouts).
1205
+ *
1206
+ * Uses timeout_ms internally instead of timeout because it allows for
1207
+ * better precision and libcurl will use the last set value when both
1208
+ * timeout and timeout_ms are set.
1209
+ *
1151
1210
  */
1152
- static VALUE ruby_curl_easy_timeout_set(VALUE self, VALUE timeout) {
1153
- CURB_IMMED_SETTER(ruby_curl_easy, timeout, 0);
1211
+ static VALUE ruby_curl_easy_timeout_set(VALUE self, VALUE timeout_s) {
1212
+ ruby_curl_easy *rbce;
1213
+ Data_Get_Struct(self, ruby_curl_easy, rbce);
1214
+
1215
+ if (Qnil == timeout_s || NUM2DBL(timeout_s) <= 0.0) {
1216
+ rbce->timeout_ms = 0;
1217
+ } else {
1218
+ rbce->timeout_ms = (unsigned long)(NUM2DBL(timeout_s) * 1000);
1219
+ }
1220
+
1221
+ return DBL2NUM(rbce->timeout_ms / 1000.0);
1154
1222
  }
1155
1223
 
1156
1224
  /*
1157
1225
  * call-seq:
1158
- * easy.timeout => fixnum or nil
1226
+ * easy.timeout => numeric
1159
1227
  *
1160
1228
  * Obtain the maximum time in seconds that you allow the libcurl transfer
1161
1229
  * operation to take.
1230
+ *
1231
+ * Uses timeout_ms internally instead of timeout.
1232
+ *
1162
1233
  */
1163
- static VALUE ruby_curl_easy_timeout_get(VALUE self, VALUE timeout) {
1164
- CURB_IMMED_GETTER(ruby_curl_easy, timeout, 0);
1234
+ static VALUE ruby_curl_easy_timeout_get(VALUE self) {
1235
+ ruby_curl_easy *rbce;
1236
+ Data_Get_Struct(self, ruby_curl_easy, rbce);
1237
+ return DBL2NUM(rbce->timeout_ms / 1000.0);
1165
1238
  }
1166
1239
 
1167
1240
  /*
@@ -1177,7 +1250,16 @@ static VALUE ruby_curl_easy_timeout_get(VALUE self, VALUE timeout) {
1177
1250
  * on the system's internal timeouts).
1178
1251
  */
1179
1252
  static VALUE ruby_curl_easy_timeout_ms_set(VALUE self, VALUE timeout_ms) {
1180
- CURB_IMMED_SETTER(ruby_curl_easy, timeout_ms, 0);
1253
+ ruby_curl_easy *rbce;
1254
+ Data_Get_Struct(self, ruby_curl_easy, rbce);
1255
+
1256
+ if (Qnil == timeout_ms || NUM2DBL(timeout_ms) <= 0.0) {
1257
+ rbce->timeout_ms = 0;
1258
+ } else {
1259
+ rbce->timeout_ms = NUM2ULONG(timeout_ms);
1260
+ }
1261
+
1262
+ return ULONG2NUM(rbce->timeout_ms);
1181
1263
  }
1182
1264
 
1183
1265
  /*
@@ -1187,8 +1269,10 @@ static VALUE ruby_curl_easy_timeout_ms_set(VALUE self, VALUE timeout_ms) {
1187
1269
  * Obtain the maximum time in milliseconds that you allow the libcurl transfer
1188
1270
  * operation to take.
1189
1271
  */
1190
- static VALUE ruby_curl_easy_timeout_ms_get(VALUE self, VALUE timeout_ms) {
1191
- CURB_IMMED_GETTER(ruby_curl_easy, timeout_ms, 0);
1272
+ static VALUE ruby_curl_easy_timeout_ms_get(VALUE self) {
1273
+ ruby_curl_easy *rbce;
1274
+ Data_Get_Struct(self, ruby_curl_easy, rbce);
1275
+ return LONG2NUM(rbce->timeout_ms);
1192
1276
  }
1193
1277
 
1194
1278
  /*
@@ -1338,6 +1422,46 @@ static VALUE ruby_curl_easy_low_speed_time_get(VALUE self, VALUE low_speed_time)
1338
1422
  CURB_IMMED_GETTER(ruby_curl_easy, low_speed_time, 0);
1339
1423
  }
1340
1424
 
1425
+ /*
1426
+ * call-seq:
1427
+ * easy.max_send_speed_large = fixnum or nil => fixnum or nil
1428
+ *
1429
+ * Set the maximal sending transfer speed (in bytes per second)
1430
+ */
1431
+ static VALUE ruby_curl_easy_max_send_speed_large_set(VALUE self, VALUE max_send_speed_large) {
1432
+ CURB_IMMED_SETTER(ruby_curl_easy, max_send_speed_large, 0);
1433
+ }
1434
+
1435
+ /*
1436
+ * call-seq:
1437
+ * easy.max_send_speed_large = fixnum or nil => fixnum or nil
1438
+ *
1439
+ * Get the maximal sending transfer speed (in bytes per second)
1440
+ */
1441
+ static VALUE ruby_curl_easy_max_send_speed_large_get(VALUE self, VALUE max_send_speed_large) {
1442
+ CURB_IMMED_GETTER(ruby_curl_easy, max_send_speed_large, 0);
1443
+ }
1444
+
1445
+ /*
1446
+ * call-seq:
1447
+ * easy.max_recv_speed_large = fixnum or nil => fixnum or nil
1448
+ *
1449
+ * Set the maximal receiving transfer speed (in bytes per second)
1450
+ */
1451
+ static VALUE ruby_curl_easy_max_recv_speed_large_set(VALUE self, VALUE max_recv_speed_large) {
1452
+ CURB_IMMED_SETTER(ruby_curl_easy, max_recv_speed_large, 0);
1453
+ }
1454
+
1455
+ /*
1456
+ * call-seq:
1457
+ * easy.max_recv_speed_large = fixnum or nil => fixnum or nil
1458
+ *
1459
+ * Get the maximal receiving transfer speed (in bytes per second)
1460
+ */
1461
+ static VALUE ruby_curl_easy_max_recv_speed_large_get(VALUE self, VALUE max_recv_speed_large) {
1462
+ CURB_IMMED_GETTER(ruby_curl_easy, max_recv_speed_large, 0);
1463
+ }
1464
+
1341
1465
  /*
1342
1466
  * call-seq:
1343
1467
  * easy.username = string => string
@@ -2012,6 +2136,38 @@ static VALUE cb_each_http_header(VALUE header, VALUE wrap) {
2012
2136
  return header_str;
2013
2137
  }
2014
2138
 
2139
+ /***********************************************
2140
+ * This is an rb_iterate callback used to set up http proxy headers.
2141
+ */
2142
+ static VALUE cb_each_http_proxy_header(VALUE proxy_header, VALUE wrap) {
2143
+ struct curl_slist **list;
2144
+ VALUE proxy_header_str = Qnil;
2145
+
2146
+ Data_Get_Struct(wrap, struct curl_slist *, list);
2147
+
2148
+ //rb_p(proxy_header);
2149
+
2150
+ if (rb_type(proxy_header) == T_ARRAY) {
2151
+ // we're processing a hash, proxy header is [name, val]
2152
+ VALUE name, value;
2153
+
2154
+ name = rb_obj_as_string(rb_ary_entry(proxy_header, 0));
2155
+ value = rb_obj_as_string(rb_ary_entry(proxy_header, 1));
2156
+
2157
+ // This is a bit inefficient, but we don't want to be modifying
2158
+ // the actual values in the original hash.
2159
+ proxy_header_str = rb_str_plus(name, rb_str_new2(": "));
2160
+ proxy_header_str = rb_str_plus(proxy_header_str, value);
2161
+ } else {
2162
+ proxy_header_str = rb_obj_as_string(proxy_header);
2163
+ }
2164
+
2165
+ //rb_p(header_str);
2166
+
2167
+ *list = curl_slist_append(*list, StringValuePtr(proxy_header_str));
2168
+ return proxy_header_str;
2169
+ }
2170
+
2015
2171
  /***********************************************
2016
2172
  * This is an rb_iterate callback used to set up ftp commands.
2017
2173
  */
@@ -2051,6 +2207,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
2051
2207
  CURL *curl;
2052
2208
  VALUE url, _url = rb_easy_get("url");
2053
2209
  struct curl_slist **hdrs = &(rbce->curl_headers);
2210
+ struct curl_slist **phdrs = &(rbce->curl_proxy_headers);
2054
2211
  struct curl_slist **cmds = &(rbce->curl_ftp_commands);
2055
2212
  struct curl_slist **rslv = &(rbce->curl_resolve);
2056
2213
 
@@ -2061,7 +2218,6 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
2061
2218
  }
2062
2219
 
2063
2220
  url = rb_check_string_type(_url);
2064
-
2065
2221
  curl_easy_setopt(curl, CURLOPT_URL, StringValuePtr(url));
2066
2222
 
2067
2223
  // network stuff and auth
@@ -2174,15 +2330,14 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
2174
2330
 
2175
2331
  curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, rbce->unrestricted_auth);
2176
2332
 
2177
- /* timeouts override each other we cannot blindly set timeout and timeout_ms */
2178
- if (rbce->timeout && rbce->timeout > 0) {
2179
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, rbce->timeout);
2180
- }
2181
- if (rbce->timeout_ms && rbce->timeout_ms > 0) {
2182
- curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, rbce->timeout_ms);
2183
- }
2333
+ #if HAVE_CURLOPT_TIMEOUT_MS
2334
+ curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, rbce->timeout_ms);
2335
+ #endif
2336
+
2184
2337
  curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, rbce->connect_timeout);
2338
+ #if HAVE_CURLOPT_CONNECTTIMEOUT_MS
2185
2339
  curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, rbce->connect_timeout_ms);
2340
+ #endif
2186
2341
  curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, rbce->dns_cache_timeout);
2187
2342
 
2188
2343
  curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, rbce->ignore_content_length);
@@ -2201,6 +2356,9 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
2201
2356
  curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, rbce->low_speed_limit);
2202
2357
  curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, rbce->low_speed_time);
2203
2358
 
2359
+ curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, rbce->max_recv_speed_large);
2360
+ curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, rbce->max_send_speed_large);
2361
+
2204
2362
  // Set up localport / proxy port
2205
2363
  // FIXME these won't get returned to default if they're unset Ruby
2206
2364
  if (rbce->proxy_port > 0) {
@@ -2334,6 +2492,25 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
2334
2492
  }
2335
2493
  }
2336
2494
 
2495
+ #if HAVE_CURLOPT_PROXYHEADER
2496
+ /* Setup HTTP proxy headers if necessary */
2497
+ curl_easy_setopt(curl, CURLOPT_PROXYHEADER, NULL); // XXX: maybe we shouldn't be clearing this?
2498
+
2499
+ if (!rb_easy_nil("proxy_headers")) {
2500
+ if (rb_easy_type_check("proxy_headers", T_ARRAY) || rb_easy_type_check("proxy_headers", T_HASH)) {
2501
+ VALUE wrap = Data_Wrap_Struct(rb_cObject, 0, 0, phdrs);
2502
+ rb_iterate(rb_each, rb_easy_get("proxy_headers"), cb_each_http_proxy_header, wrap);
2503
+ } else {
2504
+ VALUE proxy_headers_str = rb_obj_as_string(rb_easy_get("proxy_headers"));
2505
+ *phdrs = curl_slist_append(*hdrs, StringValuePtr(proxy_headers_str));
2506
+ }
2507
+
2508
+ if (*phdrs) {
2509
+ curl_easy_setopt(curl, CURLOPT_PROXYHEADER, *phdrs);
2510
+ }
2511
+ }
2512
+ #endif
2513
+
2337
2514
  /* Setup FTP commands if necessary */
2338
2515
  if (!rb_easy_nil("ftp_commands")) {
2339
2516
  if (rb_easy_type_check("ftp_commands", T_ARRAY)) {
@@ -2380,6 +2557,11 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
2380
2557
  rbce->curl_headers = NULL;
2381
2558
  }
2382
2559
 
2560
+ if (rbce->curl_proxy_headers) {
2561
+ curl_slist_free_all(rbce->curl_proxy_headers);
2562
+ rbce->curl_proxy_headers = NULL;
2563
+ }
2564
+
2383
2565
  ftp_commands = rbce->curl_ftp_commands;
2384
2566
  if (ftp_commands) {
2385
2567
  curl_slist_free_all(ftp_commands);
@@ -3384,6 +3566,11 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
3384
3566
  case CURLOPT_MAX_RECV_SPEED_LARGE: {
3385
3567
  curl_easy_setopt(rbce->curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t) NUM2LL(val));
3386
3568
  } break;
3569
+ #endif
3570
+ #if HAVE_CURLOPT_MAXFILESIZE
3571
+ case CURLOPT_MAXFILESIZE:
3572
+ curl_easy_setopt(rbce->curl, CURLOPT_MAXFILESIZE, NUM2LONG(val));
3573
+ break;
3387
3574
  #endif
3388
3575
  default:
3389
3576
  rb_raise(rb_eTypeError, "Curb unsupported option");
@@ -3520,6 +3707,10 @@ void init_curb_easy() {
3520
3707
  /* Attributes for config next perform */
3521
3708
  rb_define_method(cCurlEasy, "url", ruby_curl_easy_url_get, 0);
3522
3709
  rb_define_method(cCurlEasy, "proxy_url", ruby_curl_easy_proxy_url_get, 0);
3710
+
3711
+ rb_define_method(cCurlEasy, "proxy_headers=", ruby_curl_easy_proxy_headers_set, 1);
3712
+ rb_define_method(cCurlEasy, "proxy_headers", ruby_curl_easy_proxy_headers_get, 0);
3713
+
3523
3714
  rb_define_method(cCurlEasy, "headers=", ruby_curl_easy_headers_set, 1);
3524
3715
  rb_define_method(cCurlEasy, "headers", ruby_curl_easy_headers_get, 0);
3525
3716
  rb_define_method(cCurlEasy, "interface", ruby_curl_easy_interface_get, 0);
@@ -3579,6 +3770,10 @@ void init_curb_easy() {
3579
3770
  rb_define_method(cCurlEasy, "low_speed_limit", ruby_curl_easy_low_speed_limit_get, 0);
3580
3771
  rb_define_method(cCurlEasy, "low_speed_time=", ruby_curl_easy_low_speed_time_set, 1);
3581
3772
  rb_define_method(cCurlEasy, "low_speed_time", ruby_curl_easy_low_speed_time_get, 0);
3773
+ rb_define_method(cCurlEasy, "max_send_speed_large=", ruby_curl_easy_max_send_speed_large_set, 1);
3774
+ rb_define_method(cCurlEasy, "max_send_speed_large", ruby_curl_easy_max_send_speed_large_get, 0);
3775
+ rb_define_method(cCurlEasy, "max_recv_speed_large=", ruby_curl_easy_max_recv_speed_large_set, 1);
3776
+ rb_define_method(cCurlEasy, "max_recv_speed_large", ruby_curl_easy_max_recv_speed_large_get, 0);
3582
3777
  rb_define_method(cCurlEasy, "ssl_version=", ruby_curl_easy_ssl_version_set, 1);
3583
3778
  rb_define_method(cCurlEasy, "ssl_version", ruby_curl_easy_ssl_version_get, 0);
3584
3779
  rb_define_method(cCurlEasy, "use_ssl=", ruby_curl_easy_use_ssl_set, 1);