summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes5
-rw-r--r--Curl.xs8
-rw-r--r--MANIFEST1
-rw-r--r--META.yml2
-rw-r--r--Makefile.PL86
-rw-r--r--SIGNATURE35
-rw-r--r--lib/WWW/Curl.pm9
-rw-r--r--lib/WWW/Curl/Easy.pm2
-rw-r--r--lib/WWW/Curl/Form.pm2
-rw-r--r--lib/WWW/Curl/Share.pm4
-rw-r--r--t/00constants.t59
-rw-r--r--t/01basic.t2
-rw-r--r--t/19multi.t14
-rw-r--r--t/symbols-in-versions657
-rw-r--r--template/Easy.pm.tmpl2
-rw-r--r--template/Share.pm.tmpl4
16 files changed, 823 insertions, 69 deletions
diff --git a/Changes b/Changes
index 7e5fb56..badedd8 100644
--- a/Changes
+++ b/Changes
@@ -1,4 +1,9 @@
Revision history for the Perl binding of libcurl, WWW::Curl.
+4.15 Sun Nov 28 2010: - Balint Szilakszi <szbalint at cpan.org>
+
+ - Refactored constant handling and added thorough testing for it.
+ - Fixed CURLOPT_PRIVATE, it is now a string and can be set/get accordingly.
+
4.14 Sun Oct 24 2010: - Balint Szilakszi <szbalint at cpan.org>
- Scalar references can now be used to receive body/header data [gfx].
diff --git a/Curl.xs b/Curl.xs
index 03071a0..0201e2e 100644
--- a/Curl.xs
+++ b/Curl.xs
@@ -814,10 +814,6 @@ curl_easy_setopt(self, option, value, push=0)
croak("value is not of type WWW::Curl::Share");
break;
#endif
- case CURLOPT_PRIVATE:
- RETVAL = curl_easy_setopt(self->curl, option, (long)SvIV(value));
- break;
-
/* default cases */
default:
if (option < CURLOPTTYPE_OBJECTPOINT) { /* A long (integer) value */
@@ -1078,7 +1074,7 @@ curl_multi_info_read(self)
PREINIT:
CURL *easy = NULL;
CURLcode res;
- long stashid;
+ char *stashid;
int queue;
CURLMsg *msg;
PPCODE:
@@ -1093,7 +1089,7 @@ curl_multi_info_read(self)
curl_easy_getinfo(easy, CURLINFO_PRIVATE, &stashid);
curl_easy_setopt(easy, CURLINFO_PRIVATE, NULL);
curl_multi_remove_handle(self->curlm, easy);
- XPUSHs(sv_2mortal(newSViv(stashid)));
+ XPUSHs(sv_2mortal(newSVpv(stashid,0)));
XPUSHs(sv_2mortal(newSViv(res)));
} else {
XSRETURN_EMPTY;
diff --git a/MANIFEST b/MANIFEST
index 2b391d9..75fdc43 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -53,6 +53,7 @@ t/new/10multi-callback.t
t/new/README
t/pod-coverage.t
t/pod.t
+t/symbols-in-versions
template/Easy.pm.tmpl
template/Share.pm.tmpl
typemap
diff --git a/META.yml b/META.yml
index 7a7e6fb..253ea7f 100644
--- a/META.yml
+++ b/META.yml
@@ -24,4 +24,4 @@ requires:
perl: 5.6.1
resources:
repository: http://github.com/szbalint/WWW--Curl
-version: 4.14
+version: 4.15
diff --git a/Makefile.PL b/Makefile.PL
index 9bb5182..dea727b 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -41,9 +41,6 @@ print "The version is $version\n";
my @includes = qw();
my ($cflags,$lflags, $ldflags) = ('','','');
-# This utility helper generates the constants function from curl.h
-# It is normally only used by the maintainer, but if you're curl is older
-# or missing some constants, you can delete curlopt-constants.c and re-run 'perl Makefile.PL'
# You may need to specify where to find curl.h on your platform
# These are guesses only, in case curl-config is not telling us.
@@ -96,37 +93,65 @@ foreach my $try (@includes) {
}
if (!defined($curl_h)) {
- die "Cannot find curl.h - cannot build constants files - see Makefile.PL";
+ die "Cannot find curl.h - cannot build constants files - see Makefile.PL";
} else {
- $curl_d = "-I" . $curl_d;
- print "Found curl.h in $curl_h\n";
+ my %constants;
+ $curl_d = "-I" . $curl_d;
+ print "Found curl.h in $curl_h\n";
+ my @syms;
+ my $has_cpp = 0;
+ open(H_IN, "-|", "cpp", $curl_h) and $has_cpp++;
+ unless ($has_cpp) { open(H_IN, "<", $curl_h) or die("Can't open curl.h at path $curl_h, because: ".$!); }
+ while ( <H_IN> ) {
+ if ( /enum\s+(\S+\s+)?{/ .. /}/ ) {
+ s/^\s+//;
+ next unless /^CURL/;
+ chomp;
+ s/[,\s].*//;
+ s/=.*$//;
+ next unless /^\w+$/;
+ push @syms, $_;
+ }
+ }
+ close H_IN;
+ open (H, "<", $curl_h) or die ("Cannot open $curl_h: ".$!);
+ while(<H>) {
+ if (/^#define (CURL[A-Za-z0-9_]*)/) {
+ push @syms, $1;
+ }
+ }
+ close H;
+
+ for my $e (sort @syms) {
+ if($e =~ /(OBSOLETE|^CURL_EXTERN|_LAST\z|_LASTENTRY\z)/) {
+ next;
+ }
+ my ($group) = $e =~ m/^([^_]+_)/;
+ $constants{$group}->{$e} = $e;
+ }
+ unless ($has_cpp) {
open(CURL_H, "<" . $curl_h) or die "Can't open curl.h\n";
- my %constants;
while (<CURL_H>) {
if ($_ =~ m/CINIT\(/ and $_ !~ m/#/) {
- my ($option, $type, $code) =
- m/.*CINIT\((\w*)\s*,\s*(\w+)\s*,\s*(\d+).*/;
- $constants{CURLOPT_}->{$option} = $option;
+ my ($option, $type, $code) = m/.*CINIT\((\w*)\s*,\s*(\w+)\s*,\s*(\d+).*/;
+ $constants{"CURLOPT_"}->{"CURLOPT_".$option} = "CURLOPT_".$option;
} elsif ($_ =~ m/^#define CURLOPT_\w+\s+CURLOPT_\w+/) {
my ($option, $value) =
m/^#define CURLOPT_(\w+)\s+CURLOPT_(\w+)/;
- $constants{CURLOPT_}->{$option} = $value;
- } elsif ($_ =~ m/^\s*(CURLINFO_|CURLSHOPT_|CURLE_|CURL_LOCK_)(\w+)/) {
- $constants{$1}->{$2} = $2;
- } elsif ($_ =~ m/^\s*(CURL_)(\w+)(?:[,\s]*)(?:\/\*.*)?$/) {
- $constants{$1}->{$2} = $2;
- } elsif ($_ =~ m/^\s*CURLPROXY_(\w+)\s*=\s*\d+/) {
- $constants{CURLPROXY_}->{$1} = $1;
+ $constants{"CURLOPT_"}->{"CURLOPT_".$option} = "CURLOPT_".$value;
+ } elsif ($_ =~ m/^\s*((CURLINFO_|CURLSHOPT_|CURLE_)\w+)/) {
+ $constants{$2}->{$1}= $1;
+ } elsif ($_ =~ m/^\s*((CURL_)(?:\w+))(?:[,\s]*)(?:\/\*.*)?$/) {
+ $constants{$2}->{$1} = $1;
+ } elsif ($_ =~ m/^\s*((CURLPROXY_)(?:\w+))\s*=\s*\d+/) {
+ $constants{$2}->{$1} = $1;
+ } elsif ($_ =~ m/CFINIT\(/ and $_ !~ m/#/) {
+ my ($option) = m/.*CFINIT\((\w*)\s*.*/;
+ $constants{"CURLFORM_"}->{"CURLFORM_".$option} = "CURLFORM_".$option;
}
-
}
close(CURL_H);
-
- # some things are ifdefed out...
- foreach my $ifdef0 (qw(FLAGS PROGRESSMODE MOREDOCS)) {
- delete $constants{CURLOPT_}->{$ifdef0};
}
-
print "Building curlopt-constants.c for your libcurl version\n";
open(CURL_XS, ">curlopt-constants.c")
@@ -140,7 +165,7 @@ constant(const char *name)
errno = 0;
HERE
;
-for my $group (sort keys %constants) {
+for my $group (reverse sort keys %constants) {
my $grouplength = length($group);
my $groupref = $constants{$group};
my @constants = keys %{$constants{$group}};
@@ -156,11 +181,12 @@ HERE2
print CURL_XS " case '$next_initial':\n";
my $count = 0;
foreach my $option (sort @constants) {
- my $initial = substr($option, 0, 1);
+ my $remainder = substr($option, length($group), length($option));
+ my $initial = substr($remainder, 0, 1);
if ($next_initial eq $initial) {
print CURL_XS
-" if (strEQ(name, \"$option\")) return $group"."$groupref->{$option};\n";
+" if (strEQ(name, \"$remainder\")) return "."$groupref->{$option};\n";
$count++;
}
@@ -192,10 +218,10 @@ HERE
if ($line !~ m/^\@CURLOPT_INCLUDE\@/) {
print EASY_PM $line;
} else {
- for my $group (qw/CURLOPT_ CURLINFO_ CURLE_ CURL_ CURLPROXY_/) {
+ for my $group (reverse sort keys %constants) {
for my $option (sort keys %{$constants{$group}}) {
next unless $option;
- print EASY_PM $group.$option."\n";
+ print EASY_PM $option."\n";
}
}
}
@@ -212,10 +238,10 @@ HERE
print SHARE_PM $line;
} else {
foreach my $option (sort keys %{$constants{CURLSHOPT_}}) {
- print SHARE_PM $1 . "CURLSHOPT_".$option . "\n";
+ print SHARE_PM $1 . $option . "\n";
}
foreach my $option (sort keys %{$constants{CURL_LOCK_}}) {
- print SHARE_PM $1 . "CURL_LOCK_".$option . "\n";
+ print SHARE_PM $1 . $option . "\n";
}
}
}
diff --git a/SIGNATURE b/SIGNATURE
index 58d67ea..e41e457 100644
--- a/SIGNATURE
+++ b/SIGNATURE
@@ -14,12 +14,12 @@ not run its Makefile.PL or Build.PL.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256
-SHA1 fcabd943225c88f9aa1039761a0e43f8ef01b40a Changes
-SHA1 478b1942dc6fe9dcbc10c3f1849dfa46446370de Curl.xs
+SHA1 c23d2d3256e487cfeb2fba5d11861e6ef1f9c6dd Changes
+SHA1 65a31f18075b247c6d4bc38ba5fe408f3bd9b2c5 Curl.xs
SHA1 94cbea5b3fb940e25cd4535d1c81bfd7d51dac3c LICENSE
-SHA1 9dc4200fb6a801473e78843217a2835ee7c390a4 MANIFEST
-SHA1 5c2c13c7cc93ee8e882221d2d40e9f5aee954abd META.yml
-SHA1 b6eaa6b551f80e0b2520a654e7a3ea897603e6d4 Makefile.PL
+SHA1 7cae1c2346a6ce99ac5325cabb51b7ce4ebad209 MANIFEST
+SHA1 3c88c4db0ddf4624cc22454d5e1f996ef2b0988a META.yml
+SHA1 03e0e48557e565a4663c30bfe8f75660c1336e0f Makefile.PL
SHA1 3e8bbd9aa6cd273aef05f78cfef0116a0e3d59b0 README
SHA1 ed6f9f399075307a33bd02902ebbadbbbfbd8bab README.Win32
SHA1 fd5f3c4f0418efee3b9b16cf8c3902e8374909df inc/Module/Install.pm
@@ -29,13 +29,13 @@ SHA1 a9d6306080cee9c32b18f6cbd3c7636ece67e81a inc/Module/Install/External.pm
SHA1 dbec1085a29a855202ee797a5bac319cf426827f inc/Module/Install/MakeMaker.pm
SHA1 3e83972921d54198d1246f7278f08664006cd65d inc/Module/Install/Makefile.pm
SHA1 12bf1867955480d47d5171a9e9c6a96fabe0b58f inc/Module/Install/Metadata.pm
-SHA1 dbda7543f5ce9a1a6c900e00a87916932fe639d0 lib/WWW/Curl.pm
-SHA1 1c83271333d4d6f9766352b09a73b45e79bf5ec1 lib/WWW/Curl/Easy.pm
-SHA1 84564a68236d7458d8cf82319efadc02621c51d8 lib/WWW/Curl/Form.pm
+SHA1 2d3ace586b9c815af387d69d5c6645e139777775 lib/WWW/Curl.pm
+SHA1 7909ec25b1dfe3499fd9fab597ed958dbe1169e1 lib/WWW/Curl/Easy.pm
+SHA1 0f4db7cb0e4ba57e0c7869f6932322911b55d4cd lib/WWW/Curl/Form.pm
SHA1 0bddc700447a50dd26d13119ee60349556ce1811 lib/WWW/Curl/Multi.pm
-SHA1 08df49894fc724e358676a80ca7cd3895bc30b9a lib/WWW/Curl/Share.pm
-SHA1 802cb1fcd35fe78e4cdb10164a05e54ce1427543 t/00constants.t
-SHA1 a6bd16e0cd3ad3923e71955b98eb08ddcde07bd5 t/01basic.t
+SHA1 7dbc5c2e1144c4e4ae75d6259bc16d713913f6f5 lib/WWW/Curl/Share.pm
+SHA1 3874fe0b4d751149e6ede0967ccec514f3b90756 t/00constants.t
+SHA1 83dbfe8cf1c1c567436daa3cc2a7f92e40285139 t/01basic.t
SHA1 07b63b1baca142a0e34e79633d0eb57684524bed t/02callbacks.t
SHA1 905c848deb6492d539c5bdf89c49632a412af15a t/04abort-test.t
SHA1 f9c842503835908a0687ab41655042a16b8b5112 t/05progress.t
@@ -50,7 +50,7 @@ SHA1 62551de2e5da5df233b296b716093cea8d791d70 t/15duphandle-callback.t
SHA1 785507b3fa6f414298cdcf7ceaba1f9274aa07d2 t/16formpost.t
SHA1 e784a874eb36fd5b16a12fc58365cce697ecbbab t/17slist.t
SHA1 9b80d6de1675261d43abea2f76cfd610f42a4494 t/18twinhandles.t
-SHA1 7daab9e7051396cef5f2a37b52cc6ee1c99be98e t/19multi.t
+SHA1 2591e39d5346fb4effca23d3ccef224322d843d7 t/19multi.t
SHA1 42f7f35d7ac8b38838cc71fdc7a89402b63e01b7 t/20undefined_subs.t
SHA1 c0daf235a136f623fc29ae5c2c2ce6cfc68a9b5f t/21write-to-scalar.t
SHA1 2924361d0713031b92c6b888f11e860d357837f7 t/meta.t
@@ -68,13 +68,14 @@ SHA1 eee30cfb57132e7c8bdd4a5dd2f32273ab222115 t/new/10multi-callback.t
SHA1 20ec0bd03ff2600505d38623153a6eb3087b5814 t/new/README
SHA1 ac25bfa56d36f19cbee72a968b06372e88602a61 t/pod-coverage.t
SHA1 0190346d7072d458c8a10a45c19f86db641dcc48 t/pod.t
-SHA1 a04ab9054821da678e0f43da2c4f6da7177adc53 template/Easy.pm.tmpl
-SHA1 f690cca3adf6c17840985fe40c22ee56fdfb999f template/Share.pm.tmpl
+SHA1 1811cc3766dbb601d0ae0aea284b6e0a642a483a t/symbols-in-versions
+SHA1 dc1cf787a6dec7d4e263f95a1566369f51b94746 template/Easy.pm.tmpl
+SHA1 f6f5d52b1d34bff9d085ac40bbc6f8b2a6269c58 template/Share.pm.tmpl
SHA1 468b011caaf4d54609b421027d7c6262a9260e89 typemap
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.10 (GNU/Linux)
-iF4EAREIAAYFAkzEhrYACgkQ9vEeIen/Zj4XIwD/cdSn+iaFq7Y62i8WGCfGDQjT
-3g3L10PbxmuoMT1bRcUA/0a+JO8OxUrQNOXmOe4zzEVYjdSc8Aq9ypVwdwuVESkV
-=iums
+iF4EAREIAAYFAkzyt84ACgkQ9vEeIen/Zj4wSAD/Z0JHQVK5ie0xOBkD+4A1vAWb
+A0JWUq6/8e9GNyVtjJoA/20hxeygZr4zddpfZ4AakE6f9m3+g3KEKo73+26HgZYq
+=YZHu
-----END PGP SIGNATURE-----
diff --git a/lib/WWW/Curl.pm b/lib/WWW/Curl.pm
index 4a24349..4d87f9a 100644
--- a/lib/WWW/Curl.pm
+++ b/lib/WWW/Curl.pm
@@ -4,7 +4,7 @@ use strict;
use warnings;
use XSLoader;
-our $VERSION = '4.14';
+our $VERSION = '4.15';
XSLoader::load(__PACKAGE__, $VERSION);
END {
@@ -70,6 +70,7 @@ Here is a small snippet of making a request with WWW::Curl::Easy.
print("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n");
}
+See L<curl_easy_setopt(3)> for details of C<setopt()>.
=head1 WWW::Curl::Multi
@@ -308,6 +309,10 @@ In the case of no file descriptors in the given set, an empty array is returned.
It might be surprising that if C<CURLOPT_FOLLOWLOCATION> is set and header output was enabled, headers show up for all http responses.
The reasoning behind that and possible code adjustments are outlined here: L<https://rt.cpan.org/Ticket/Display.html?id=61569>.
+=head2 CURLOPT_PRIVATE
+
+Despite what the libcurl manual says, in Perl land, only string values are suitable for this option.
+
=head1 ADDITIONAL METHODS
=head2 On WWW::Curl::Easy objects
@@ -399,4 +404,6 @@ L<http://curl.haxx.se>
L<http://search.cpan.org/perldoc?WWW::Curl::Simple>
+L<libcurl(3)>
+
The development source code is also available: L<http://github.com/szbalint/WWW--Curl/tree/master>
diff --git a/lib/WWW/Curl/Easy.pm b/lib/WWW/Curl/Easy.pm
index cbb3281..f0e8454 100644
--- a/lib/WWW/Curl/Easy.pm
+++ b/lib/WWW/Curl/Easy.pm
@@ -4,7 +4,7 @@ use strict;
use warnings;
use Carp;
-our $VERSION = '4.14';
+our $VERSION = '4.15';
use WWW::Curl ();
use Exporter ();
diff --git a/lib/WWW/Curl/Form.pm b/lib/WWW/Curl/Form.pm
index 3a149f6..76e536e 100644
--- a/lib/WWW/Curl/Form.pm
+++ b/lib/WWW/Curl/Form.pm
@@ -3,7 +3,7 @@ use strict;
use warnings;
use Carp;
-our $VERSION = '4.14';
+our $VERSION = '4.15';
use WWW::Curl ();
use Exporter ();
diff --git a/lib/WWW/Curl/Share.pm b/lib/WWW/Curl/Share.pm
index c4ffad6..2bd9aff 100644
--- a/lib/WWW/Curl/Share.pm
+++ b/lib/WWW/Curl/Share.pm
@@ -19,8 +19,8 @@ sub AUTOLOAD {
( my $constname = $AUTOLOAD ) =~ s/.*:://;
my $value = constant( $constname );
- if($!) {
- croak("Undefined subroutine &$AUTOLOAD failed");
+ if ($!) {
+ croak("Undefined subroutine &$AUTOLOAD failed for reasons of $!, constname was $constname, value was: $value");
}
{
diff --git a/t/00constants.t b/t/00constants.t
index fa30132..bd411f7 100644
--- a/t/00constants.t
+++ b/t/00constants.t
@@ -1,9 +1,60 @@
#!perl
use strict;
use warnings;
-use Test::More tests => 3;
+use Test::More;
+use WWW::Curl::Easy;
-BEGIN { use_ok( 'WWW::Curl::Easy' ); }
+my $ver_num_raw = WWW::Curl::Easy::version();
+my ($ver_num) = $ver_num_raw =~ m!libcurl/(\d\.\d+\.\d+)!;
+my ($major, $minor, $bugfix) = split(/\./, $ver_num);
-ok (CURLOPT_URL == 10000+2, "Constant loaded ok");
-ok (CURLE_URL_MALFORMAT, "CURLE_ error constant can be used");
+open(my $fh, '<', 't/symbols-in-versions') or die($!);
+
+my @consts;
+for my $row (<$fh>) {
+ chomp($row);
+ next if ($row =~ m/^#/);
+ my ($name, $intro, $dep, $remov) = split(/\s+/, $row);
+ push @consts, [$name, $intro, $dep, $remov];
+}
+
+# In case we can't use cpp to extract symbols, skipping the multi constant tests for now.
+my $skip_multi;
+my $value = WWW::Curl::Easy::constant('CURL_LAST');
+$skip_multi++ if (! $!);
+
+my @checklist;
+for my $row (@consts) {
+ my ($name, $intro, $depr, $outro) = @{$row};
+ my $check = 0;
+ if (!$outro && $intro) {
+ my ($maj_in, $min_in, $bf_in) = split(/\./, $intro);
+ if ($maj_in eq '-' || $major > $maj_in) {
+ $check = 1;
+ } elsif ($major == $maj_in) {
+ if ($minor > $min_in) { $check = 1
+ } elsif ($minor == $min_in ) {
+ if ($bugfix > $bf_in) {
+ $check = 1;
+ } elsif ($bugfix == $bf_in) {
+ $check = 1;
+ } else {
+ next
+ }
+ } else {
+ next;
+ }
+ } else {
+ next;
+ }
+ }
+ if ($check) {
+ next if ($skip_multi && $name =~ m/^CURLM/);
+ push @checklist, [$name, $depr];
+ }
+}
+plan tests => scalar(@checklist);
+for my $row (@checklist) {
+ my $value = WWW::Curl::Easy::constant($row->[0]);
+ ok(!$! && (defined($value) || $row->[1]), "$row->[0] is defined alright - $!");
+}
diff --git a/t/01basic.t b/t/01basic.t
index 744be05..93e12b1 100644
--- a/t/01basic.t
+++ b/t/01basic.t
@@ -40,7 +40,7 @@ $curl->setopt(CURLOPT_COOKIEFILE, "");
my $retcode = $curl->perform();
ok(! $retcode, "Curl return code ok");
-
+diag("An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n") if ($retcode);
my $bytes = $curl->getinfo(CURLINFO_SIZE_DOWNLOAD);
ok( $bytes, "getinfo returns non-zero number of bytes");
my $realurl = $curl->getinfo(CURLINFO_EFFECTIVE_URL);
diff --git a/t/19multi.t b/t/19multi.t
index cfcf489..6f4c1cc 100644
--- a/t/19multi.t
+++ b/t/19multi.t
@@ -2,7 +2,7 @@
use strict;
use warnings;
-use Test::More tests => 16;
+use Test::More tests => 20;
use WWW::Curl::Easy;
use WWW::Curl::Multi;
use File::Temp qw/tempfile/;
@@ -38,11 +38,13 @@ sub action_wait {
$curl->setopt( CURLOPT_URL, $url);
ok(! $curl->setopt(CURLOPT_WRITEHEADER, $header), "Setting CURLOPT_WRITEHEADER");
ok(! $curl->setopt(CURLOPT_WRITEDATA,$body), "Setting CURLOPT_WRITEDATA");
+ ok(! $curl->setopt(CURLOPT_PRIVATE,"foo"), "Setting CURLOPT_PRIVATE");
my $curl2 = new WWW::Curl::Easy;
$curl2->setopt( CURLOPT_URL, $url);
ok(! $curl2->setopt(CURLOPT_WRITEHEADER, $header2), "Setting CURLOPT_WRITEHEADER");
ok(! $curl2->setopt(CURLOPT_WRITEDATA,$body2), "Setting CURLOPT_WRITEDATA");
+ ok(! $curl2->setopt(CURLOPT_PRIVATE,42), "Setting CURLOPT_PRIVATE");
my $curlm = new WWW::Curl::Multi;
my @fds = $curlm->fdset;
@@ -63,7 +65,15 @@ sub action_wait {
$curlm->perform;
@fds = $curlm->fdset;
ok( @{$fds[0]} + @{$fds[1]} == 2, "The read or write fdset contains two fds");
- while ($curlm->perform) {
+ my $active = 2;
+ while ($active != 0) {
+ my $ret = $curlm->perform;
+ if ($ret != $active) {
+ while (my ($id,$value) = $curlm->info_read) {
+ ok($id eq "foo" || $id == 42, "The stored private value matches what we set");
+ }
+ $active = $ret;
+ }
action_wait($curlm);
}
@fds = $curlm->fdset;
diff --git a/t/symbols-in-versions b/t/symbols-in-versions
new file mode 100644
index 0000000..8d404b2
--- /dev/null
+++ b/t/symbols-in-versions
@@ -0,0 +1,657 @@
+# _ _ ____ _
+# ___| | | | _ \| |
+# / __| | | | |_) | |
+# | (__| |_| | _ <| |___
+# \___|\___/|_| \_\_____|
+#
+# This document lists defines and other symbols present in libcurl, together
+# with exact information about the first libcurl version that provides the
+# symbol, the first version in which the symbol was marked as deprecated and
+# for a few symbols the last version that featured it. The names appear in
+# alphabetical order.
+#
+# Name Introduced Deprecated Removed
+#
+CURLAUTH_ANY 7.10.6
+CURLAUTH_ANYSAFE 7.10.6
+CURLAUTH_BASIC 7.10.6
+CURLAUTH_DIGEST 7.10.6
+CURLAUTH_DIGEST_IE 7.19.3
+CURLAUTH_GSSNEGOTIATE 7.10.6
+CURLAUTH_NONE 7.10.6
+CURLAUTH_NTLM 7.10.6
+CURLAUTH_ONLY 7.21.3
+CURLCLOSEPOLICY_CALLBACK 7.7
+CURLCLOSEPOLICY_LEAST_RECENTLY_USED 7.7
+CURLCLOSEPOLICY_LEAST_TRAFFIC 7.7
+CURLCLOSEPOLICY_NONE 7.7
+CURLCLOSEPOLICY_OLDEST 7.7
+CURLCLOSEPOLICY_SLOWEST 7.7
+CURLE_ABORTED_BY_CALLBACK 7.1
+CURLE_AGAIN 7.18.2
+CURLE_ALREADY_COMPLETE 7.7.2
+CURLE_BAD_CALLING_ORDER 7.1 7.17.0
+CURLE_BAD_CONTENT_ENCODING 7.10
+CURLE_BAD_DOWNLOAD_RESUME 7.10
+CURLE_BAD_FUNCTION_ARGUMENT 7.1
+CURLE_BAD_PASSWORD_ENTERED - 7.17.0
+CURLE_CHUNK_FAILED 7.20.1
+CURLE_CONV_FAILED 7.15.4
+CURLE_CONV_REQD 7.15.4
+CURLE_COULDNT_CONNECT 7.1
+CURLE_COULDNT_RESOLVE_HOST 7.1
+CURLE_COULDNT_RESOLVE_PROXY 7.1
+CURLE_FAILED_INIT 7.1
+CURLE_FILESIZE_EXCEEDED 7.10.8
+CURLE_FILE_COULDNT_READ_FILE 7.1
+CURLE_FTP_ACCESS_DENIED 7.1
+CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1
+CURLE_FTP_BAD_DOWNLOAD_RESUME 7.1 7.1
+CURLE_FTP_BAD_FILE_LIST 7.20.1
+CURLE_FTP_CANT_GET_HOST 7.1
+CURLE_FTP_CANT_RECONNECT 7.1 7.17.0
+CURLE_FTP_COULDNT_GET_SIZE 7.1 7.17.0
+CURLE_FTP_COULDNT_RETR_FILE 7.1
+CURLE_FTP_COULDNT_SET_ASCII 7.1 7.17.0
+CURLE_FTP_COULDNT_SET_BINARY 7.1 7.17.0
+CURLE_FTP_COULDNT_SET_TYPE 7.17.0
+CURLE_FTP_COULDNT_STOR_FILE 7.1
+CURLE_FTP_COULDNT_USE_REST 7.1
+CURLE_FTP_PARTIAL_FILE 7.1 7.1
+CURLE_FTP_PORT_FAILED 7.1
+CURLE_FTP_PRET_FAILED 7.20.0
+CURLE_FTP_QUOTE_ERROR 7.1 7.17.0
+CURLE_FTP_SSL_FAILED - 7.17.0
+CURLE_FTP_USER_PASSWORD_INCORRECT 7.1 7.17.0
+CURLE_FTP_WEIRD_227_FORMAT 7.1
+CURLE_FTP_WEIRD_PASS_REPLY 7.1
+CURLE_FTP_WEIRD_PASV_REPLY 7.1
+CURLE_FTP_WEIRD_SERVER_REPLY 7.1
+CURLE_FTP_WEIRD_USER_REPLY 7.1 7.17.0
+CURLE_FTP_WRITE_ERROR 7.1 7.17.0
+CURLE_FUNCTION_NOT_FOUND 7.1
+CURLE_GOT_NOTHING 7.9.1
+CURLE_HTTP_NOT_FOUND 7.1
+CURLE_HTTP_PORT_FAILED - 7.12.0
+CURLE_HTTP_POST_ERROR 7.1
+CURLE_HTTP_RANGE_ERROR 7.1 7.17.0
+CURLE_HTTP_RETURNED_ERROR 7.10.3
+CURLE_INTERFACE_FAILED 7.12.0
+CURLE_LDAP_CANNOT_BIND 7.1
+CURLE_LDAP_INVALID_URL 7.10.8
+CURLE_LDAP_SEARCH_FAILED 7.1
+CURLE_LIBRARY_NOT_FOUND 7.1 7.17.0
+CURLE_LOGIN_DENIED 7.13.1
+CURLE_MALFORMAT_USER 7.1 7.17.0
+CURLE_OK 7.1
+CURLE_OPERATION_TIMEDOUT 7.17.0
+CURLE_OPERATION_TIMEOUTED 7.1 7.17.0
+CURLE_OUT_OF_MEMORY 7.1
+CURLE_PARTIAL_FILE 7.1
+CURLE_PEER_FAILED_VERIFICATION 7.17.1
+CURLE_QUOTE_ERROR 7.17.0
+CURLE_RANGE_ERROR 7.17.0
+CURLE_READ_ERROR 7.1
+CURLE_RECV_ERROR 7.13.0
+CURLE_REMOTE_ACCESS_DENIED 7.17.0
+CURLE_REMOTE_DISK_FULL 7.17.0
+CURLE_REMOTE_FILE_EXISTS 7.17.0
+CURLE_REMOTE_FILE_NOT_FOUND 7.16.1
+CURLE_RTSP_CSEQ_ERROR 7.20.0
+CURLE_RTSP_SESSION_ERROR 7.20.0
+CURLE_SEND_ERROR 7.13.0
+CURLE_SEND_FAIL_REWIND 7.12.3
+CURLE_SHARE_IN_USE - 7.17.0
+CURLE_SSH 7.16.1
+CURLE_SSL_CACERT 7.10
+CURLE_SSL_CACERT_BADFILE 7.16.0
+CURLE_SSL_CERTPROBLEM 7.10
+CURLE_SSL_CIPHER 7.10
+CURLE_SSL_CONNECT_ERROR 7.1
+CURLE_SSL_CRL_BADFILE 7.19.0
+CURLE_SSL_ENGINE_INITFAILED 7.13.0
+CURLE_SSL_ENGINE_NOTFOUND 7.9.3
+CURLE_SSL_ENGINE_SETFAILED 7.9.3
+CURLE_SSL_ISSUER_ERROR 7.19.0
+CURLE_SSL_PEER_CERTIFICATE - 7.17.1
+CURLE_SSL_SHUTDOWN_FAILED 7.16.1
+CURLE_TELNET_OPTION_SYNTAX 7.7
+CURLE_TFTP_DISKFULL 7.15.0 7.17.0
+CURLE_TFTP_EXISTS 7.15.0 7.17.0
+CURLE_TFTP_ILLEGAL 7.15.0
+CURLE_TFTP_NOSUCHUSER 7.15.0
+CURLE_TFTP_NOTFOUND 7.15.0
+CURLE_TFTP_PERM 7.15.0
+CURLE_TFTP_UNKNOWNID 7.15.0
+CURLE_TOO_MANY_REDIRECTS 7.5
+CURLE_UNKNOWN_TELNET_OPTION 7.7
+CURLE_UNSUPPORTED_PROTOCOL 7.1
+CURLE_UPLOAD_FAILED 7.16.3
+CURLE_URL_MALFORMAT 7.1
+CURLE_URL_MALFORMAT_USER 7.1 7.17.0
+CURLE_USE_SSL_FAILED 7.17.0
+CURLE_WRITE_ERROR 7.1
+CURLFILETYPE_DEVICE_BLOCK 7.21.0
+CURLFILETYPE_DEVICE_CHAR 7.21.0
+CURLFILETYPE_DIRECTORY 7.21.0
+CURLFILETYPE_DOOR 7.21.0
+CURLFILETYPE_FILE 7.21.0
+CURLFILETYPE_NAMEDPIPE 7.21.0
+CURLFILETYPE_SOCKET 7.21.0
+CURLFILETYPE_SYMLINK 7.21.0
+CURLFILETYPE_UNKNOWN 7.21.0
+CURLFINFOFLAG_KNOWN_FILENAME 7.21.0
+CURLFINFOFLAG_KNOWN_FILETYPE 7.21.0
+CURLFINFOFLAG_KNOWN_GID 7.21.0
+CURLFINFOFLAG_KNOWN_HLINKCOUNT 7.21.0
+CURLFINFOFLAG_KNOWN_PERM 7.21.0
+CURLFINFOFLAG_KNOWN_SIZE 7.21.0
+CURLFINFOFLAG_KNOWN_TIME 7.21.0
+CURLFINFOFLAG_KNOWN_UID 7.21.0
+CURLFORM_ARRAY 7.9.1
+CURLFORM_BUFFER 7.9.8
+CURLFORM_BUFFERLENGTH 7.9.8
+CURLFORM_BUFFERPTR 7.9.8
+CURLFORM_CONTENTHEADER 7.9.3
+CURLFORM_CONTENTSLENGTH 7.9.1
+CURLFORM_CONTENTTYPE 7.9.1
+CURLFORM_COPYCONTENTS 7.9.1
+CURLFORM_COPYNAME 7.9.1
+CURLFORM_END 7.9.1
+CURLFORM_FILE 7.9.1
+CURLFORM_FILECONTENT 7.9.1
+CURLFORM_FILENAME 7.9.6
+CURLFORM_NAMELENGTH 7.9.1
+CURLFORM_NOTHING 7.9.1
+CURLFORM_PTRCONTENTS 7.9.1
+CURLFORM_PTRNAME 7.9.1
+CURLFORM_STREAM 7.18.2
+CURLFTPAUTH_DEFAULT 7.12.2
+CURLFTPAUTH_DEFAULT 7.12.2
+CURLFTPAUTH_SSL 7.12.2
+CURLFTPAUTH_SSL 7.12.2
+CURLFTPAUTH_TLS 7.12.2
+CURLFTPAUTH_TLS 7.12.2
+CURLFTPMETHOD_DEFAULT 7.15.1
+CURLFTPMETHOD_MULTICWD 7.15.1
+CURLFTPMETHOD_NOCWD 7.15.1
+CURLFTPMETHOD_SINGLECWD 7.15.1
+CURLFTPSSL_ALL - 7.17.0
+CURLFTPSSL_CCC_ACTIVE 7.16.1
+CURLFTPSSL_CCC_NONE 7.16.1
+CURLFTPSSL_CCC_PASSIVE 7.16.1
+CURLFTPSSL_CONTROL 7.11.0 7.17.0
+CURLFTPSSL_NONE 7.11.0 7.17.0
+CURLFTPSSL_TRY 7.11.0 7.17.0
+CURLFTP_CREATE_DIR 7.19.4
+CURLFTP_CREATE_DIR_NONE 7.19.4
+CURLFTP_CREATE_DIR_RETRY 7.19.4
+CURLINFO_APPCONNECT_TIME 7.19.0
+CURLINFO_CERTINFO 7.19.1
+CURLINFO_CONDITION_UNMET 7.19.4
+CURLINFO_CONNECT_TIME 7.4.1
+CURLINFO_CONTENT_LENGTH_DOWNLOAD 7.6.1
+CURLINFO_CONTENT_LENGTH_UPLOAD 7.6.1
+CURLINFO_CONTENT_TYPE 7.9.4
+CURLINFO_COOKIELIST 7.14.1
+CURLINFO_DATA_IN 7.9.6
+CURLINFO_DATA_OUT 7.9.6
+CURLINFO_DOUBLE 7.4.1
+CURLINFO_EFFECTIVE_URL 7.3
+CURLINFO_END 7.4.1
+CURLINFO_FILETIME 7.5
+CURLINFO_FTP_ENTRY_PATH 7.15.4
+CURLINFO_HEADER_IN 7.9.6
+CURLINFO_HEADER_OUT 7.9.6
+CURLINFO_HEADER_SIZE 7.4.1
+CURLINFO_HTTPAUTH_AVAIL 7.10.8
+CURLINFO_HTTP_CODE 7.4.1 7.10.8
+CURLINFO_HTTP_CONNECTCODE 7.10.7
+CURLINFO_LASTONE 7.4.1
+CURLINFO_LASTSOCKET 7.15.2
+CURLINFO_LOCAL_IP 7.21.0
+CURLINFO_LOCAL_PORT 7.21.0
+CURLINFO_LONG 7.4.1
+CURLINFO_MASK 7.4.1
+CURLINFO_NAMELOOKUP_TIME 7.4.1
+CURLINFO_NONE 7.4.1
+CURLINFO_NUM_CONNECTS 7.12.3
+CURLINFO_OS_ERRNO 7.12.2
+CURLINFO_PRETRANSFER_TIME 7.4.1
+CURLINFO_PRIMARY_IP 7.19.0
+CURLINFO_PRIMARY_PORT 7.21.0
+CURLINFO_PRIVATE 7.10.3
+CURLINFO_PRIVATE 7.10.3
+CURLINFO_PROXYAUTH_AVAIL 7.10.8
+CURLINFO_REDIRECT_COUNT 7.9.7
+CURLINFO_REDIRECT_TIME 7.9.7
+CURLINFO_REDIRECT_URL 7.18.2
+CURLINFO_REQUEST_SIZE 7.4.1
+CURLINFO_RESPONSE_CODE 7.10.8
+CURLINFO_RTSP_CLIENT_CSEQ 7.20.0
+CURLINFO_RTSP_CSEQ_RECV 7.20.0
+CURLINFO_RTSP_SERVER_CSEQ 7.20.0
+CURLINFO_RTSP_SESSION_ID 7.20.0
+CURLINFO_SIZE_DOWNLOAD 7.4.1
+CURLINFO_SIZE_UPLOAD 7.4.1
+CURLINFO_SLIST 7.12.3
+CURLINFO_SPEED_DOWNLOAD 7.4.1
+CURLINFO_SPEED_UPLOAD 7.4.1
+CURLINFO_SSL_DATA_IN 7.12.1
+CURLINFO_SSL_DATA_OUT 7.12.1
+CURLINFO_SSL_ENGINES 7.12.3
+CURLINFO_SSL_VERIFYRESULT 7.5
+CURLINFO_STARTTRANSFER_TIME 7.9.2
+CURLINFO_STRING 7.4.1
+CURLINFO_TEXT 7.9.6
+CURLINFO_TOTAL_TIME 7.4.1
+CURLINFO_TYPEMASK 7.4.1
+CURLIOCMD_NOP 7.12.3
+CURLIOCMD_RESTARTREAD 7.12.3
+CURLIOE_FAILRESTART 7.12.3
+CURLIOE_OK 7.12.3
+CURLIOE_UNKNOWNCMD 7.12.3
+CURLKHMATCH_MISMATCH 7.19.6
+CURLKHMATCH_MISSING 7.19.6
+CURLKHMATCH_OK 7.19.6
+CURLKHSTAT_DEFER 7.19.6
+CURLKHSTAT_FINE 7.19.6
+CURLKHSTAT_FINE_ADD_TO_FILE 7.19.6
+CURLKHSTAT_REJECT 7.19.6
+CURLKHTYPE_DSS 7.19.6
+CURLKHTYPE_RSA 7.19.6
+CURLKHTYPE_RSA1 7.19.6
+CURLKHTYPE_UNKNOWN 7.19.6
+CURLMOPT_MAXCONNECTS 7.16.3
+CURLMOPT_PIPELINING 7.16.0
+CURLMOPT_SOCKETDATA 7.15.4
+CURLMOPT_SOCKETFUNCTION 7.15.4
+CURLMOPT_TIMERDATA 7.16.0
+CURLMOPT_TIMERFUNCTION 7.16.0
+CURLMSG_DONE 7.9.6
+CURLMSG_NONE 7.9.6
+CURLM_BAD_EASY_HANDLE 7.9.6
+CURLM_BAD_HANDLE 7.9.6
+CURLM_BAD_SOCKET 7.15.4
+CURLM_CALL_MULTI_PERFORM 7.9.6
+CURLM_INTERNAL_ERROR 7.9.6
+CURLM_OK 7.9.6
+CURLM_OUT_OF_MEMORY 7.9.6
+CURLM_UNKNOWN_OPTION 7.15.4
+CURLOPTTYPE_FUNCTIONPOINT 7.1
+CURLOPTTYPE_LONG 7.1
+CURLOPTTYPE_OBJECTPOINT 7.1
+CURLOPTTYPE_OFF_T 7.11.0
+CURLOPT_ADDRESS_SCOPE 7.19.0
+CURLOPT_APPEND 7.16.4
+CURLOPT_AUTOREFERER 7.1
+CURLOPT_BUFFERSIZE 7.10
+CURLOPT_CAINFO 7.4.2
+CURLOPT_CAPATH 7.9.8
+CURLOPT_CERTINFO 7.19.1
+CURLOPT_CHUNK_BGN_FUNCTION 7.21.0
+CURLOPT_CHUNK_DATA 7.21.0
+CURLOPT_CHUNK_END_FUNCTION 7.21.0
+CURLOPT_CLOSEFUNCTION 7.7 7.11.1 7.15.4
+CURLOPT_CLOSEPOLICY 7.7 7.16.1
+CURLOPT_CONNECTTIMEOUT 7.7
+CURLOPT_CONNECTTIMEOUT_MS 7.16.2
+CURLOPT_CONNECT_ONLY 7.15.2
+CURLOPT_CONV_FROM_NETWORK_FUNCTION 7.15.4
+CURLOPT_CONV_FROM_UTF8_FUNCTION 7.15.4
+CURLOPT_CONV_TO_NETWORK_FUNCTION 7.15.4
+CURLOPT_COOKIE 7.1
+CURLOPT_COOKIEFILE 7.1
+CURLOPT_COOKIEJAR 7.9
+CURLOPT_COOKIELIST 7.17.1
+CURLOPT_COOKIESESSION 7.9.7
+CURLOPT_COPYPOSTFIELDS 7.17.1
+CURLOPT_CRLF 7.1
+CURLOPT_CRLFILE 7.19.0
+CURLOPT_CUSTOMREQUEST 7.1
+CURLOPT_DEBUGDATA 7.9.6
+CURLOPT_DEBUGFUNCTION 7.9.6
+CURLOPT_DIRLISTONLY 7.16.4
+CURLOPT_DNS_CACHE_TIMEOUT 7.9.3
+CURLOPT_DNS_USE_GLOBAL_CACHE 7.9.3 7.11.1
+CURLOPT_EGDSOCKET 7.7
+CURLOPT_ENCODING 7.12.2
+CURLOPT_ERRORBUFFER 7.1
+CURLOPT_FAILONERROR 7.1
+CURLOPT_FILE 7.1 7.9.7
+CURLOPT_FILETIME 7.5
+CURLOPT_FLAGS 7.1 - 7.9.2
+CURLOPT_FNMATCH_DATA 7.21.0
+CURLOPT_FNMATCH_FUNCTION 7.21.0
+CURLOPT_FOLLOWLOCATION 7.1
+CURLOPT_FORBID_REUSE 7.7
+CURLOPT_FRESH_CONNECT 7.7
+CURLOPT_FTPAPPEND 7.1 7.16.4
+CURLOPT_FTPASCII 7.1 7.11.1 7.15.4
+CURLOPT_FTPLISTONLY 7.1 7.16.4
+CURLOPT_FTPPORT 7.1
+CURLOPT_FTPSSLAUTH 7.12.2
+CURLOPT_FTP_ACCOUNT 7.13.1
+CURLOPT_FTP_ALTERNATIVE_TO_USER 7.15.5
+CURLOPT_FTP_CREATE_MISSING_DIRS 7.10.7
+CURLOPT_FTP_FILEMETHOD 7.15.1
+CURLOPT_FTP_RESPONSE_TIMEOUT 7.10.8
+CURLOPT_FTP_SKIP_PASV_IP 7.15.0
+CURLOPT_FTP_SSL 7.11.0 7.16.4
+CURLOPT_FTP_SSL_CCC 7.16.1
+CURLOPT_FTP_USE_EPRT 7.10.5
+CURLOPT_FTP_USE_EPSV 7.9.2
+CURLOPT_FTP_USE_PRET 7.20.0
+CURLOPT_HEADER 7.1
+CURLOPT_HEADERDATA 7.10
+CURLOPT_HEADERFUNCTION 7.7.2
+CURLOPT_HTTP200ALIASES 7.10.3
+CURLOPT_HTTPAUTH 7.10.6
+CURLOPT_HTTPGET 7.8.1
+CURLOPT_HTTPHEADER 7.1
+CURLOPT_HTTPPOST 7.1
+CURLOPT_HTTPPROXYTUNNEL 7.3
+CURLOPT_HTTPREQUEST 7.1 - 7.15.4
+CURLOPT_HTTP_CONTENT_DECODING 7.16.2
+CURLOPT_HTTP_TRANSFER_DECODING 7.16.2
+CURLOPT_HTTP_VERSION 7.9.1
+CURLOPT_IGNORE_CONTENT_LENGTH 7.14.1
+CURLOPT_INFILE 7.1 7.9.7
+CURLOPT_INFILESIZE 7.1
+CURLOPT_INFILESIZE_LARGE 7.11.0
+CURLOPT_INTERFACE 7.3
+CURLOPT_INTERLEAVEDATA 7.20.0
+CURLOPT_INTERLEAVEFUNCTION 7.20.0
+CURLOPT_IOCTLDATA 7.12.3
+CURLOPT_IOCTLFUNCTION 7.12.3
+CURLOPT_IPRESOLVE 7.10.8
+CURLOPT_ISSUERCERT 7.19.0
+CURLOPT_KEYPASSWD 7.17.0
+CURLOPT_KRB4LEVEL 7.3 7.17.0
+CURLOPT_KRBLEVEL 7.17.0
+CURLOPT_LOCALPORT 7.15.2
+CURLOPT_LOCALPORTRANGE 7.15.2
+CURLOPT_LOW_SPEED_LIMIT 7.1
+CURLOPT_LOW_SPEED_TIME 7.1
+CURLOPT_MAIL_FROM 7.20.0
+CURLOPT_MAIL_RCPT 7.20.0
+CURLOPT_MAXCONNECTS 7.7
+CURLOPT_MAXFILESIZE 7.10.8
+CURLOPT_MAXFILESIZE_LARGE 7.11.0
+CURLOPT_MAXREDIRS 7.5
+CURLOPT_MAX_RECV_SPEED_LARGE 7.15.5
+CURLOPT_MAX_SEND_SPEED_LARGE 7.15.5
+CURLOPT_MUTE 7.1 7.8 7.15.4
+CURLOPT_NETRC 7.1
+CURLOPT_NETRC_FILE 7.11.0
+CURLOPT_NEW_DIRECTORY_PERMS 7.16.4
+CURLOPT_NEW_FILE_PERMS 7.16.4
+CURLOPT_NOBODY 7.1
+CURLOPT_NOPROGRESS 7.1
+CURLOPT_NOPROXY 7.19.4
+CURLOPT_NOSIGNAL 7.10
+CURLOPT_OPENSOCKETDATA 7.17.1
+CURLOPT_OPENSOCKETFUNCTION 7.17.1
+CURLOPT_PASSWDDATA 7.1 7.11.1 7.15.4
+CURLOPT_PASSWDFUNCTION 7.1 7.11.1 7.15.4
+CURLOPT_PASSWORD 7.19.1
+CURLOPT_PASV_POST 7.12.1 - 7.13.0
+CURLOPT_PORT 7.1
+CURLOPT_POST 7.1
+CURLOPT_POST301 7.17.1 7.19.1
+CURLOPT_POSTFIELDS 7.1
+CURLOPT_POSTFIELDSIZE 7.2
+CURLOPT_POSTFIELDSIZE_LARGE 7.11.1
+CURLOPT_POSTQUOTE 7.1
+CURLOPT_POSTREDIR 7.19.1
+CURLOPT_PREQUOTE 7.9.5
+CURLOPT_PRIVATE 7.10.3
+CURLOPT_PROGRESSDATA 7.1
+CURLOPT_PROGRESSFUNCTION 7.1
+CURLOPT_PROGRESSMODE 7.1 - 7.9.2
+CURLOPT_PROTOCOLS 7.19.4
+CURLOPT_PROXY 7.1
+CURLOPT_PROXYAUTH 7.10.7
+CURLOPT_PROXYPASSWORD 7.19.1
+CURLOPT_PROXYPORT 7.1
+CURLOPT_PROXYTYPE 7.10
+CURLOPT_PROXYUSERNAME 7.19.1
+CURLOPT_PROXYUSERPWD 7.1
+CURLOPT_PROXY_TRANSFER_MODE 7.18.0
+CURLOPT_PUT 7.1
+CURLOPT_QUOTE 7.1
+CURLOPT_RANDOM_FILE 7.7
+CURLOPT_RANGE 7.1
+CURLOPT_READDATA 7.9.7
+CURLOPT_READFUNCTION 7.1
+CURLOPT_REDIR_PROTOCOLS 7.19.4
+CURLOPT_REFERER 7.1
+CURLOPT_RESOLVE 7.21.3
+CURLOPT_RESUME_FROM 7.1
+CURLOPT_RESUME_FROM_LARGE 7.11.0
+CURLOPT_RTSPHEADER 7.20.0
+CURLOPT_RTSP_CLIENT_CSEQ 7.20.0
+CURLOPT_RTSP_REQUEST 7.20.0
+CURLOPT_RTSP_SERVER_CSEQ 7.20.0
+CURLOPT_RTSP_SESSION_ID 7.20.0
+CURLOPT_RTSP_STREAM_URI 7.20.0
+CURLOPT_RTSP_TRANSPORT 7.20.0
+CURLOPT_SEEKDATA 7.18.1
+CURLOPT_SEEKFUNCTION 7.18.1
+CURLOPT_SERVER_RESPONSE_TIMEOUT 7.20.0
+CURLOPT_SHARE 7.10
+CURLOPT_SOCKOPTDATA 7.16.0
+CURLOPT_SOCKOPTFUNCTION 7.16.0
+CURLOPT_SOCKS5_GSSAPI_NEC 7.19.4
+CURLOPT_SOCKS5_GSSAPI_SERVICE 7.19.4
+CURLOPT_SOURCE_HOST 7.12.1 - 7.13.0
+CURLOPT_SOURCE_PATH 7.12.1 - 7.13.0
+CURLOPT_SOURCE_PORT 7.12.1 - 7.13.0
+CURLOPT_SOURCE_POSTQUOTE 7.12.1 - 7.15.4
+CURLOPT_SOURCE_PREQUOTE 7.12.1 - 7.15.4
+CURLOPT_SOURCE_QUOTE 7.13.0 - 7.15.4
+CURLOPT_SOURCE_URL 7.13.0 - 7.15.4
+CURLOPT_SOURCE_USERPWD 7.12.1 - 7.15.4
+CURLOPT_SSH_AUTH_TYPES 7.16.1
+CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 7.17.1
+CURLOPT_SSH_KEYDATA 7.19.6
+CURLOPT_SSH_KEYFUNCTION 7.19.6
+CURLOPT_SSH_KNOWNHOSTS 7.19.6
+CURLOPT_SSH_PRIVATE_KEYFILE 7.16.1
+CURLOPT_SSH_PUBLIC_KEYFILE 7.16.1
+CURLOPT_SSLCERT 7.1
+CURLOPT_SSLCERTPASSWD 7.17.0
+CURLOPT_SSLCERTTYPE 7.9.3
+CURLOPT_SSLENGINE 7.9.3
+CURLOPT_SSLENGINE_DEFAULT 7.9.3
+CURLOPT_SSLKEY 7.9.3
+CURLOPT_SSLKEYPASSWD 7.17.0
+CURLOPT_SSLKEYPASSWD 7.17.0
+CURLOPT_SSLKEYTYPE 7.9.3
+CURLOPT_SSLVERSION 7.1
+CURLOPT_SSL_CIPHER_LIST 7.9
+CURLOPT_SSL_CTX_DATA 7.10.6
+CURLOPT_SSL_CTX_FUNCTION 7.10.6
+CURLOPT_SSL_SESSIONID_CACHE 7.16.0
+CURLOPT_SSL_VERIFYHOST 7.8.1
+CURLOPT_SSL_VERIFYPEER 7.4.2
+CURLOPT_STDERR 7.1
+CURLOPT_TCP_NODELAY 7.11.2
+CURLOPT_TELNETOPTIONS 7.7
+CURLOPT_TFTP_BLKSIZE 7.19.4
+CURLOPT_TIMECONDITION 7.1
+CURLOPT_TIMEOUT 7.1
+CURLOPT_TIMEOUT_MS 7.16.2
+CURLOPT_TIMEVALUE 7.1
+CURLOPT_TRANSFERTEXT 7.11.1
+CURLOPT_UNRESTRICTED_AUTH 7.10.4
+CURLOPT_UPLOAD 7.1
+CURLOPT_URL 7.1
+CURLOPT_USERAGENT 7.1
+CURLOPT_USERNAME 7.19.1
+CURLOPT_USERPWD 7.1
+CURLOPT_USE_SSL 7.17.0
+CURLOPT_VERBOSE 7.1
+CURLOPT_WILDCARDMATCH 7.21.0
+CURLOPT_WRITEDATA 7.9.7
+CURLOPT_WRITEFUNCTION 7.1
+CURLOPT_WRITEHEADER 7.1
+CURLOPT_WRITEINFO 7.1
+CURLPAUSE_ALL 7.18.0
+CURLPAUSE_CONT 7.18.0
+CURLPAUSE_RECV 7.18.0
+CURLPAUSE_RECV_CONT 7.18.0
+CURLPAUSE_SEND 7.18.0
+CURLPAUSE_SEND_CONT 7.18.0
+CURLPROTO_ALL 7.19.4
+CURLPROTO_DICT 7.19.4
+CURLPROTO_FILE 7.19.4
+CURLPROTO_FTP 7.19.4
+CURLPROTO_FTPS 7.19.4
+CURLPROTO_GOPHER 7.21.2
+CURLPROTO_HTTP 7.19.4
+CURLPROTO_HTTPS 7.19.4
+CURLPROTO_IMAP 7.20.0
+CURLPROTO_IMAPS 7.20.0
+CURLPROTO_LDAP 7.19.4
+CURLPROTO_LDAPS 7.19.4
+CURLPROTO_POP3 7.20.0
+CURLPROTO_POP3S 7.20.0
+CURLPROTO_RTMP 7.21.0
+CURLPROTO_RTMPE 7.21.0
+CURLPROTO_RTMPS 7.21.0
+CURLPROTO_RTMPT 7.21.0
+CURLPROTO_RTMPTE 7.21.0
+CURLPROTO_RTMPTS 7.21.0
+CURLPROTO_RTSP 7.20.0
+CURLPROTO_SCP 7.19.4
+CURLPROTO_SFTP 7.19.4
+CURLPROTO_SMTP 7.20.0
+CURLPROTO_SMTPS 7.20.0
+CURLPROTO_TELNET 7.19.4
+CURLPROTO_TFTP 7.19.4
+CURLPROXY_HTTP 7.10
+CURLPROXY_HTTP_1_0 7.19.4
+CURLPROXY_SOCKS4 7.10
+CURLPROXY_SOCKS4A 7.18.0
+CURLPROXY_SOCKS5 7.10
+CURLPROXY_SOCKS5_HOSTNAME 7.18.0
+CURLSHE_BAD_OPTION 7.10.3
+CURLSHE_INVALID 7.10.3
+CURLSHE_IN_USE 7.10.3
+CURLSHE_NOMEM 7.10.3
+CURLSHE_OK 7.10.3
+CURLSHOPT_LOCKFUNC 7.10.3
+CURLSHOPT_NONE 7.10.3
+CURLSHOPT_SHARE 7.10.3
+CURLSHOPT_UNLOCKFUNC 7.10.3
+CURLSHOPT_UNSHARE 7.10.3
+CURLSHOPT_USERDATA 7.10.3
+CURLSOCKTYPE_IPCXN 7.15.6
+CURLSSH_AUTH_ANY 7.16.1
+CURLSSH_AUTH_DEFAULT 7.16.1
+CURLSSH_AUTH_HOST 7.16.1
+CURLSSH_AUTH_KEYBOARD 7.16.1
+CURLSSH_AUTH_NONE 7.16.1
+CURLSSH_AUTH_PASSWORD 7.16.1
+CURLSSH_AUTH_PUBLICKEY 7.16.1
+CURLUSESSL_ALL 7.17.0
+CURLUSESSL_ALL 7.17.0
+CURLUSESSL_CONTROL 7.17.0
+CURLUSESSL_CONTROL 7.17.0
+CURLUSESSL_NONE 7.17.0
+CURLUSESSL_NONE 7.17.0
+CURLUSESSL_TRY 7.17.0
+CURLUSESSL_TRY 7.17.0
+CURLVERSION_FIRST 7.10
+CURLVERSION_FOURTH 7.16.1
+CURLVERSION_NOW 7.10
+CURLVERSION_SECOND 7.11.1
+CURLVERSION_THIRD 7.12.0
+CURL_CHUNK_BGN_FUNC_FAIL 7.21.0
+CURL_CHUNK_BGN_FUNC_OK 7.21.0
+CURL_CHUNK_BGN_FUNC_SKIP 7.21.0
+CURL_CHUNK_END_FUNC_FAIL 7.21.0
+CURL_CHUNK_END_FUNC_OK 7.21.0
+CURL_ERROR_SIZE 7.1
+CURL_FNMATCHFUNC_FAIL 7.21.0
+CURL_FNMATCHFUNC_MATCH 7.21.0
+CURL_FNMATCHFUNC_NOMATCH 7.21.0
+CURL_FORMADD_DISABLED 7.12.1
+CURL_FORMADD_ILLEGAL_ARRAY 7.9.8
+CURL_FORMADD_INCOMPLETE 7.9.8
+CURL_FORMADD_MEMORY 7.9.8
+CURL_FORMADD_NULL 7.9.8
+CURL_FORMADD_OK 7.9.8
+CURL_FORMADD_OPTION_TWICE 7.9.8
+CURL_FORMADD_UNKNOWN_OPTION 7.9.8
+CURL_GLOBAL_ALL 7.8
+CURL_GLOBAL_DEFAULT 7.8
+CURL_GLOBAL_NOTHING 7.8
+CURL_GLOBAL_SSL 7.8
+CURL_GLOBAL_WIN32 7.8.1
+CURL_HTTP_VERSION_1_0 7.9.1
+CURL_HTTP_VERSION_1_1 7.9.1
+CURL_HTTP_VERSION_NONE 7.9.1
+CURL_IPRESOLVE_V4 7.10.8
+CURL_IPRESOLVE_V6 7.10.8
+CURL_IPRESOLVE_WHATEVER 7.10.8
+CURL_LOCK_ACCESS_NONE 7.10.3
+CURL_LOCK_ACCESS_SHARED 7.10.3
+CURL_LOCK_ACCESS_SINGLE 7.10.3
+CURL_LOCK_DATA_CONNECT 7.10.3
+CURL_LOCK_DATA_COOKIE 7.10.3
+CURL_LOCK_DATA_DNS 7.10.3
+CURL_LOCK_DATA_NONE 7.10.3
+CURL_LOCK_DATA_SHARE 7.10.4
+CURL_LOCK_DATA_SSL_SESSION 7.10.3
+CURL_MAX_HTTP_HEADER 7.19.7
+CURL_MAX_WRITE_SIZE 7.9.7
+CURL_NETRC_IGNORED 7.9.8
+CURL_NETRC_OPTIONAL 7.9.8
+CURL_NETRC_REQUIRED 7.9.8
+CURL_READFUNC_ABORT 7.12.1
+CURL_READFUNC_PAUSE 7.18.0
+CURL_REDIR_GET_ALL 7.19.1
+CURL_REDIR_POST_301 7.19.1
+CURL_REDIR_POST_302 7.19.1
+CURL_REDIR_POST_ALL 7.19.1
+CURL_RTSPREQ_ANNOUNCE 7.20.0
+CURL_RTSPREQ_DESCRIBE 7.20.0
+CURL_RTSPREQ_GET_PARAMETER 7.20.0
+CURL_RTSPREQ_NONE 7.20.0
+CURL_RTSPREQ_OPTIONS 7.20.0
+CURL_RTSPREQ_PAUSE 7.20.0
+CURL_RTSPREQ_PLAY 7.20.0
+CURL_RTSPREQ_RECEIVE 7.20.0
+CURL_RTSPREQ_RECORD 7.20.0
+CURL_RTSPREQ_SETUP 7.20.0
+CURL_RTSPREQ_SET_PARAMETER 7.20.0
+CURL_RTSPREQ_TEARDOWN 7.20.0
+CURL_SEEKFUNC_CANTSEEK 7.19.5
+CURL_SEEKFUNC_FAIL 7.19.5
+CURL_SEEKFUNC_OK 7.19.5
+CURL_SOCKET_BAD 7.14.0
+CURL_SSLVERSION_DEFAULT 7.9.2
+CURL_SSLVERSION_SSLv2 7.9.2
+CURL_SSLVERSION_SSLv3 7.9.2
+CURL_SSLVERSION_TLSv1 7.9.2
+CURL_TIMECOND_IFMODSINCE 7.9.7
+CURL_TIMECOND_IFUNMODSINCE 7.9.7
+CURL_TIMECOND_LASTMOD 7.9.7
+CURL_TIMECOND_NONE 7.9.7
+CURL_VERSION_ASYNCHDNS 7.10.7
+CURL_VERSION_CONV 7.15.4
+CURL_VERSION_CURLDEBUG 7.19.6
+CURL_VERSION_DEBUG 7.10.6
+CURL_VERSION_GSSNEGOTIATE 7.10.6
+CURL_VERSION_IDN 7.12.0
+CURL_VERSION_IPV6 7.10
+CURL_VERSION_KERBEROS4 7.10
+CURL_VERSION_LARGEFILE 7.11.1
+CURL_VERSION_LIBZ 7.10
+CURL_VERSION_NTLM 7.10.6
+CURL_VERSION_SPNEGO 7.10.8
+CURL_VERSION_SSL 7.10
+CURL_VERSION_SSPI 7.13.2
+CURL_WRITEFUNC_PAUSE 7.18.0
diff --git a/template/Easy.pm.tmpl b/template/Easy.pm.tmpl
index 4ece4cb..26fa853 100644
--- a/template/Easy.pm.tmpl
+++ b/template/Easy.pm.tmpl
@@ -4,7 +4,7 @@ use strict;
use warnings;
use Carp;
-our $VERSION = '4.14';
+our $VERSION = '4.15';
use WWW::Curl ();
use Exporter ();
diff --git a/template/Share.pm.tmpl b/template/Share.pm.tmpl
index cc34937..3c73db2 100644
--- a/template/Share.pm.tmpl
+++ b/template/Share.pm.tmpl
@@ -20,8 +20,8 @@ sub AUTOLOAD {
( my $constname = $AUTOLOAD ) =~ s/.*:://;
my $value = constant( $constname );
- if($!) {
- croak("Undefined subroutine &$AUTOLOAD failed");
+ if ($!) {
+ croak("Undefined subroutine &$AUTOLOAD failed for reasons of $!, constname was $constname, value was: $value");
}
{