curb 0.9.4 → 0.9.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.markdown +39 -19
- data/Rakefile +26 -10
- data/ext/curb.c +33 -6
- data/ext/curb.h +11 -4
- data/ext/curb_easy.c +375 -57
- data/ext/curb_easy.h +4 -0
- data/ext/curb_errors.c +86 -0
- data/ext/curb_multi.c +126 -165
- data/ext/curb_multi.h +0 -1
- data/ext/extconf.rb +31 -6
- data/lib/curb.rb +1 -0
- data/lib/curl.rb +7 -2
- data/lib/curl/easy.rb +10 -4
- data/lib/curl/multi.rb +50 -11
- data/tests/bug_issue277.rb +32 -0
- data/tests/helper.rb +89 -7
- data/tests/tc_curl.rb +31 -1
- data/tests/tc_curl_easy.rb +120 -16
- data/tests/tc_curl_easy_resolve.rb +16 -0
- data/tests/tc_curl_maxfilesize.rb +12 -0
- data/tests/tc_curl_multi.rb +68 -5
- metadata +27 -21
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 7fd2f75fea9421bc6361cd44ea7343f42867eb1f87177e20598be60548e68a07
|
4
|
+
data.tar.gz: e30c3e3ba5e406d5517ad89f728f0c4a95682c9ec750fc93ce3fb381da5ac2cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6140588c19e97ce62b9c180fe07355f4781adfa84d3066402378b3abc995c5e23d1abc7458e4575a91964c8ea9fe572276a73a1dab8447de8607325a3fc9463f
|
7
|
+
data.tar.gz: 88ef4f8b18028a2d6e695a543a624d1cd468482cbc06c13b94c94504a30711b9ff0b1d45b7c2f0af145a9114d1bef1975e5889f63fdd0e6387c2c86912394270
|
data/README.markdown
CHANGED
@@ -7,19 +7,35 @@ Curb (probably CUrl-RuBy or something) provides Ruby-language bindings for the
|
|
7
7
|
libcurl(3), a fully-featured client-side URL transfer library.
|
8
8
|
cURL and libcurl live at [http://curl.haxx.se/](http://curl.haxx.se/) .
|
9
9
|
|
10
|
-
Curb is a work-in-progress, and currently only supports libcurl's
|
10
|
+
Curb is a work-in-progress, and currently only supports libcurl's `easy` and `multi` modes.
|
11
11
|
|
12
12
|
## License
|
13
13
|
|
14
|
-
Curb is copyright (c)2006 Ross Bamford, and released under the terms of the
|
15
|
-
Ruby license. See the LICENSE file for the gory details.
|
14
|
+
Curb is copyright (c)2006 Ross Bamford, and released under the terms of the
|
15
|
+
Ruby license. See the LICENSE file for the gory details.
|
16
16
|
|
17
17
|
## You will need
|
18
18
|
|
19
|
-
* A working Ruby installation (1.8
|
20
|
-
* A working
|
19
|
+
* A working Ruby installation (`1.8.7+` will work but `2.1+` preferred)
|
20
|
+
* A working libcurl development installation
|
21
|
+
(Ideally one of the versions listed in the compatibility chart below that maps to your `curb` version)
|
21
22
|
* A sane build environment (e.g. gcc, make)
|
22
23
|
|
24
|
+
## Version Compatibility chart
|
25
|
+
|
26
|
+
A **non-exhaustive** set of compatibility versions of the libcurl library
|
27
|
+
with this gem are as follows. (Note that these are only the ones that have been
|
28
|
+
tested and reported to work across a variety of platforms / rubies)
|
29
|
+
|
30
|
+
| Gem Version | Release Date | libcurl versions |
|
31
|
+
| ----------- | ----------- | ---------------- |
|
32
|
+
| 0.9.8 | Jan 2019 | 7.58 - 7.63 |
|
33
|
+
| 0.9.7 | Nov 2018 | 7.56 - 7.60 |
|
34
|
+
| 0.9.6 | May 2018 | 7.51 - 7.59 |
|
35
|
+
| 0.9.5 | May 2018 | 7.51 - 7.59 |
|
36
|
+
| 0.9.4 | Aug 2017 | 7.41 - 7.58 |
|
37
|
+
| 0.9.3 | Apr 2016 | 7.26 - 7.58 |
|
38
|
+
|
23
39
|
## Installation...
|
24
40
|
|
25
41
|
... will usually be as simple as:
|
@@ -30,19 +46,23 @@ On Windows, make sure you're using the [DevKit](http://rubyinstaller.org/downloa
|
|
30
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
|
31
47
|
line (alter paths to your curl location, but remember to use forward slashes):
|
32
48
|
|
33
|
-
gem install curb --platform=ruby -- --with-curl-lib=C:/curl-7.39.0-devel-mingw32/
|
49
|
+
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
|
50
|
+
|
51
|
+
Note that with Windows moving from one method of compiling to another as of Ruby `2.4` (DevKit -> MYSYS2),
|
52
|
+
the usage of Ruby `2.4+` with this gem on windows is unlikely to work. It is advised to use the
|
53
|
+
latest version of Ruby 2.3 available [HERE](https://dl.bintray.com/oneclick/rubyinstaller/rubyinstaller-2.3.3.exe)
|
34
54
|
|
35
|
-
Or, if you downloaded the archive:
|
55
|
+
Or, if you downloaded the archive:
|
36
56
|
|
37
|
-
$ rake install
|
57
|
+
$ rake compile && rake install
|
38
58
|
|
39
59
|
If you have a weird setup, you might need extconf options. In this case, pass
|
40
60
|
them like so:
|
41
61
|
|
42
|
-
$ rake
|
43
|
-
|
62
|
+
$ rake compile EXTCONF_OPTS='--with-curl-dir=/path/to/libcurl --prefix=/what/ever' && rake install
|
63
|
+
|
44
64
|
Curb is tested only on GNU/Linux x86 and Mac OSX - YMMV on other platforms.
|
45
|
-
If you do use another platform and experience problems, or if you can
|
65
|
+
If you do use another platform and experience problems, or if you can
|
46
66
|
expand on the above instructions, please report the issue at http://github.com/taf2/curb/issues
|
47
67
|
|
48
68
|
On Ubuntu, the dependencies can be satisfied by installing the following packages:
|
@@ -52,7 +72,7 @@ On Ubuntu, the dependencies can be satisfied by installing the following package
|
|
52
72
|
On RedHat:
|
53
73
|
|
54
74
|
$ sudo yum install ruby-devel libcurl-devel openssl-devel
|
55
|
-
|
75
|
+
|
56
76
|
Curb has fairly extensive RDoc comments in the source. You can build the
|
57
77
|
documentation with:
|
58
78
|
|
@@ -80,7 +100,7 @@ puts http.body_str
|
|
80
100
|
http = Curl.post("http://www.google.com/", {:foo => "bar"})
|
81
101
|
puts http.body_str
|
82
102
|
|
83
|
-
http = Curl.get("http://www.google.com/") do|http|
|
103
|
+
http = Curl.get("http://www.google.com/") do |http|
|
84
104
|
http.headers['Cookie'] = 'foo=1;bar=2'
|
85
105
|
end
|
86
106
|
puts http.body_str
|
@@ -104,7 +124,7 @@ puts c.body_str
|
|
104
124
|
### Additional config:
|
105
125
|
|
106
126
|
```ruby
|
107
|
-
Curl::Easy.perform("http://www.google.co.uk") do |curl|
|
127
|
+
Curl::Easy.perform("http://www.google.co.uk") do |curl|
|
108
128
|
curl.headers["User-Agent"] = "myapp-0.0"
|
109
129
|
curl.verbose = true
|
110
130
|
end
|
@@ -113,7 +133,7 @@ end
|
|
113
133
|
Same thing, more manual:
|
114
134
|
|
115
135
|
```ruby
|
116
|
-
c = Curl::Easy.new("http://www.google.co.uk") do |curl|
|
136
|
+
c = Curl::Easy.new("http://www.google.co.uk") do |curl|
|
117
137
|
curl.headers["User-Agent"] = "myapp-0.0"
|
118
138
|
curl.verbose = true
|
119
139
|
end
|
@@ -134,9 +154,9 @@ c.perform
|
|
134
154
|
### HTTP "insecure" SSL connections (like curl -k, --insecure) to avoid Curl::Err::SSLCACertificateError:
|
135
155
|
|
136
156
|
```ruby
|
137
|
-
|
138
|
-
|
139
|
-
|
157
|
+
c = Curl::Easy.new("https://github.com/")
|
158
|
+
c.ssl_verify_peer = false
|
159
|
+
c.perform
|
140
160
|
```
|
141
161
|
|
142
162
|
### Supplying custom handlers:
|
@@ -194,7 +214,7 @@ puts (c.body_str.include? "You are using HTTP/2 right now!") ? "HTTP/2" : "HTTP/
|
|
194
214
|
# make multiple GET requests
|
195
215
|
easy_options = {:follow_location => true}
|
196
216
|
# Use Curl::CURLPIPE_MULTIPLEX for HTTP/2 multiplexing
|
197
|
-
multi_options = {:pipeline => Curl::CURLPIPE_HTTP1}
|
217
|
+
multi_options = {:pipeline => Curl::CURLPIPE_HTTP1}
|
198
218
|
|
199
219
|
Curl::Multi.get(['url1','url2','url3','url4','url5'], easy_options, multi_options) do|easy|
|
200
220
|
# do something interesting with the easy response
|
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
|
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
|
@@ -170,7 +186,7 @@ else
|
|
170
186
|
spec_source = File.read File.join(File.dirname(__FILE__),'curb.gemspec')
|
171
187
|
spec = nil
|
172
188
|
# see: http://gist.github.com/16215
|
173
|
-
Thread.new { spec = eval("
|
189
|
+
Thread.new { spec = eval("#{spec_source}") }.join
|
174
190
|
spec.validate
|
175
191
|
Gem::Package.build(spec)
|
176
192
|
end
|
data/ext/curb.c
CHANGED
@@ -272,15 +272,15 @@ void Init_curb_core() {
|
|
272
272
|
/* Passed to on_debug handler to indicate that the data is protocol data sent to the peer. */
|
273
273
|
rb_define_const(mCurl, "CURLINFO_DATA_OUT", LONG2NUM(CURLINFO_DATA_OUT));
|
274
274
|
|
275
|
-
#ifdef HAVE_CURLFTPMETHOD_MULTICWD
|
275
|
+
#ifdef HAVE_CURLFTPMETHOD_MULTICWD
|
276
276
|
rb_define_const(mCurl, "CURL_MULTICWD", LONG2NUM(CURLFTPMETHOD_MULTICWD));
|
277
277
|
#endif
|
278
278
|
|
279
|
-
#ifdef HAVE_CURLFTPMETHOD_NOCWD
|
279
|
+
#ifdef HAVE_CURLFTPMETHOD_NOCWD
|
280
280
|
rb_define_const(mCurl, "CURL_NOCWD", LONG2NUM(CURLFTPMETHOD_NOCWD));
|
281
281
|
#endif
|
282
282
|
|
283
|
-
#ifdef HAVE_CURLFTPMETHOD_SINGLECWD
|
283
|
+
#ifdef HAVE_CURLFTPMETHOD_SINGLECWD
|
284
284
|
rb_define_const(mCurl, "CURL_SINGLECWD", LONG2NUM(CURLFTPMETHOD_SINGLECWD));
|
285
285
|
#endif
|
286
286
|
|
@@ -296,13 +296,13 @@ void Init_curb_core() {
|
|
296
296
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1", LONG2NUM(CURL_SSLVERSION_TLSv1));
|
297
297
|
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv2", LONG2NUM(CURL_SSLVERSION_SSLv2));
|
298
298
|
rb_define_const(mCurl, "CURL_SSLVERSION_SSLv3", LONG2NUM(CURL_SSLVERSION_SSLv3));
|
299
|
-
#if
|
299
|
+
#if HAVE_CURL_SSLVERSION_TLSV1_0
|
300
300
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_0", LONG2NUM(CURL_SSLVERSION_TLSv1_0));
|
301
301
|
#endif
|
302
|
-
#if
|
302
|
+
#if HAVE_CURL_SSLVERSION_TLSV1_1
|
303
303
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_1", LONG2NUM(CURL_SSLVERSION_TLSv1_1));
|
304
304
|
#endif
|
305
|
-
#if
|
305
|
+
#if HAVE_CURL_SSLVERSION_TLSV1_2
|
306
306
|
rb_define_const(mCurl, "CURL_SSLVERSION_TLSv1_2", LONG2NUM(CURL_SSLVERSION_TLSv1_2));
|
307
307
|
#endif
|
308
308
|
|
@@ -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
|
@@ -609,6 +619,9 @@ void Init_curb_core() {
|
|
609
619
|
#if LIBCURL_VERSION_NUM >= 0x072100 /* 7.33.0 */
|
610
620
|
CURB_DEFINE(CURL_HTTP_VERSION_2_0);
|
611
621
|
#endif
|
622
|
+
#if LIBCURL_VERSION_NUM >= 0x072f00 /* 7.47.0 */
|
623
|
+
CURB_DEFINE(CURL_HTTP_VERSION_2TLS);
|
624
|
+
#endif
|
612
625
|
#if HAVE_CURLOPT_IGNORE_CONTENT_LENGTH
|
613
626
|
CURB_DEFINE(CURLOPT_IGNORE_CONTENT_LENGTH);
|
614
627
|
#endif
|
@@ -1023,6 +1036,20 @@ void Init_curb_core() {
|
|
1023
1036
|
CURB_DEFINE(CURLOPT_UNIX_SOCKET_PATH);
|
1024
1037
|
#endif
|
1025
1038
|
|
1039
|
+
#if HAVE_CURLOPT_PIPEWAIT
|
1040
|
+
CURB_DEFINE(CURLOPT_PIPEWAIT);
|
1041
|
+
#endif
|
1042
|
+
|
1043
|
+
#if HAVE_CURLOPT_TCP_KEEPALIVE
|
1044
|
+
CURB_DEFINE(CURLOPT_TCP_KEEPALIVE);
|
1045
|
+
CURB_DEFINE(CURLOPT_TCP_KEEPIDLE);
|
1046
|
+
CURB_DEFINE(CURLOPT_TCP_KEEPINTVL);
|
1047
|
+
#endif
|
1048
|
+
|
1049
|
+
#if HAVE_CURLOPT_HAPROXYPROTOCOL
|
1050
|
+
CURB_DEFINE(CURLOPT_HAPROXYPROTOCOL);
|
1051
|
+
#endif
|
1052
|
+
|
1026
1053
|
#if LIBCURL_VERSION_NUM >= 0x072B00 /* 7.43.0 */
|
1027
1054
|
CURB_DEFINE(CURLPIPE_NOTHING);
|
1028
1055
|
CURB_DEFINE(CURLPIPE_HTTP1);
|
data/ext/curb.h
CHANGED
@@ -9,6 +9,13 @@
|
|
9
9
|
#define __CURB_H
|
10
10
|
|
11
11
|
#include <ruby.h>
|
12
|
+
|
13
|
+
#ifdef HAVE_RUBY_IO_H
|
14
|
+
#include "ruby/io.h"
|
15
|
+
#else
|
16
|
+
#include "rubyio.h" // ruby 1.8
|
17
|
+
#endif
|
18
|
+
|
12
19
|
#include <curl/curl.h>
|
13
20
|
|
14
21
|
#include "curb_config.h"
|
@@ -20,11 +27,11 @@
|
|
20
27
|
#include "curb_macros.h"
|
21
28
|
|
22
29
|
// These should be managed from the Rake 'release' task.
|
23
|
-
#define CURB_VERSION "0.9.
|
24
|
-
#define CURB_VER_NUM
|
30
|
+
#define CURB_VERSION "0.9.10"
|
31
|
+
#define CURB_VER_NUM 9010
|
25
32
|
#define CURB_VER_MAJ 0
|
26
|
-
#define CURB_VER_MIN
|
27
|
-
#define CURB_VER_MIC
|
33
|
+
#define CURB_VER_MIN 9
|
34
|
+
#define CURB_VER_MIC 10
|
28
35
|
#define CURB_VER_PATCH 0
|
29
36
|
|
30
37
|
|
data/ext/curb_easy.c
CHANGED
@@ -25,12 +25,18 @@ static VALUE rbstrAmp;
|
|
25
25
|
|
26
26
|
VALUE cCurlEasy;
|
27
27
|
|
28
|
+
// for Ruby 1.8
|
29
|
+
#ifndef HAVE_RB_IO_STDIO_FILE
|
30
|
+
static FILE * rb_io_stdio_file(rb_io_t *fptr) {
|
31
|
+
return fptr->f;
|
32
|
+
}
|
33
|
+
#endif
|
28
34
|
|
29
35
|
/* ================== CURL HANDLER FUNCS ==============*/
|
30
36
|
|
31
37
|
static VALUE callback_exception(VALUE unused) {
|
32
38
|
return Qfalse;
|
33
|
-
}
|
39
|
+
}
|
34
40
|
|
35
41
|
/* These handle both body and header data */
|
36
42
|
static size_t default_data_handler(char *stream,
|
@@ -223,10 +229,18 @@ static void ruby_curl_easy_free(ruby_curl_easy *rbce) {
|
|
223
229
|
curl_slist_free_all(rbce->curl_headers);
|
224
230
|
}
|
225
231
|
|
232
|
+
if (rbce->curl_proxy_headers) {
|
233
|
+
curl_slist_free_all(rbce->curl_proxy_headers);
|
234
|
+
}
|
235
|
+
|
226
236
|
if (rbce->curl_ftp_commands) {
|
227
237
|
curl_slist_free_all(rbce->curl_ftp_commands);
|
228
238
|
}
|
229
239
|
|
240
|
+
if (rbce->curl_resolve) {
|
241
|
+
curl_slist_free_all(rbce->curl_resolve);
|
242
|
+
}
|
243
|
+
|
230
244
|
if (rbce->curl) {
|
231
245
|
/* disable any progress or debug events */
|
232
246
|
curl_easy_setopt(rbce->curl, CURLOPT_WRITEFUNCTION, NULL);
|
@@ -239,6 +253,7 @@ static void ruby_curl_easy_free(ruby_curl_easy *rbce) {
|
|
239
253
|
curl_easy_setopt(rbce->curl, CURLOPT_PROGRESSFUNCTION, NULL);
|
240
254
|
curl_easy_setopt(rbce->curl, CURLOPT_NOPROGRESS, 1);
|
241
255
|
curl_easy_cleanup(rbce->curl);
|
256
|
+
rbce->curl = NULL;
|
242
257
|
}
|
243
258
|
}
|
244
259
|
|
@@ -254,7 +269,9 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
|
|
254
269
|
rbce->opts = rb_hash_new();
|
255
270
|
|
256
271
|
rbce->curl_headers = NULL;
|
272
|
+
rbce->curl_proxy_headers = NULL;
|
257
273
|
rbce->curl_ftp_commands = NULL;
|
274
|
+
rbce->curl_resolve = NULL;
|
258
275
|
|
259
276
|
/* various-typed opts */
|
260
277
|
rbce->local_port = 0;
|
@@ -272,6 +289,8 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
|
|
272
289
|
rbce->ftp_response_timeout = 0;
|
273
290
|
rbce->low_speed_limit = 0;
|
274
291
|
rbce->low_speed_time = 0;
|
292
|
+
rbce->max_send_speed_large = 0;
|
293
|
+
rbce->max_recv_speed_large = 0;
|
275
294
|
rbce->ssl_version = -1;
|
276
295
|
rbce->use_ssl = -1;
|
277
296
|
rbce->ftp_filemethod = -1;
|
@@ -293,25 +312,37 @@ static void ruby_curl_easy_zero(ruby_curl_easy *rbce) {
|
|
293
312
|
rbce->callback_active = 0;
|
294
313
|
}
|
295
314
|
|
315
|
+
/*
|
316
|
+
* Allocate space for a Curl::Easy instance.
|
317
|
+
*/
|
318
|
+
static VALUE ruby_curl_easy_allocate(VALUE klass) {
|
319
|
+
ruby_curl_easy *rbce;
|
320
|
+
rbce = ALLOC(ruby_curl_easy);
|
321
|
+
rbce->curl = NULL;
|
322
|
+
rbce->opts = Qnil;
|
323
|
+
rbce->multi = Qnil;
|
324
|
+
ruby_curl_easy_zero(rbce);
|
325
|
+
return Data_Wrap_Struct(klass, curl_easy_mark, curl_easy_free, rbce);
|
326
|
+
}
|
327
|
+
|
296
328
|
/*
|
297
329
|
* call-seq:
|
298
330
|
* Curl::Easy.new => #<Curl::Easy...>
|
299
331
|
* Curl::Easy.new(url = nil) => #<Curl::Easy...>
|
300
332
|
* Curl::Easy.new(url = nil) { |self| ... } => #<Curl::Easy...>
|
301
333
|
*
|
302
|
-
*
|
334
|
+
* Initialize a new Curl::Easy instance, optionally supplying the URL.
|
303
335
|
* The block form allows further configuration to be supplied before
|
304
336
|
* the instance is returned.
|
305
337
|
*/
|
306
|
-
static VALUE
|
338
|
+
static VALUE ruby_curl_easy_initialize(int argc, VALUE *argv, VALUE self) {
|
307
339
|
CURLcode ecode;
|
308
340
|
VALUE url, blk;
|
309
|
-
VALUE new_curl;
|
310
341
|
ruby_curl_easy *rbce;
|
311
342
|
|
312
343
|
rb_scan_args(argc, argv, "01&", &url, &blk);
|
313
344
|
|
314
|
-
|
345
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
315
346
|
|
316
347
|
/* handler */
|
317
348
|
rbce->curl = curl_easy_init();
|
@@ -319,8 +350,6 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
|
|
319
350
|
rb_raise(eCurlErrFailedInit, "Failed to initialize easy handle");
|
320
351
|
}
|
321
352
|
|
322
|
-
new_curl = Data_Wrap_Struct(klass, curl_easy_mark, curl_easy_free, rbce);
|
323
|
-
|
324
353
|
rbce->multi = Qnil;
|
325
354
|
rbce->opts = Qnil;
|
326
355
|
|
@@ -328,17 +357,18 @@ static VALUE ruby_curl_easy_new(int argc, VALUE *argv, VALUE klass) {
|
|
328
357
|
|
329
358
|
rb_easy_set("url", url);
|
330
359
|
|
331
|
-
|
332
|
-
|
360
|
+
|
361
|
+
/* set the pointer to the curl handle */
|
362
|
+
ecode = curl_easy_setopt(rbce->curl, CURLOPT_PRIVATE, (void*)self);
|
333
363
|
if (ecode != CURLE_OK) {
|
334
364
|
raise_curl_easy_error_exception(ecode);
|
335
365
|
}
|
336
366
|
|
337
367
|
if (blk != Qnil) {
|
338
|
-
rb_funcall(blk, idCall, 1,
|
368
|
+
rb_funcall(blk, idCall, 1, self);
|
339
369
|
}
|
340
370
|
|
341
|
-
return
|
371
|
+
return self;
|
342
372
|
}
|
343
373
|
|
344
374
|
/*
|
@@ -358,7 +388,9 @@ static VALUE ruby_curl_easy_clone(VALUE self) {
|
|
358
388
|
memcpy(newrbce, rbce, sizeof(ruby_curl_easy));
|
359
389
|
newrbce->curl = curl_easy_duphandle(rbce->curl);
|
360
390
|
newrbce->curl_headers = NULL;
|
391
|
+
newrbce->curl_proxy_headers = NULL;
|
361
392
|
newrbce->curl_ftp_commands = NULL;
|
393
|
+
newrbce->curl_resolve = NULL;
|
362
394
|
|
363
395
|
return Data_Wrap_Struct(cCurlEasy, curl_easy_mark, curl_easy_free, newrbce);
|
364
396
|
}
|
@@ -368,7 +400,7 @@ static VALUE ruby_curl_easy_clone(VALUE self) {
|
|
368
400
|
* easy.close => nil
|
369
401
|
*
|
370
402
|
* Close the Curl::Easy instance. Any open connections are closed
|
371
|
-
* The easy handle is reinitialized. If a previous multi handle was
|
403
|
+
* The easy handle is reinitialized. If a previous multi handle was
|
372
404
|
* open it is set to nil and will be cleared after a GC.
|
373
405
|
*/
|
374
406
|
static VALUE ruby_curl_easy_close(VALUE self) {
|
@@ -441,6 +473,12 @@ static VALUE ruby_curl_easy_reset(VALUE self) {
|
|
441
473
|
rbce->curl_headers = NULL;
|
442
474
|
}
|
443
475
|
|
476
|
+
/* Free everything up */
|
477
|
+
if (rbce->curl_proxy_headers) {
|
478
|
+
curl_slist_free_all(rbce->curl_proxy_headers);
|
479
|
+
rbce->curl_proxy_headers = NULL;
|
480
|
+
}
|
481
|
+
|
444
482
|
return opts_dup;
|
445
483
|
}
|
446
484
|
|
@@ -493,6 +531,10 @@ static VALUE ruby_curl_easy_headers_set(VALUE self, VALUE headers) {
|
|
493
531
|
CURB_OBJECT_HSETTER(ruby_curl_easy, headers);
|
494
532
|
}
|
495
533
|
|
534
|
+
static VALUE ruby_curl_easy_proxy_headers_set(VALUE self, VALUE proxy_headers) {
|
535
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, proxy_headers);
|
536
|
+
}
|
537
|
+
|
496
538
|
/*
|
497
539
|
* call-seq:
|
498
540
|
* easy.headers => Hash, Array or Str
|
@@ -503,11 +545,46 @@ static VALUE ruby_curl_easy_headers_get(VALUE self) {
|
|
503
545
|
ruby_curl_easy *rbce;
|
504
546
|
VALUE headers;
|
505
547
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
506
|
-
headers = rb_easy_get("headers");//rb_hash_aref(rbce->opts, rb_intern("headers"));
|
548
|
+
headers = rb_easy_get("headers");//rb_hash_aref(rbce->opts, rb_intern("headers"));
|
507
549
|
if (headers == Qnil) { headers = rb_easy_set("headers", rb_hash_new()); }
|
508
550
|
return headers;
|
509
551
|
}
|
510
552
|
|
553
|
+
/*
|
554
|
+
* call-seq:
|
555
|
+
* easy.proxy_headers = "Header: val" => "Header: val"
|
556
|
+
* easy.proxy_headers = {"Header" => "val" ..., "Header" => "val"} => {"Header: val", ...}
|
557
|
+
* easy.proxy_headers = ["Header: val" ..., "Header: val"] => ["Header: val", ...]
|
558
|
+
*
|
559
|
+
*
|
560
|
+
* For example to set a standard or custom header:
|
561
|
+
*
|
562
|
+
* easy.proxy_headers["MyHeader"] = "myval"
|
563
|
+
*
|
564
|
+
* To remove a standard header (this is useful when removing libcurls default
|
565
|
+
* 'Expect: 100-Continue' header when using HTTP form posts):
|
566
|
+
*
|
567
|
+
* easy.proxy_headers["Expect"] = ''
|
568
|
+
*
|
569
|
+
* Anything passed to libcurl as a header will be converted to a string during
|
570
|
+
* the perform step.
|
571
|
+
*/
|
572
|
+
|
573
|
+
/*
|
574
|
+
* call-seq:
|
575
|
+
* easy.proxy_headers => Hash, Array or Str
|
576
|
+
*
|
577
|
+
* Obtain the custom HTTP proxy_headers for following requests.
|
578
|
+
*/
|
579
|
+
static VALUE ruby_curl_easy_proxy_headers_get(VALUE self) {
|
580
|
+
ruby_curl_easy *rbce;
|
581
|
+
VALUE proxy_headers;
|
582
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
583
|
+
proxy_headers = rb_easy_get("proxy_headers");//rb_hash_aref(rbce->opts, rb_intern("proxy_headers"));
|
584
|
+
if (proxy_headers == Qnil) { proxy_headers = rb_easy_set("proxy_headers", rb_hash_new()); }
|
585
|
+
return proxy_headers;
|
586
|
+
}
|
587
|
+
|
511
588
|
/*
|
512
589
|
* call-seq:
|
513
590
|
* easy.interface => string
|
@@ -715,29 +792,29 @@ static VALUE ruby_curl_easy_useragent_get(VALUE self) {
|
|
715
792
|
/*
|
716
793
|
* call-seq:
|
717
794
|
* easy.post_body = "some=form%20data&to=send" => string or nil
|
718
|
-
*
|
795
|
+
*
|
719
796
|
* Sets the POST body of this Curl::Easy instance. This is expected to be
|
720
797
|
* URL encoded; no additional processing or encoding is done on the string.
|
721
798
|
* The content-type header will be set to application/x-www-form-urlencoded.
|
722
|
-
*
|
799
|
+
*
|
723
800
|
* This is handy if you want to perform a POST against a Curl::Multi instance.
|
724
801
|
*/
|
725
802
|
static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
726
803
|
ruby_curl_easy *rbce;
|
727
804
|
CURL *curl;
|
728
|
-
|
805
|
+
|
729
806
|
char *data;
|
730
807
|
long len;
|
731
808
|
|
732
809
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
733
|
-
|
810
|
+
|
734
811
|
curl = rbce->curl;
|
735
|
-
|
812
|
+
|
736
813
|
if ( post_body == Qnil ) {
|
737
814
|
rb_easy_del("postdata_buffer");
|
738
815
|
curl_easy_setopt(curl, CURLOPT_HTTPGET, 1);
|
739
|
-
|
740
|
-
} else {
|
816
|
+
|
817
|
+
} else {
|
741
818
|
if (rb_type(post_body) == T_STRING) {
|
742
819
|
data = StringValuePtr(post_body);
|
743
820
|
len = RSTRING_LEN(post_body);
|
@@ -750,19 +827,19 @@ static VALUE ruby_curl_easy_post_body_set(VALUE self, VALUE post_body) {
|
|
750
827
|
else {
|
751
828
|
rb_raise(rb_eRuntimeError, "post data must respond_to .to_s");
|
752
829
|
}
|
753
|
-
|
754
|
-
// Store the string, since it has to hang around for the duration of the
|
830
|
+
|
831
|
+
// Store the string, since it has to hang around for the duration of the
|
755
832
|
// request. See CURLOPT_POSTFIELDS in the libcurl docs.
|
756
833
|
//rbce->postdata_buffer = post_body;
|
757
834
|
rb_easy_set("postdata_buffer", post_body);
|
758
|
-
|
835
|
+
|
759
836
|
curl_easy_setopt(curl, CURLOPT_POST, 1);
|
760
837
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
|
761
838
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, len);
|
762
|
-
|
839
|
+
|
763
840
|
return post_body;
|
764
841
|
}
|
765
|
-
|
842
|
+
|
766
843
|
return Qnil;
|
767
844
|
}
|
768
845
|
|
@@ -779,7 +856,7 @@ static VALUE ruby_curl_easy_post_body_get(VALUE self) {
|
|
779
856
|
/*
|
780
857
|
* call-seq:
|
781
858
|
* easy.put_data = data => ""
|
782
|
-
*
|
859
|
+
*
|
783
860
|
* Points this Curl::Easy instance to data to be uploaded via PUT. This
|
784
861
|
* sets the request to a PUT type request - useful if you want to PUT via
|
785
862
|
* a multi handle.
|
@@ -811,7 +888,7 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
811
888
|
curl_easy_setopt(curl, CURLOPT_SEEKDATA, rbce);
|
812
889
|
#endif
|
813
890
|
|
814
|
-
/*
|
891
|
+
/*
|
815
892
|
* we need to set specific headers for the PUT to work... so
|
816
893
|
* convert the internal headers structure to a HASH if one is set
|
817
894
|
*/
|
@@ -825,7 +902,7 @@ static VALUE ruby_curl_easy_put_data_set(VALUE self, VALUE data) {
|
|
825
902
|
if (NIL_P(data)) { return data; }
|
826
903
|
|
827
904
|
headers = rb_easy_get("headers");
|
828
|
-
if( headers == Qnil ) {
|
905
|
+
if( headers == Qnil ) {
|
829
906
|
headers = rb_hash_new();
|
830
907
|
}
|
831
908
|
|
@@ -880,6 +957,25 @@ static VALUE ruby_curl_easy_ftp_commands_get(VALUE self) {
|
|
880
957
|
CURB_OBJECT_HGETTER(ruby_curl_easy, ftp_commands);
|
881
958
|
}
|
882
959
|
|
960
|
+
/*
|
961
|
+
* call-seq:
|
962
|
+
* easy.resolve = [ "example.com:80:127.0.0.1" ] => [ "example.com:80:127.0.0.1" ]
|
963
|
+
*
|
964
|
+
* Set the resolve list to statically resolve hostnames to IP addresses,
|
965
|
+
* bypassing DNS for matching hostname/port combinations.
|
966
|
+
*/
|
967
|
+
static VALUE ruby_curl_easy_resolve_set(VALUE self, VALUE resolve) {
|
968
|
+
CURB_OBJECT_HSETTER(ruby_curl_easy, resolve);
|
969
|
+
}
|
970
|
+
|
971
|
+
/*
|
972
|
+
* call-seq
|
973
|
+
* easy.resolve => array or nil
|
974
|
+
*/
|
975
|
+
static VALUE ruby_curl_easy_resolve_get(VALUE self) {
|
976
|
+
CURB_OBJECT_HGETTER(ruby_curl_easy, resolve);
|
977
|
+
}
|
978
|
+
|
883
979
|
/* ================== IMMED ATTRS ==================*/
|
884
980
|
|
885
981
|
/*
|
@@ -990,7 +1086,7 @@ static VALUE ruby_curl_easy_proxy_type_get(VALUE self) {
|
|
990
1086
|
(!strncmp("ntlm",node,4)) ? CURLAUTH_NTLM : \
|
991
1087
|
(!strncmp("anysafe",node,7)) ? CURLAUTH_ANYSAFE : \
|
992
1088
|
(!strncmp("any",node,3)) ? CURLAUTH_ANY : 0
|
993
|
-
#else
|
1089
|
+
#else
|
994
1090
|
#define CURL_HTTPAUTH_STR_TO_NUM(node) \
|
995
1091
|
(!strncmp("basic",node,5)) ? CURLAUTH_BASIC : \
|
996
1092
|
(!strncmp("digest",node,6)) ? CURLAUTH_DIGEST : \
|
@@ -1022,7 +1118,7 @@ static VALUE ruby_curl_easy_http_auth_types_set(int argc, VALUE *argv, VALUE sel
|
|
1022
1118
|
|
1023
1119
|
if (len == 1 && (rb_ary_entry(args_ary,0) == Qnil || TYPE(rb_ary_entry(args_ary,0)) == T_FIXNUM ||
|
1024
1120
|
TYPE(rb_ary_entry(args_ary,0)) == T_BIGNUM)) {
|
1025
|
-
if (rb_ary_entry(args_ary,0) == Qnil) {
|
1121
|
+
if (rb_ary_entry(args_ary,0) == Qnil) {
|
1026
1122
|
rbce->http_auth_types = 0;
|
1027
1123
|
}
|
1028
1124
|
else {
|
@@ -1104,7 +1200,7 @@ static VALUE ruby_curl_easy_max_redirects_get(VALUE self) {
|
|
1104
1200
|
|
1105
1201
|
/*
|
1106
1202
|
* call-seq:
|
1107
|
-
* easy.timeout = fixnum or nil
|
1203
|
+
* easy.timeout = float, fixnum or nil => numeric
|
1108
1204
|
*
|
1109
1205
|
* Set the maximum time in seconds that you allow the libcurl transfer
|
1110
1206
|
* operation to take. Normally, name lookups can take a considerable time
|
@@ -1113,20 +1209,39 @@ static VALUE ruby_curl_easy_max_redirects_get(VALUE self) {
|
|
1113
1209
|
*
|
1114
1210
|
* Set to nil (or zero) to disable timeout (it will then only timeout
|
1115
1211
|
* on the system's internal timeouts).
|
1212
|
+
*
|
1213
|
+
* Uses timeout_ms internally instead of timeout because it allows for
|
1214
|
+
* better precision and libcurl will use the last set value when both
|
1215
|
+
* timeout and timeout_ms are set.
|
1216
|
+
*
|
1116
1217
|
*/
|
1117
|
-
static VALUE ruby_curl_easy_timeout_set(VALUE self, VALUE
|
1118
|
-
|
1218
|
+
static VALUE ruby_curl_easy_timeout_set(VALUE self, VALUE timeout_s) {
|
1219
|
+
ruby_curl_easy *rbce;
|
1220
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
1221
|
+
|
1222
|
+
if (Qnil == timeout_s || NUM2DBL(timeout_s) <= 0.0) {
|
1223
|
+
rbce->timeout_ms = 0;
|
1224
|
+
} else {
|
1225
|
+
rbce->timeout_ms = (unsigned long)(NUM2DBL(timeout_s) * 1000);
|
1226
|
+
}
|
1227
|
+
|
1228
|
+
return DBL2NUM(rbce->timeout_ms / 1000.0);
|
1119
1229
|
}
|
1120
1230
|
|
1121
1231
|
/*
|
1122
1232
|
* call-seq:
|
1123
|
-
* easy.timeout =>
|
1233
|
+
* easy.timeout => numeric
|
1124
1234
|
*
|
1125
1235
|
* Obtain the maximum time in seconds that you allow the libcurl transfer
|
1126
1236
|
* operation to take.
|
1237
|
+
*
|
1238
|
+
* Uses timeout_ms internally instead of timeout.
|
1239
|
+
*
|
1127
1240
|
*/
|
1128
|
-
static VALUE ruby_curl_easy_timeout_get(VALUE self
|
1129
|
-
|
1241
|
+
static VALUE ruby_curl_easy_timeout_get(VALUE self) {
|
1242
|
+
ruby_curl_easy *rbce;
|
1243
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
1244
|
+
return DBL2NUM(rbce->timeout_ms / 1000.0);
|
1130
1245
|
}
|
1131
1246
|
|
1132
1247
|
/*
|
@@ -1142,7 +1257,16 @@ static VALUE ruby_curl_easy_timeout_get(VALUE self, VALUE timeout) {
|
|
1142
1257
|
* on the system's internal timeouts).
|
1143
1258
|
*/
|
1144
1259
|
static VALUE ruby_curl_easy_timeout_ms_set(VALUE self, VALUE timeout_ms) {
|
1145
|
-
|
1260
|
+
ruby_curl_easy *rbce;
|
1261
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
1262
|
+
|
1263
|
+
if (Qnil == timeout_ms || NUM2DBL(timeout_ms) <= 0.0) {
|
1264
|
+
rbce->timeout_ms = 0;
|
1265
|
+
} else {
|
1266
|
+
rbce->timeout_ms = NUM2ULONG(timeout_ms);
|
1267
|
+
}
|
1268
|
+
|
1269
|
+
return ULONG2NUM(rbce->timeout_ms);
|
1146
1270
|
}
|
1147
1271
|
|
1148
1272
|
/*
|
@@ -1152,8 +1276,10 @@ static VALUE ruby_curl_easy_timeout_ms_set(VALUE self, VALUE timeout_ms) {
|
|
1152
1276
|
* Obtain the maximum time in milliseconds that you allow the libcurl transfer
|
1153
1277
|
* operation to take.
|
1154
1278
|
*/
|
1155
|
-
static VALUE ruby_curl_easy_timeout_ms_get(VALUE self
|
1156
|
-
|
1279
|
+
static VALUE ruby_curl_easy_timeout_ms_get(VALUE self) {
|
1280
|
+
ruby_curl_easy *rbce;
|
1281
|
+
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
1282
|
+
return LONG2NUM(rbce->timeout_ms);
|
1157
1283
|
}
|
1158
1284
|
|
1159
1285
|
/*
|
@@ -1303,6 +1429,46 @@ static VALUE ruby_curl_easy_low_speed_time_get(VALUE self, VALUE low_speed_time)
|
|
1303
1429
|
CURB_IMMED_GETTER(ruby_curl_easy, low_speed_time, 0);
|
1304
1430
|
}
|
1305
1431
|
|
1432
|
+
/*
|
1433
|
+
* call-seq:
|
1434
|
+
* easy.max_send_speed_large = fixnum or nil => fixnum or nil
|
1435
|
+
*
|
1436
|
+
* Set the maximal sending transfer speed (in bytes per second)
|
1437
|
+
*/
|
1438
|
+
static VALUE ruby_curl_easy_max_send_speed_large_set(VALUE self, VALUE max_send_speed_large) {
|
1439
|
+
CURB_IMMED_SETTER(ruby_curl_easy, max_send_speed_large, 0);
|
1440
|
+
}
|
1441
|
+
|
1442
|
+
/*
|
1443
|
+
* call-seq:
|
1444
|
+
* easy.max_send_speed_large = fixnum or nil => fixnum or nil
|
1445
|
+
*
|
1446
|
+
* Get the maximal sending transfer speed (in bytes per second)
|
1447
|
+
*/
|
1448
|
+
static VALUE ruby_curl_easy_max_send_speed_large_get(VALUE self, VALUE max_send_speed_large) {
|
1449
|
+
CURB_IMMED_GETTER(ruby_curl_easy, max_send_speed_large, 0);
|
1450
|
+
}
|
1451
|
+
|
1452
|
+
/*
|
1453
|
+
* call-seq:
|
1454
|
+
* easy.max_recv_speed_large = fixnum or nil => fixnum or nil
|
1455
|
+
*
|
1456
|
+
* Set the maximal receiving transfer speed (in bytes per second)
|
1457
|
+
*/
|
1458
|
+
static VALUE ruby_curl_easy_max_recv_speed_large_set(VALUE self, VALUE max_recv_speed_large) {
|
1459
|
+
CURB_IMMED_SETTER(ruby_curl_easy, max_recv_speed_large, 0);
|
1460
|
+
}
|
1461
|
+
|
1462
|
+
/*
|
1463
|
+
* call-seq:
|
1464
|
+
* easy.max_recv_speed_large = fixnum or nil => fixnum or nil
|
1465
|
+
*
|
1466
|
+
* Get the maximal receiving transfer speed (in bytes per second)
|
1467
|
+
*/
|
1468
|
+
static VALUE ruby_curl_easy_max_recv_speed_large_get(VALUE self, VALUE max_recv_speed_large) {
|
1469
|
+
CURB_IMMED_GETTER(ruby_curl_easy, max_recv_speed_large, 0);
|
1470
|
+
}
|
1471
|
+
|
1306
1472
|
/*
|
1307
1473
|
* call-seq:
|
1308
1474
|
* easy.username = string => string
|
@@ -1320,7 +1486,7 @@ static VALUE ruby_curl_easy_username_set(VALUE self, VALUE username) {
|
|
1320
1486
|
/*
|
1321
1487
|
* call-seq:
|
1322
1488
|
* easy.username => string
|
1323
|
-
*
|
1489
|
+
*
|
1324
1490
|
* Get the current username
|
1325
1491
|
*/
|
1326
1492
|
static VALUE ruby_curl_easy_username_get(VALUE self, VALUE username) {
|
@@ -1348,7 +1514,7 @@ static VALUE ruby_curl_easy_password_set(VALUE self, VALUE password) {
|
|
1348
1514
|
/*
|
1349
1515
|
* call-seq:
|
1350
1516
|
* easy.password => string
|
1351
|
-
*
|
1517
|
+
*
|
1352
1518
|
* Get the current password
|
1353
1519
|
*/
|
1354
1520
|
static VALUE ruby_curl_easy_password_get(VALUE self, VALUE password) {
|
@@ -1391,7 +1557,7 @@ static VALUE ruby_curl_easy_ssl_version_get(VALUE self, VALUE ssl_version) {
|
|
1391
1557
|
/*
|
1392
1558
|
* call-seq:
|
1393
1559
|
* easy.use_ssl = value => fixnum or nil
|
1394
|
-
*
|
1560
|
+
*
|
1395
1561
|
* Ensure libcurl uses SSL for FTP connections. Valid options are Curl::CURL_USESSL_NONE,
|
1396
1562
|
* Curl::CURL_USESSL_TRY, Curl::CURL_USESSL_CONTROL, and Curl::CURL_USESSL_ALL.
|
1397
1563
|
*/
|
@@ -1848,7 +2014,7 @@ static VALUE ruby_curl_easy_on_failure_set(int argc, VALUE *argv, VALUE self) {
|
|
1848
2014
|
* To remove a previously-supplied handler, call this method with no attached
|
1849
2015
|
* block.
|
1850
2016
|
*
|
1851
|
-
* The +on_missing+ handler is called when request is finished with a
|
2017
|
+
* The +on_missing+ handler is called when request is finished with a
|
1852
2018
|
* status of 40x
|
1853
2019
|
*/
|
1854
2020
|
static VALUE ruby_curl_easy_on_missing_set(int argc, VALUE *argv, VALUE self) {
|
@@ -1863,7 +2029,7 @@ static VALUE ruby_curl_easy_on_missing_set(int argc, VALUE *argv, VALUE self) {
|
|
1863
2029
|
* To remove a previously-supplied handler, call this method with no attached
|
1864
2030
|
* block.
|
1865
2031
|
*
|
1866
|
-
* The +on_redirect+ handler is called when request is finished with a
|
2032
|
+
* The +on_redirect+ handler is called when request is finished with a
|
1867
2033
|
* status of 30x
|
1868
2034
|
*/
|
1869
2035
|
static VALUE ruby_curl_easy_on_redirect_set(int argc, VALUE *argv, VALUE self) {
|
@@ -1977,6 +2143,38 @@ static VALUE cb_each_http_header(VALUE header, VALUE wrap) {
|
|
1977
2143
|
return header_str;
|
1978
2144
|
}
|
1979
2145
|
|
2146
|
+
/***********************************************
|
2147
|
+
* This is an rb_iterate callback used to set up http proxy headers.
|
2148
|
+
*/
|
2149
|
+
static VALUE cb_each_http_proxy_header(VALUE proxy_header, VALUE wrap) {
|
2150
|
+
struct curl_slist **list;
|
2151
|
+
VALUE proxy_header_str = Qnil;
|
2152
|
+
|
2153
|
+
Data_Get_Struct(wrap, struct curl_slist *, list);
|
2154
|
+
|
2155
|
+
//rb_p(proxy_header);
|
2156
|
+
|
2157
|
+
if (rb_type(proxy_header) == T_ARRAY) {
|
2158
|
+
// we're processing a hash, proxy header is [name, val]
|
2159
|
+
VALUE name, value;
|
2160
|
+
|
2161
|
+
name = rb_obj_as_string(rb_ary_entry(proxy_header, 0));
|
2162
|
+
value = rb_obj_as_string(rb_ary_entry(proxy_header, 1));
|
2163
|
+
|
2164
|
+
// This is a bit inefficient, but we don't want to be modifying
|
2165
|
+
// the actual values in the original hash.
|
2166
|
+
proxy_header_str = rb_str_plus(name, rb_str_new2(": "));
|
2167
|
+
proxy_header_str = rb_str_plus(proxy_header_str, value);
|
2168
|
+
} else {
|
2169
|
+
proxy_header_str = rb_obj_as_string(proxy_header);
|
2170
|
+
}
|
2171
|
+
|
2172
|
+
//rb_p(header_str);
|
2173
|
+
|
2174
|
+
*list = curl_slist_append(*list, StringValuePtr(proxy_header_str));
|
2175
|
+
return proxy_header_str;
|
2176
|
+
}
|
2177
|
+
|
1980
2178
|
/***********************************************
|
1981
2179
|
* This is an rb_iterate callback used to set up ftp commands.
|
1982
2180
|
*/
|
@@ -1991,6 +2189,20 @@ static VALUE cb_each_ftp_command(VALUE ftp_command, VALUE wrap) {
|
|
1991
2189
|
return ftp_command_string;
|
1992
2190
|
}
|
1993
2191
|
|
2192
|
+
/***********************************************
|
2193
|
+
* This is an rb_iterate callback used to set up the resolve list.
|
2194
|
+
*/
|
2195
|
+
static VALUE cb_each_resolve(VALUE resolve, VALUE wrap) {
|
2196
|
+
struct curl_slist **list;
|
2197
|
+
VALUE resolve_string;
|
2198
|
+
Data_Get_Struct(wrap, struct curl_slist *, list);
|
2199
|
+
|
2200
|
+
resolve_string = rb_obj_as_string(resolve);
|
2201
|
+
*list = curl_slist_append(*list, StringValuePtr(resolve));
|
2202
|
+
|
2203
|
+
return resolve_string;
|
2204
|
+
}
|
2205
|
+
|
1994
2206
|
/***********************************************
|
1995
2207
|
*
|
1996
2208
|
* Setup a connection
|
@@ -2002,7 +2214,9 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2002
2214
|
CURL *curl;
|
2003
2215
|
VALUE url, _url = rb_easy_get("url");
|
2004
2216
|
struct curl_slist **hdrs = &(rbce->curl_headers);
|
2217
|
+
struct curl_slist **phdrs = &(rbce->curl_proxy_headers);
|
2005
2218
|
struct curl_slist **cmds = &(rbce->curl_ftp_commands);
|
2219
|
+
struct curl_slist **rslv = &(rbce->curl_resolve);
|
2006
2220
|
|
2007
2221
|
curl = rbce->curl;
|
2008
2222
|
|
@@ -2011,7 +2225,6 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2011
2225
|
}
|
2012
2226
|
|
2013
2227
|
url = rb_check_string_type(_url);
|
2014
|
-
|
2015
2228
|
curl_easy_setopt(curl, CURLOPT_URL, StringValuePtr(url));
|
2016
2229
|
|
2017
2230
|
// network stuff and auth
|
@@ -2124,15 +2337,14 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2124
2337
|
|
2125
2338
|
curl_easy_setopt(curl, CURLOPT_UNRESTRICTED_AUTH, rbce->unrestricted_auth);
|
2126
2339
|
|
2127
|
-
|
2128
|
-
|
2129
|
-
|
2130
|
-
|
2131
|
-
if (rbce->timeout_ms && rbce->timeout_ms > 0) {
|
2132
|
-
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, rbce->timeout_ms);
|
2133
|
-
}
|
2340
|
+
#if HAVE_CURLOPT_TIMEOUT_MS
|
2341
|
+
curl_easy_setopt(curl, CURLOPT_TIMEOUT_MS, rbce->timeout_ms);
|
2342
|
+
#endif
|
2343
|
+
|
2134
2344
|
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, rbce->connect_timeout);
|
2345
|
+
#if HAVE_CURLOPT_CONNECTTIMEOUT_MS
|
2135
2346
|
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT_MS, rbce->connect_timeout_ms);
|
2347
|
+
#endif
|
2136
2348
|
curl_easy_setopt(curl, CURLOPT_DNS_CACHE_TIMEOUT, rbce->dns_cache_timeout);
|
2137
2349
|
|
2138
2350
|
curl_easy_setopt(curl, CURLOPT_IGNORE_CONTENT_LENGTH, rbce->ignore_content_length);
|
@@ -2151,6 +2363,9 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2151
2363
|
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, rbce->low_speed_limit);
|
2152
2364
|
curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, rbce->low_speed_time);
|
2153
2365
|
|
2366
|
+
curl_easy_setopt(curl, CURLOPT_MAX_RECV_SPEED_LARGE, rbce->max_recv_speed_large);
|
2367
|
+
curl_easy_setopt(curl, CURLOPT_MAX_SEND_SPEED_LARGE, rbce->max_send_speed_large);
|
2368
|
+
|
2154
2369
|
// Set up localport / proxy port
|
2155
2370
|
// FIXME these won't get returned to default if they're unset Ruby
|
2156
2371
|
if (rbce->proxy_port > 0) {
|
@@ -2257,7 +2472,7 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2257
2472
|
rb_warn("libcurl is not configured with SSL support");
|
2258
2473
|
}
|
2259
2474
|
#endif
|
2260
|
-
|
2475
|
+
|
2261
2476
|
if (rbce->ftp_filemethod > 0) {
|
2262
2477
|
curl_easy_setopt(curl, CURLOPT_FTP_FILEMETHOD, rbce->ftp_filemethod);
|
2263
2478
|
}
|
@@ -2284,6 +2499,25 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2284
2499
|
}
|
2285
2500
|
}
|
2286
2501
|
|
2502
|
+
#if HAVE_CURLOPT_PROXYHEADER
|
2503
|
+
/* Setup HTTP proxy headers if necessary */
|
2504
|
+
curl_easy_setopt(curl, CURLOPT_PROXYHEADER, NULL); // XXX: maybe we shouldn't be clearing this?
|
2505
|
+
|
2506
|
+
if (!rb_easy_nil("proxy_headers")) {
|
2507
|
+
if (rb_easy_type_check("proxy_headers", T_ARRAY) || rb_easy_type_check("proxy_headers", T_HASH)) {
|
2508
|
+
VALUE wrap = Data_Wrap_Struct(rb_cObject, 0, 0, phdrs);
|
2509
|
+
rb_iterate(rb_each, rb_easy_get("proxy_headers"), cb_each_http_proxy_header, wrap);
|
2510
|
+
} else {
|
2511
|
+
VALUE proxy_headers_str = rb_obj_as_string(rb_easy_get("proxy_headers"));
|
2512
|
+
*phdrs = curl_slist_append(*hdrs, StringValuePtr(proxy_headers_str));
|
2513
|
+
}
|
2514
|
+
|
2515
|
+
if (*phdrs) {
|
2516
|
+
curl_easy_setopt(curl, CURLOPT_PROXYHEADER, *phdrs);
|
2517
|
+
}
|
2518
|
+
}
|
2519
|
+
#endif
|
2520
|
+
|
2287
2521
|
/* Setup FTP commands if necessary */
|
2288
2522
|
if (!rb_easy_nil("ftp_commands")) {
|
2289
2523
|
if (rb_easy_type_check("ftp_commands", T_ARRAY)) {
|
@@ -2296,18 +2530,33 @@ VALUE ruby_curl_easy_setup(ruby_curl_easy *rbce) {
|
|
2296
2530
|
}
|
2297
2531
|
}
|
2298
2532
|
|
2533
|
+
#if HAVE_CURLOPT_RESOLVE
|
2534
|
+
/* Setup resolve list if necessary */
|
2535
|
+
if (!rb_easy_nil("resolve")) {
|
2536
|
+
if (rb_easy_type_check("resolve", T_ARRAY)) {
|
2537
|
+
VALUE wrap = Data_Wrap_Struct(rb_cObject, 0, 0, rslv);
|
2538
|
+
rb_iterate(rb_each, rb_easy_get("resolve"), cb_each_resolve, wrap);
|
2539
|
+
}
|
2540
|
+
|
2541
|
+
if (*rslv) {
|
2542
|
+
curl_easy_setopt(curl, CURLOPT_RESOLVE, *rslv);
|
2543
|
+
}
|
2544
|
+
}
|
2545
|
+
#endif
|
2546
|
+
|
2299
2547
|
return Qnil;
|
2300
2548
|
}
|
2301
2549
|
/***********************************************
|
2302
2550
|
*
|
2303
2551
|
* Clean up a connection
|
2304
2552
|
*
|
2305
|
-
* Always returns
|
2553
|
+
* Always returns Qnil.
|
2306
2554
|
*/
|
2307
2555
|
VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
2308
2556
|
|
2309
2557
|
CURL *curl = rbce->curl;
|
2310
2558
|
struct curl_slist *ftp_commands;
|
2559
|
+
struct curl_slist *resolve;
|
2311
2560
|
|
2312
2561
|
/* Free everything up */
|
2313
2562
|
if (rbce->curl_headers) {
|
@@ -2315,12 +2564,23 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
|
2315
2564
|
rbce->curl_headers = NULL;
|
2316
2565
|
}
|
2317
2566
|
|
2567
|
+
if (rbce->curl_proxy_headers) {
|
2568
|
+
curl_slist_free_all(rbce->curl_proxy_headers);
|
2569
|
+
rbce->curl_proxy_headers = NULL;
|
2570
|
+
}
|
2571
|
+
|
2318
2572
|
ftp_commands = rbce->curl_ftp_commands;
|
2319
2573
|
if (ftp_commands) {
|
2320
2574
|
curl_slist_free_all(ftp_commands);
|
2321
2575
|
rbce->curl_ftp_commands = NULL;
|
2322
2576
|
}
|
2323
2577
|
|
2578
|
+
resolve = rbce->curl_resolve;
|
2579
|
+
if (resolve) {
|
2580
|
+
curl_slist_free_all(resolve);
|
2581
|
+
rbce->curl_resolve = NULL;
|
2582
|
+
}
|
2583
|
+
|
2324
2584
|
/* clean up a PUT request's curl options. */
|
2325
2585
|
if (!rb_easy_nil("upload")) {
|
2326
2586
|
rb_easy_del("upload"); // set the upload object to Qnil to let the GC clean up
|
@@ -2330,6 +2590,9 @@ VALUE ruby_curl_easy_cleanup( VALUE self, ruby_curl_easy *rbce ) {
|
|
2330
2590
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE, 0);
|
2331
2591
|
}
|
2332
2592
|
|
2593
|
+
// set values on cleanup to nil
|
2594
|
+
rb_easy_del("multi");
|
2595
|
+
|
2333
2596
|
return Qnil;
|
2334
2597
|
}
|
2335
2598
|
|
@@ -2574,7 +2837,7 @@ static VALUE ruby_curl_easy_response_code_get(VALUE self) {
|
|
2574
2837
|
static VALUE ruby_curl_easy_primary_ip_get(VALUE self) {
|
2575
2838
|
ruby_curl_easy *rbce;
|
2576
2839
|
char* ip;
|
2577
|
-
|
2840
|
+
|
2578
2841
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
2579
2842
|
curl_easy_getinfo(rbce->curl, CURLINFO_PRIMARY_IP, &ip);
|
2580
2843
|
|
@@ -2799,7 +3062,7 @@ static VALUE ruby_curl_easy_redirect_count_get(VALUE self) {
|
|
2799
3062
|
* call-seq:
|
2800
3063
|
* easy.redirect_url => "http://some.url" or nil
|
2801
3064
|
*
|
2802
|
-
* Retrieve the URL a redirect would take you to if you
|
3065
|
+
* Retrieve the URL a redirect would take you to if you
|
2803
3066
|
* would enable CURLOPT_FOLLOWLOCATION.
|
2804
3067
|
*
|
2805
3068
|
* Requires libcurl 7.18.2 or higher, otherwise -1 is always returned.
|
@@ -3194,6 +3457,7 @@ static VALUE ruby_curl_easy_last_result(VALUE self) {
|
|
3194
3457
|
static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
3195
3458
|
ruby_curl_easy *rbce;
|
3196
3459
|
long option = NUM2LONG(opt);
|
3460
|
+
rb_io_t *open_f_ptr;
|
3197
3461
|
|
3198
3462
|
Data_Get_Struct(self, ruby_curl_easy, rbce);
|
3199
3463
|
|
@@ -3233,6 +3497,9 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3233
3497
|
case CURLOPT_NOSIGNAL:
|
3234
3498
|
#if HAVE_CURLOPT_PATH_AS_IS
|
3235
3499
|
case CURLOPT_PATH_AS_IS:
|
3500
|
+
#endif
|
3501
|
+
#if HAVE_CURLOPT_PIPEWAIT
|
3502
|
+
case CURLOPT_PIPEWAIT:
|
3236
3503
|
#endif
|
3237
3504
|
case CURLOPT_HTTPGET:
|
3238
3505
|
case CURLOPT_NOBODY: {
|
@@ -3301,6 +3568,44 @@ static VALUE ruby_curl_easy_set_opt(VALUE self, VALUE opt, VALUE val) {
|
|
3301
3568
|
curl_easy_setopt(rbce->curl, CURLOPT_UNIX_SOCKET_PATH, StringValueCStr(val));
|
3302
3569
|
} break;
|
3303
3570
|
#endif
|
3571
|
+
#if HAVE_CURLOPT_MAX_SEND_SPEED_LARGE
|
3572
|
+
case CURLOPT_MAX_SEND_SPEED_LARGE: {
|
3573
|
+
curl_easy_setopt(rbce->curl, CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t) NUM2LL(val));
|
3574
|
+
} break;
|
3575
|
+
#endif
|
3576
|
+
#if HAVE_CURLOPT_MAX_RECV_SPEED_LARGE
|
3577
|
+
case CURLOPT_MAX_RECV_SPEED_LARGE: {
|
3578
|
+
curl_easy_setopt(rbce->curl, CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t) NUM2LL(val));
|
3579
|
+
} break;
|
3580
|
+
#endif
|
3581
|
+
#if HAVE_CURLOPT_MAXFILESIZE
|
3582
|
+
case CURLOPT_MAXFILESIZE:
|
3583
|
+
curl_easy_setopt(rbce->curl, CURLOPT_MAXFILESIZE, NUM2LONG(val));
|
3584
|
+
break;
|
3585
|
+
#endif
|
3586
|
+
#if HAVE_CURLOPT_TCP_KEEPALIVE
|
3587
|
+
case CURLOPT_TCP_KEEPALIVE:
|
3588
|
+
curl_easy_setopt(rbce->curl, CURLOPT_TCP_KEEPALIVE, NUM2LONG(val));
|
3589
|
+
break;
|
3590
|
+
case CURLOPT_TCP_KEEPIDLE:
|
3591
|
+
curl_easy_setopt(rbce->curl, CURLOPT_TCP_KEEPIDLE, NUM2LONG(val));
|
3592
|
+
break;
|
3593
|
+
case CURLOPT_TCP_KEEPINTVL:
|
3594
|
+
curl_easy_setopt(rbce->curl, CURLOPT_TCP_KEEPINTVL, NUM2LONG(val));
|
3595
|
+
break;
|
3596
|
+
#endif
|
3597
|
+
#if HAVE_CURLOPT_HAPROXYPROTOCOL
|
3598
|
+
case CURLOPT_HAPROXYPROTOCOL:
|
3599
|
+
curl_easy_setopt(rbce->curl, HAVE_CURLOPT_HAPROXYPROTOCOL, NUM2LONG(val));
|
3600
|
+
break;
|
3601
|
+
#endif
|
3602
|
+
case CURLOPT_STDERR:
|
3603
|
+
// libcurl requires raw FILE pointer and this should be IO object in Ruby.
|
3604
|
+
// Tempfile or StringIO won't work.
|
3605
|
+
Check_Type(val, T_FILE);
|
3606
|
+
GetOpenFile(val, open_f_ptr);
|
3607
|
+
curl_easy_setopt(rbce->curl, CURLOPT_STDERR, rb_io_stdio_file(open_f_ptr));
|
3608
|
+
break;
|
3304
3609
|
default:
|
3305
3610
|
rb_raise(rb_eTypeError, "Curb unsupported option");
|
3306
3611
|
}
|
@@ -3427,12 +3732,19 @@ void init_curb_easy() {
|
|
3427
3732
|
cCurlEasy = rb_define_class_under(mCurl, "Easy", rb_cObject);
|
3428
3733
|
|
3429
3734
|
/* Class methods */
|
3430
|
-
|
3735
|
+
rb_define_alloc_func(cCurlEasy, ruby_curl_easy_allocate);
|
3431
3736
|
rb_define_singleton_method(cCurlEasy, "error", ruby_curl_easy_error_message, 1);
|
3432
3737
|
|
3738
|
+
/* Initialize method */
|
3739
|
+
rb_define_method(cCurlEasy, "initialize", ruby_curl_easy_initialize, -1);
|
3740
|
+
|
3433
3741
|
/* Attributes for config next perform */
|
3434
3742
|
rb_define_method(cCurlEasy, "url", ruby_curl_easy_url_get, 0);
|
3435
3743
|
rb_define_method(cCurlEasy, "proxy_url", ruby_curl_easy_proxy_url_get, 0);
|
3744
|
+
|
3745
|
+
rb_define_method(cCurlEasy, "proxy_headers=", ruby_curl_easy_proxy_headers_set, 1);
|
3746
|
+
rb_define_method(cCurlEasy, "proxy_headers", ruby_curl_easy_proxy_headers_get, 0);
|
3747
|
+
|
3436
3748
|
rb_define_method(cCurlEasy, "headers=", ruby_curl_easy_headers_set, 1);
|
3437
3749
|
rb_define_method(cCurlEasy, "headers", ruby_curl_easy_headers_get, 0);
|
3438
3750
|
rb_define_method(cCurlEasy, "interface", ruby_curl_easy_interface_get, 0);
|
@@ -3459,6 +3771,8 @@ void init_curb_easy() {
|
|
3459
3771
|
rb_define_method(cCurlEasy, "put_data=", ruby_curl_easy_put_data_set, 1);
|
3460
3772
|
rb_define_method(cCurlEasy, "ftp_commands=", ruby_curl_easy_ftp_commands_set, 1);
|
3461
3773
|
rb_define_method(cCurlEasy, "ftp_commands", ruby_curl_easy_ftp_commands_get, 0);
|
3774
|
+
rb_define_method(cCurlEasy, "resolve=", ruby_curl_easy_resolve_set, 1);
|
3775
|
+
rb_define_method(cCurlEasy, "resolve", ruby_curl_easy_resolve_get, 0);
|
3462
3776
|
|
3463
3777
|
rb_define_method(cCurlEasy, "local_port=", ruby_curl_easy_local_port_set, 1);
|
3464
3778
|
rb_define_method(cCurlEasy, "local_port", ruby_curl_easy_local_port_get, 0);
|
@@ -3490,6 +3804,10 @@ void init_curb_easy() {
|
|
3490
3804
|
rb_define_method(cCurlEasy, "low_speed_limit", ruby_curl_easy_low_speed_limit_get, 0);
|
3491
3805
|
rb_define_method(cCurlEasy, "low_speed_time=", ruby_curl_easy_low_speed_time_set, 1);
|
3492
3806
|
rb_define_method(cCurlEasy, "low_speed_time", ruby_curl_easy_low_speed_time_get, 0);
|
3807
|
+
rb_define_method(cCurlEasy, "max_send_speed_large=", ruby_curl_easy_max_send_speed_large_set, 1);
|
3808
|
+
rb_define_method(cCurlEasy, "max_send_speed_large", ruby_curl_easy_max_send_speed_large_get, 0);
|
3809
|
+
rb_define_method(cCurlEasy, "max_recv_speed_large=", ruby_curl_easy_max_recv_speed_large_set, 1);
|
3810
|
+
rb_define_method(cCurlEasy, "max_recv_speed_large", ruby_curl_easy_max_recv_speed_large_get, 0);
|
3493
3811
|
rb_define_method(cCurlEasy, "ssl_version=", ruby_curl_easy_ssl_version_set, 1);
|
3494
3812
|
rb_define_method(cCurlEasy, "ssl_version", ruby_curl_easy_ssl_version_get, 0);
|
3495
3813
|
rb_define_method(cCurlEasy, "use_ssl=", ruby_curl_easy_use_ssl_set, 1);
|