curb 0.9.4 → 0.9.10
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 +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);
|