Compare commits
102 Commits
before_url
...
curl-7_9
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4d2cb8b32a | ||
![]() |
d5001a3f0b | ||
![]() |
91f5ac4d5c | ||
![]() |
f9977df50d | ||
![]() |
711650b178 | ||
![]() |
c9adbc9f1c | ||
![]() |
611fbfa917 | ||
![]() |
ecfacfb334 | ||
![]() |
645413f5ef | ||
![]() |
5becdc38b3 | ||
![]() |
f36cea67fe | ||
![]() |
b556d6caee | ||
![]() |
a17a78c477 | ||
![]() |
146413a53c | ||
![]() |
437fd064c9 | ||
![]() |
28dd4e4f1f | ||
![]() |
f92dc70beb | ||
![]() |
6d8f1328bf | ||
![]() |
8d1d93d56d | ||
![]() |
f8e102c485 | ||
![]() |
d816fcc965 | ||
![]() |
e30dcd0501 | ||
![]() |
24dc7cffbd | ||
![]() |
3bc83926ce | ||
![]() |
c5cca4d059 | ||
![]() |
0db04c4f56 | ||
![]() |
5c566c9aa3 | ||
![]() |
822f02313d | ||
![]() |
d934890c1e | ||
![]() |
0e25cf41c4 | ||
![]() |
5214dbbd02 | ||
![]() |
0c716d51ad | ||
![]() |
86367d675a | ||
![]() |
bd8cef5a70 | ||
![]() |
708431e2ea | ||
![]() |
db5c1c61e5 | ||
![]() |
aa4ff6d8b9 | ||
![]() |
6d5b8b50e1 | ||
![]() |
600d7b11e6 | ||
![]() |
afa7648be6 | ||
![]() |
5c344fc23a | ||
![]() |
5a905e0bb8 | ||
![]() |
c31216949d | ||
![]() |
2cb893575d | ||
![]() |
63f1f58077 | ||
![]() |
36e9507e29 | ||
![]() |
1fde1431c9 | ||
![]() |
bec97a0999 | ||
![]() |
07de3c9df0 | ||
![]() |
8950a2dfa1 | ||
![]() |
be47d83555 | ||
![]() |
d5054ad52d | ||
![]() |
051fad8d88 | ||
![]() |
c4532b9a07 | ||
![]() |
0e7824d1a9 | ||
![]() |
a2c78607a6 | ||
![]() |
cc1a4edf3d | ||
![]() |
db7bde1d7a | ||
![]() |
719008596a | ||
![]() |
377e78d917 | ||
![]() |
894b47da9b | ||
![]() |
54e7246342 | ||
![]() |
9b3b050640 | ||
![]() |
a0e389caa2 | ||
![]() |
b747408f9e | ||
![]() |
d3e55d8155 | ||
![]() |
96c7253cea | ||
![]() |
3f5227dfc7 | ||
![]() |
b91103099a | ||
![]() |
82d3ded922 | ||
![]() |
5a8d1c4cd1 | ||
![]() |
46372c04ee | ||
![]() |
6147879837 | ||
![]() |
e2e3c95d3b | ||
![]() |
c3b448dcea | ||
![]() |
86da31e031 | ||
![]() |
1d7075e339 | ||
![]() |
610ec27d93 | ||
![]() |
70f2717c11 | ||
![]() |
b31a54c46a | ||
![]() |
08238f4320 | ||
![]() |
06993556f3 | ||
![]() |
144459d364 | ||
![]() |
0fa61eff77 | ||
![]() |
a0be515d2d | ||
![]() |
5900c0f767 | ||
![]() |
d10cf2ba94 | ||
![]() |
bae1a75731 | ||
![]() |
f5adc8e53f | ||
![]() |
67df4c9e6c | ||
![]() |
50adfe3be9 | ||
![]() |
71794da389 | ||
![]() |
6ef11f0b13 | ||
![]() |
a5705acc9c | ||
![]() |
47e7a3e678 | ||
![]() |
0ece1b5c34 | ||
![]() |
315954c175 | ||
![]() |
27ce46a85d | ||
![]() |
ea3cc81487 | ||
![]() |
a9b139b25c | ||
![]() |
bbdd5adf6e | ||
![]() |
d425f5389d |
133
CHANGES
133
CHANGES
@@ -6,14 +6,143 @@
|
||||
|
||||
History of Changes
|
||||
|
||||
Daniel (23 September 2001)
|
||||
- Found and removed a 'socket leak' that would occur on IPv6 enabled hosts
|
||||
when FTP RETR failed.
|
||||
|
||||
- Made the FTP upload tests run fine on machines with IPv6 enabled.
|
||||
|
||||
Version 7.9-pre8
|
||||
|
||||
Daniel (19 September 2001)
|
||||
- Vojtech Minarik set up a special-purpose test server and provided me with
|
||||
test certificates in order for me to repeat the bug reports #440068 and
|
||||
#440373. It turned out we didn't check all the error codes properly. We do
|
||||
now, and connecting with a unacceptable certificate will make libcurl fail
|
||||
to connect with an error code returned.
|
||||
|
||||
- Ramana Mokkapati found a case when the Location: following code did wrong.
|
||||
I wrote a test case for this (45).
|
||||
|
||||
Version 7.9-pre7
|
||||
|
||||
Daniel (17 September 2001)
|
||||
- Linus Nielsen Feltzing fixed telnet for win32. It makes libcurl require
|
||||
winsock 2.0.
|
||||
|
||||
Version 7.9-pre6
|
||||
|
||||
- libtool 1.4.2 is now in use!
|
||||
|
||||
Version 7.9-pre5
|
||||
|
||||
Daniel (14 September 2001)
|
||||
- Added another 14 ftp tests.
|
||||
|
||||
Daniel (13 September 2001)
|
||||
- Added curl_easy_duphandle() to the easy.h header file. It has now been
|
||||
tested and proved to work in a real-world tests by T Bharath. We still need
|
||||
to write up some docs for this function.
|
||||
|
||||
- Added four more ftp tests to the test suite.
|
||||
|
||||
Daniel (12 September 2001)
|
||||
- CURLOPT_SSL_CIPHER_LIST was added, and the curl tool option is named
|
||||
--ciphers. Use them to specify a list of ciphers to use in the SSL
|
||||
connection.
|
||||
|
||||
- T. Bharath found a memory leak in libcurl's windows version. It turned out
|
||||
to be the new duphandle() that didn't quite work yet.
|
||||
|
||||
Version 7.9-pre4
|
||||
|
||||
Daniel (11 September 2001)
|
||||
- Added verbose output for SSL connections that output the server
|
||||
certificate's start and expire dates. As suggested by Paul Harrington.
|
||||
|
||||
- Heikki Korpela found problems in the perl ftp server used for the test
|
||||
suite, when he runs on on OpenBSD with perl 5.6. Some changes have been
|
||||
made, but nothing really certain.
|
||||
|
||||
- T. Bharath has experienced problems with libcurl's stack usage on windows
|
||||
and works on reducing it.
|
||||
|
||||
Daniel (10 September 2001)
|
||||
- Cris Bailiff fixed the perl interface. It stopped working since the changed
|
||||
behavior with WRITEHEADER and NULL pointers.
|
||||
|
||||
- The "output cookies" function could dump core if no cookies were enabled.
|
||||
|
||||
Daniel (7 September 2001)
|
||||
- SM pointed out that the SSL code didn't compile any longer if SSL was
|
||||
disabled... Also, we needed to correct the #include for the utime stuff on
|
||||
windows.
|
||||
|
||||
Daniel (6 September 2001)
|
||||
- T. Bharath pointed out a flaw in the SSL session cache code that made it
|
||||
sometimes read from a NULL pointer.
|
||||
|
||||
Version 7.9-pre3
|
||||
|
||||
Daniel (3 September 2001)
|
||||
- Added the -R/--remote-time option, that uses the remote file's datestamp to
|
||||
set the local file's datestamp. Thus, when you get a remote file your local
|
||||
file will get the same time and date. Note that this only works when you use
|
||||
-o or -O.
|
||||
|
||||
- Installed libtool 1.4.1, libtoolized and everything.
|
||||
|
||||
Daniel (1 September 2001)
|
||||
- Heikki Korpela pointed out that I did not ship the proper libtool stuff in
|
||||
the pre-releases, even though that was my intention. libtoolize has now
|
||||
been re-run.
|
||||
|
||||
- Heikki also patched away the bad use of 'make -C' in the test suite
|
||||
makefile. make -C is not very portable and is now banned from here.
|
||||
|
||||
Version 7.9-pre2
|
||||
|
||||
Daniel (31 August 2001)
|
||||
- I just made a huge internal struct rehaul, and all the big internally used
|
||||
structs have been renamed, redesigned and stuff have been moved around a bit
|
||||
to make the source easier to follow, more logically grouped and to hopefully
|
||||
decrease future bugs. I also hope that this will make new functions to get
|
||||
easier to add, and make it less likely that we have bugs left like the URL-
|
||||
free bug from August 23.
|
||||
|
||||
Version 7.9-pre1
|
||||
|
||||
Daniel (29 August 2001)
|
||||
- The new cookie code have enabled the brand new '-c/--cookie-jar' option. Use
|
||||
that to specify the file name in which you want to have all cookies curl
|
||||
knows of, dumped to. It'll be written using the netscape cookie format.
|
||||
|
||||
This is internally done with the new CURLOPT_COOKIEJAR option to libcurl,
|
||||
which in turn dumps this information when curl_easy_cleanup() is invoked.
|
||||
There might be reasons to re-consider my choice of putting it there. Perhaps
|
||||
it is better placed to get done just before *_perform() is done. It is all
|
||||
of course depending on how you guys want to use this feature...
|
||||
|
||||
- Added ftpupload.c in the source examples section, based on source code posted
|
||||
by Erick Nuwendam.
|
||||
|
||||
Daniel (28 August 2001)
|
||||
- Now running libtool CVS branch-1-4 to generate stuff. Should fix problems
|
||||
on OpenBSD and hopefully on FreeBSD as well!
|
||||
|
||||
- Georg Huettenegger modified the curl_formadd() functionality slightly, and
|
||||
added support for error code 417 when doing form post and using the Expect:
|
||||
header. Great work!
|
||||
|
||||
- Made some tests with cached SSL session IDs, and they seem to work. There
|
||||
should be a significant speed improvement in the SSL connection phase, but
|
||||
in my tiny tests it just isn't possible to notice any difference.
|
||||
in my tiny tests it just isn't possible to notice any difference. Like other
|
||||
caching in libcurl, you must reuse the same handle for the caching to take
|
||||
effect. SSL session ID caching is done on a per host-name and destination
|
||||
port number basis.
|
||||
|
||||
Set verbose, and you'll get informational tests when libcurl detects and
|
||||
uses a previous SSL session ID.
|
||||
|
||||
- Upgraded to automake 1.5 on my development/release machine.
|
||||
|
||||
@@ -1065,7 +1194,7 @@ Version 7.6.1-pre2
|
||||
Daniel (31 January 2001)
|
||||
- Curl_read() and curl_read() now return a ssize_t for the size, as it had to
|
||||
be able to return -1. The telnet support crashed due to this and there was a
|
||||
possibility to weird behaviour all over. Linus Nielsen Feltzing helped me
|
||||
possibility to weird behavior all over. Linus Nielsen Feltzing helped me
|
||||
find this.
|
||||
|
||||
- Added a configure.in check for a working getaddrinfo() if IPv6 is requested.
|
||||
|
4
CVS-INFO
4
CVS-INFO
@@ -10,8 +10,8 @@ This file is only present in the CVS - never in release archives. It contains
|
||||
information about other files and things that the CVS repository keeps in its
|
||||
inner sanctum.
|
||||
|
||||
Use autoconf 2.50 and no earlier. Also, try having automake 1.4 and libtool
|
||||
1.4 at least.
|
||||
Use autoconf 2.50 and no earlier. Also, try having automake 1.5 and libtool
|
||||
1.4.1 at least.
|
||||
|
||||
You will need perl to generate the src/hugehelp.c file. The file
|
||||
src/hugehelp.c.cvs is a one-shot file that you can rename to src/hugehelp.c if
|
||||
|
@@ -8,11 +8,11 @@ EXTRA_DIST = \
|
||||
CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt \
|
||||
config-win32.h reconf Makefile.dist \
|
||||
curl-config.in build_vms.com config-riscos.h \
|
||||
config-vms.h
|
||||
config-vms.h curl-mode.el
|
||||
|
||||
bin_SCRIPTS = curl-config
|
||||
|
||||
SUBDIRS = docs lib src include tests packages perl php
|
||||
SUBDIRS = docs lib src include tests packages
|
||||
|
||||
# create a root makefile in the distribution:
|
||||
dist-hook:
|
||||
|
230
config.guess
vendored
230
config.guess
vendored
@@ -3,7 +3,7 @@
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2001-04-20'
|
||||
timestamp='2001-09-04'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
@@ -52,7 +52,7 @@ version="\
|
||||
GNU config.guess ($timestamp)
|
||||
|
||||
Originally written by Per Bothner.
|
||||
Copyright (C) 1992, 93, 94, 95, 96, 97, 98, 99, 2000
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
@@ -95,25 +95,25 @@ trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15
|
||||
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
|
||||
# use `HOST_CC' if defined, but it is deprecated.
|
||||
|
||||
case $CC_FOR_BUILD,$HOST_CC,$CC in
|
||||
,,) echo "int dummy(){}" > $dummy.c
|
||||
set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
|
||||
,,) echo "int dummy(){}" > $dummy.c ;
|
||||
for c in cc gcc c89 ; do
|
||||
($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1
|
||||
($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ;
|
||||
if test $? = 0 ; then
|
||||
CC_FOR_BUILD="$c"; break
|
||||
fi
|
||||
done
|
||||
rm -f $dummy.c $dummy.o $dummy.rel
|
||||
CC_FOR_BUILD="$c"; break ;
|
||||
fi ;
|
||||
done ;
|
||||
rm -f $dummy.c $dummy.o $dummy.rel ;
|
||||
if test x"$CC_FOR_BUILD" = x ; then
|
||||
CC_FOR_BUILD=no_compiler_found
|
||||
CC_FOR_BUILD=no_compiler_found ;
|
||||
fi
|
||||
;;
|
||||
,,*) CC_FOR_BUILD=$CC ;;
|
||||
,*,*) CC_FOR_BUILD=$HOST_CC ;;
|
||||
esac
|
||||
esac'
|
||||
|
||||
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
|
||||
# (ghazi@noc.rutgers.edu 8/24/94.)
|
||||
# (ghazi@noc.rutgers.edu 1994-08-24)
|
||||
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
|
||||
PATH=$PATH:/.attbin ; export PATH
|
||||
fi
|
||||
@@ -150,6 +150,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
# to ELF recently, or will in the future.
|
||||
case "${UNAME_MACHINE}" in
|
||||
i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
|
||||
eval $set_cc_for_build
|
||||
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep __ELF__ >/dev/null
|
||||
then
|
||||
@@ -204,6 +205,7 @@ main:
|
||||
jsr \$26,exit
|
||||
.end main
|
||||
EOF
|
||||
eval $set_cc_for_build
|
||||
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
|
||||
if test "$?" = 0 ; then
|
||||
case `./$dummy` in
|
||||
@@ -225,6 +227,9 @@ EOF
|
||||
2-307)
|
||||
UNAME_MACHINE="alphaev67"
|
||||
;;
|
||||
2-1307)
|
||||
UNAME_MACHINE="alphaev68"
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
rm -f $dummy.s $dummy
|
||||
@@ -328,6 +333,9 @@ EOF
|
||||
aushp:SunOS:*:*)
|
||||
echo sparc-auspex-sunos${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
sparc*:NetBSD:*)
|
||||
echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
atari*:OpenBSD:*:*)
|
||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
@@ -385,6 +393,7 @@ EOF
|
||||
echo clipper-intergraph-clix${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
mips:*:*:UMIPS | mips:*:*:RISCos)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#ifdef __cplusplus
|
||||
#include <stdio.h> /* for printf() prototype */
|
||||
@@ -475,6 +484,7 @@ EOF
|
||||
exit 0 ;;
|
||||
*:AIX:2:3)
|
||||
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#include <sys/systemcfg.h>
|
||||
|
||||
@@ -553,6 +563,7 @@ EOF
|
||||
fi ;;
|
||||
esac
|
||||
if [ "${HP_ARCH}" = "" ]; then
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
|
||||
#define _HPUX_SOURCE
|
||||
@@ -598,6 +609,7 @@ EOF
|
||||
echo ia64-hp-hpux${HPUX_REV}
|
||||
exit 0 ;;
|
||||
3050*:HI-UX:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#include <unistd.h>
|
||||
int
|
||||
@@ -633,7 +645,7 @@ EOF
|
||||
9000/8??:4.3bsd:*:*)
|
||||
echo hppa1.0-hp-bsd
|
||||
exit 0 ;;
|
||||
*9??*:MPE/iX:*:*)
|
||||
*9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
|
||||
echo hppa1.0-hp-mpeix
|
||||
exit 0 ;;
|
||||
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
|
||||
@@ -677,12 +689,13 @@ EOF
|
||||
echo xmp-cray-unicos
|
||||
exit 0 ;;
|
||||
CRAY*Y-MP:*:*:*)
|
||||
echo ymp-cray-unicos${UNAME_RELEASE}
|
||||
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||
exit 0 ;;
|
||||
CRAY*[A-Z]90:*:*:*)
|
||||
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
|
||||
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
|
||||
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
|
||||
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
|
||||
-e 's/\.[^.]*$/.X/'
|
||||
exit 0 ;;
|
||||
CRAY*TS:*:*:*)
|
||||
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||
@@ -763,97 +776,29 @@ EOF
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit 0 ;;
|
||||
mips:Linux:*:*)
|
||||
cat >$dummy.c <<EOF
|
||||
#ifdef __cplusplus
|
||||
#include <stdio.h> /* for printf() prototype */
|
||||
int main (int argc, char *argv[]) {
|
||||
#else
|
||||
int main (argc, argv) int argc; char *argv[]; {
|
||||
#endif
|
||||
#ifdef __MIPSEB__
|
||||
printf ("%s-unknown-linux-gnu\n", argv[1]);
|
||||
#endif
|
||||
#ifdef __MIPSEL__
|
||||
printf ("%sel-unknown-linux-gnu\n", argv[1]);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy "${UNAME_MACHINE}" && rm -f $dummy.c $dummy && exit 0
|
||||
rm -f $dummy.c $dummy
|
||||
case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
|
||||
big) echo mips-unknown-linux-gnu && exit 0 ;;
|
||||
little) echo mipsel-unknown-linux-gnu && exit 0 ;;
|
||||
esac
|
||||
;;
|
||||
ppc:Linux:*:*)
|
||||
# Determine Lib Version
|
||||
cat >$dummy.c <<EOF
|
||||
#include <features.h>
|
||||
#if defined(__GLIBC__)
|
||||
extern char __libc_version[];
|
||||
extern char __libc_release[];
|
||||
#endif
|
||||
main(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
#if defined(__GLIBC__)
|
||||
printf("%s %s\n", __libc_version, __libc_release);
|
||||
#else
|
||||
printf("unknown\n");
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
LIBC=""
|
||||
$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null
|
||||
if test "$?" = 0 ; then
|
||||
./$dummy | grep 1\.99 > /dev/null
|
||||
if test "$?" = 0 ; then LIBC="libc1" ; fi
|
||||
fi
|
||||
rm -f $dummy.c $dummy
|
||||
echo powerpc-unknown-linux-gnu${LIBC}
|
||||
echo powerpc-unknown-linux-gnu
|
||||
exit 0 ;;
|
||||
ppc64:Linux:*:*)
|
||||
echo powerpc64-unknown-linux-gnu
|
||||
exit 0 ;;
|
||||
alpha:Linux:*:*)
|
||||
cat <<EOF >$dummy.s
|
||||
.data
|
||||
\$Lformat:
|
||||
.byte 37,100,45,37,120,10,0 # "%d-%x\n"
|
||||
.text
|
||||
.globl main
|
||||
.align 4
|
||||
.ent main
|
||||
main:
|
||||
.frame \$30,16,\$26,0
|
||||
ldgp \$29,0(\$27)
|
||||
.prologue 1
|
||||
.long 0x47e03d80 # implver \$0
|
||||
lda \$2,-1
|
||||
.long 0x47e20c21 # amask \$2,\$1
|
||||
lda \$16,\$Lformat
|
||||
mov \$0,\$17
|
||||
not \$1,\$18
|
||||
jsr \$26,printf
|
||||
ldgp \$29,0(\$26)
|
||||
mov 0,\$16
|
||||
jsr \$26,exit
|
||||
.end main
|
||||
EOF
|
||||
LIBC=""
|
||||
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
|
||||
if test "$?" = 0 ; then
|
||||
case `./$dummy` in
|
||||
0-0) UNAME_MACHINE="alpha" ;;
|
||||
1-0) UNAME_MACHINE="alphaev5" ;;
|
||||
1-1) UNAME_MACHINE="alphaev56" ;;
|
||||
1-101) UNAME_MACHINE="alphapca56" ;;
|
||||
2-303) UNAME_MACHINE="alphaev6" ;;
|
||||
2-307) UNAME_MACHINE="alphaev67" ;;
|
||||
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
||||
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||
EV56) UNAME_MACHINE=alphaev56 ;;
|
||||
PCA56) UNAME_MACHINE=alphapca56 ;;
|
||||
PCA57) UNAME_MACHINE=alphapca56 ;;
|
||||
EV6) UNAME_MACHINE=alphaev6 ;;
|
||||
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||
esac
|
||||
objdump --private-headers $dummy | \
|
||||
grep ld.so.1 > /dev/null
|
||||
if test "$?" = 0 ; then
|
||||
LIBC="libc1"
|
||||
fi
|
||||
fi
|
||||
rm -f $dummy.s $dummy
|
||||
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
|
||||
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||
exit 0 ;;
|
||||
parisc:Linux:*:* | hppa:Linux:*:*)
|
||||
@@ -883,40 +828,30 @@ EOF
|
||||
# The BFD linker knows what the default object file format is, so
|
||||
# first see if it will tell us. cd to the root directory to prevent
|
||||
# problems with other programs or directories called `ld' in the path.
|
||||
ld_supported_emulations=`cd /; ld --help 2>&1 \
|
||||
| sed -ne '/supported emulations:/!d
|
||||
ld_supported_targets=`cd /; ld --help 2>&1 \
|
||||
| sed -ne '/supported targets:/!d
|
||||
s/[ ][ ]*/ /g
|
||||
s/.*supported emulations: *//
|
||||
s/.*supported targets: *//
|
||||
s/ .*//
|
||||
p'`
|
||||
case "$ld_supported_emulations" in
|
||||
i*86linux)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
||||
exit 0
|
||||
;;
|
||||
elf_i*86)
|
||||
case "$ld_supported_targets" in
|
||||
elf32-i386)
|
||||
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
|
||||
;;
|
||||
i*86coff)
|
||||
a.out-i386-linux)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
||||
exit 0 ;;
|
||||
coff-i386)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
|
||||
exit 0
|
||||
;;
|
||||
esac
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld)
|
||||
# or one that does not give us useful --help.
|
||||
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
|
||||
# If ld does not provide *any* "supported emulations:"
|
||||
# that means it is gnuoldld.
|
||||
test -z "$ld_supported_emulations" && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
|
||||
case "${UNAME_MACHINE}" in
|
||||
i*86)
|
||||
VENDOR=pc;
|
||||
;;
|
||||
*)
|
||||
VENDOR=unknown;
|
||||
;;
|
||||
exit 0 ;;
|
||||
"")
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld) or
|
||||
# one that does not give us useful --help.
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
|
||||
exit 0 ;;
|
||||
esac
|
||||
# Determine whether the default compiler is a.out or elf
|
||||
eval $set_cc_for_build
|
||||
cat >$dummy.c <<EOF
|
||||
#include <features.h>
|
||||
#ifdef __cplusplus
|
||||
@@ -928,15 +863,15 @@ EOF
|
||||
#ifdef __ELF__
|
||||
# ifdef __GLIBC__
|
||||
# if __GLIBC__ >= 2
|
||||
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
|
||||
printf ("%s-pc-linux-gnu\n", argv[1]);
|
||||
# else
|
||||
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||
printf ("%s-pc-linux-gnulibc1\n", argv[1]);
|
||||
# endif
|
||||
# else
|
||||
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
||||
printf ("%s-pc-linux-gnulibc1\n", argv[1]);
|
||||
# endif
|
||||
#else
|
||||
printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
|
||||
printf ("%s-pc-linux-gnuaout\n", argv[1]);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
@@ -945,9 +880,10 @@ EOF
|
||||
rm -f $dummy.c $dummy
|
||||
test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
|
||||
;;
|
||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. earlier versions
|
||||
# are messed up and put the nodename in both sysname and nodename.
|
||||
i*86:DYNIX/ptx:4*:*)
|
||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
|
||||
# earlier versions are messed up and put the nodename in both
|
||||
# sysname and nodename.
|
||||
echo i386-sequent-sysv4
|
||||
exit 0 ;;
|
||||
i*86:UNIX_SV:4.2MP:2.*)
|
||||
@@ -966,14 +902,13 @@ EOF
|
||||
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
|
||||
fi
|
||||
exit 0 ;;
|
||||
i*86:*:5:7*)
|
||||
# Fixed at (any) Pentium or better
|
||||
UNAME_MACHINE=i586
|
||||
if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
|
||||
echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
|
||||
else
|
||||
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
|
||||
fi
|
||||
i*86:*:5:[78]*)
|
||||
case `/bin/uname -X | grep "^Machine"` in
|
||||
*486*) UNAME_MACHINE=i486 ;;
|
||||
*Pentium) UNAME_MACHINE=i586 ;;
|
||||
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
|
||||
esac
|
||||
echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
|
||||
exit 0 ;;
|
||||
i*86:*:3.2:*)
|
||||
if test -f /usr/options/cb.name; then
|
||||
@@ -1067,7 +1002,7 @@ EOF
|
||||
echo ns32k-sni-sysv
|
||||
fi
|
||||
exit 0 ;;
|
||||
PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||
echo i586-unisys-sysv4
|
||||
exit 0 ;;
|
||||
@@ -1080,6 +1015,10 @@ EOF
|
||||
# From seanf@swdc.stratus.com.
|
||||
echo i860-stratus-sysv4
|
||||
exit 0 ;;
|
||||
*:VOS:*:*)
|
||||
# From Paul.Green@stratus.com.
|
||||
echo hppa1.1-stratus-vos
|
||||
exit 0 ;;
|
||||
mc68*:A/UX:*:*)
|
||||
echo m68k-apple-aux${UNAME_RELEASE}
|
||||
exit 0 ;;
|
||||
@@ -1172,11 +1111,18 @@ EOF
|
||||
*:ITS:*:*)
|
||||
echo pdp10-unknown-its
|
||||
exit 0 ;;
|
||||
i*86:XTS-300:*:STOP)
|
||||
echo ${UNAME_MACHINE}-unknown-stop
|
||||
exit 0 ;;
|
||||
i*86:atheos:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-atheos
|
||||
exit 0 ;;
|
||||
esac
|
||||
|
||||
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
||||
|
||||
eval $set_cc_for_build
|
||||
cat >$dummy.c <<EOF
|
||||
#ifdef _SEQUENT_
|
||||
# include <sys/types.h>
|
||||
|
149
config.sub
vendored
149
config.sub
vendored
@@ -3,7 +3,7 @@
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||
# Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2001-04-20'
|
||||
timestamp='2001-09-07'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
@@ -117,7 +117,7 @@ esac
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*)
|
||||
nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
@@ -157,6 +157,14 @@ case $os in
|
||||
os=-vxworks
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusos*)
|
||||
os=-chorusos
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
basic_machine=$1
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
@@ -215,26 +223,36 @@ esac
|
||||
case $basic_machine in
|
||||
# Recognize the basic CPU types without company name.
|
||||
# Some are omitted here because they have special meanings below.
|
||||
tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \
|
||||
| arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \
|
||||
| pyramid | mn10200 | mn10300 | tron | a29k \
|
||||
| 580 | i960 | h8300 \
|
||||
| x86 | ppcbe | mipsbe | mipsle | shbe | shle \
|
||||
| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
|
||||
| hppa64 \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
|
||||
| alphaev6[78] \
|
||||
| we32k | ns16k | clipper | i370 | sh | sh[34] \
|
||||
| powerpc | powerpcle \
|
||||
| 1750a | dsp16xx | pdp10 | pdp11 \
|
||||
| mips16 | mips64 | mipsel | mips64el \
|
||||
| mips64orion | mips64orionel | mipstx39 | mipstx39el \
|
||||
| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \
|
||||
| sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \
|
||||
| v850 | c4x \
|
||||
| thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \
|
||||
| pj | pjl | h8500)
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
|
||||
| c4x | clipper \
|
||||
| d10v | d30v | dsp16xx \
|
||||
| fr30 \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| m32r | m68000 | m68k | m88k | mcore \
|
||||
| mips16 | mips64 | mips64el | mips64orion | mips64orionel \
|
||||
| mips64vr4100 | mips64vr4100el | mips64vr4300 \
|
||||
| mips64vr4300el | mips64vr5000 | mips64vr5000el \
|
||||
| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
|
||||
| mipsisa32 \
|
||||
| mn10200 | mn10300 \
|
||||
| ns16k | ns32k \
|
||||
| openrisc \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| pyramid \
|
||||
| s390 | s390x \
|
||||
| sh | sh[34] | sh[34]eb | shbe | shle \
|
||||
| sparc | sparc64 | sparclet | sparclite | sparcv9 | sparcv9b \
|
||||
| stormy16 | strongarm \
|
||||
| tahoe | thumb | tic80 | tron \
|
||||
| v850 \
|
||||
| we32k \
|
||||
| x86 | xscale \
|
||||
| z8k)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12)
|
||||
@@ -242,7 +260,7 @@ case $basic_machine in
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | z8k | v70 | w65)
|
||||
m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
@@ -257,31 +275,43 @@ case $basic_machine in
|
||||
exit 1
|
||||
;;
|
||||
# Recognize the basic CPU types with company name.
|
||||
# FIXME: clean up the formatting here.
|
||||
vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
|
||||
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \
|
||||
| arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \
|
||||
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
||||
| power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
|
||||
| xmp-* | ymp-* \
|
||||
| x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \
|
||||
| hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
|
||||
| hppa2.0n-* | hppa64-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
|
||||
| alphaev6[78]-* \
|
||||
| we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
|
||||
| clipper-* | orion-* \
|
||||
| sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
|
||||
| sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \
|
||||
| mips16-* | mips64-* | mipsel-* \
|
||||
| mips64el-* | mips64orion-* | mips64orionel-* \
|
||||
| mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
|
||||
| mipstx39-* | mipstx39el-* | mcore-* \
|
||||
| f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \
|
||||
| [cjt]90-* \
|
||||
| m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
|
||||
| thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \
|
||||
| bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*)
|
||||
580-* \
|
||||
| a29k-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alphapca5[67]-* | arc-* \
|
||||
| arm-* | armbe-* | armle-* | armv*-* \
|
||||
| bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c54x-* \
|
||||
| clipper-* | cray2-* | cydra-* \
|
||||
| d10v-* | d30v-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fr30-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| m32r-* \
|
||||
| m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | mcore-* \
|
||||
| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
|
||||
| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
|
||||
| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* \
|
||||
| s390-* | s390x-* \
|
||||
| sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* \
|
||||
| sparc-* | sparc64-* | sparc86x-* | sparclite-* \
|
||||
| sparcv9-* | sparcv9b-* | stormy16-* | strongarm-* | sv1-* \
|
||||
| t3e-* | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \
|
||||
| v850-* | vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xmp-* | xps100-* | xscale-* \
|
||||
| ymp-* \
|
||||
| z8k-*)
|
||||
;;
|
||||
# Recognize the various machine names and aliases which stand
|
||||
# for a CPU type and a company and sometimes even an OS.
|
||||
@@ -727,6 +757,16 @@ case $basic_machine in
|
||||
ppcle-* | powerpclittle-*)
|
||||
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppc64) basic_machine=powerpc64-unknown
|
||||
;;
|
||||
ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppc64le | powerpc64little | ppc64-le | powerpc64-little)
|
||||
basic_machine=powerpc64le-unknown
|
||||
;;
|
||||
ppc64le-* | powerpc64little-*)
|
||||
basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ps2)
|
||||
basic_machine=i386-ibm
|
||||
;;
|
||||
@@ -881,6 +921,10 @@ case $basic_machine in
|
||||
basic_machine=hppa1.1-winbond
|
||||
os=-proelf
|
||||
;;
|
||||
windows32)
|
||||
basic_machine=i386-pc
|
||||
os=-windows32-msvcrt
|
||||
;;
|
||||
xmp)
|
||||
basic_machine=xmp-cray
|
||||
os=-unicos
|
||||
@@ -934,7 +978,7 @@ case $basic_machine in
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sh3 | sh4)
|
||||
sh3 | sh4 | sh3eb | sh4eb)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sparc | sparcv9 | sparcv9b)
|
||||
@@ -1018,11 +1062,13 @@ case $os in
|
||||
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* | -os2*)
|
||||
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
|
||||
| -os2* | -vos*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
@@ -1346,6 +1392,9 @@ case $basic_machine in
|
||||
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
|
||||
vendor=atari
|
||||
;;
|
||||
-vos*)
|
||||
vendor=stratus
|
||||
;;
|
||||
esac
|
||||
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||
;;
|
||||
|
11
configure.in
11
configure.in
@@ -477,7 +477,9 @@ AC_CHECK_HEADERS( \
|
||||
winsock.h \
|
||||
time.h \
|
||||
io.h \
|
||||
pwd.h
|
||||
pwd.h \
|
||||
utime.h \
|
||||
sys/utime.h
|
||||
)
|
||||
|
||||
dnl Check for libz header
|
||||
@@ -531,7 +533,8 @@ AC_CHECK_FUNCS( socket \
|
||||
strlcat \
|
||||
getpwuid \
|
||||
geteuid \
|
||||
dlopen
|
||||
dlopen \
|
||||
utime
|
||||
)
|
||||
|
||||
dnl removed 'getpass' check on October 26, 2000
|
||||
@@ -573,10 +576,6 @@ AC_CONFIG_FILES([Makefile \
|
||||
packages/Linux/RPM/curl.spec \
|
||||
packages/Linux/RPM/curl-ssl.spec \
|
||||
packages/Solaris/Makefile \
|
||||
perl/Makefile \
|
||||
perl/Curl_easy/Makefile \
|
||||
php/Makefile \
|
||||
php/examples/Makefile \
|
||||
curl-config
|
||||
])
|
||||
AC_OUTPUT
|
||||
|
21
curl-mode.el
Normal file
21
curl-mode.el
Normal file
@@ -0,0 +1,21 @@
|
||||
;;;; Emacs Lisp help for writing curl code. ;;;;
|
||||
|
||||
;;; In C files, put something like this to load this file automatically:
|
||||
;;
|
||||
;; /* -----------------------------------------------------------------
|
||||
;; * local variables:
|
||||
;; * eval: (load-file "../curl-mode.el")
|
||||
;; * end:
|
||||
;; */
|
||||
;;
|
||||
;; (note: make sure to get the path right in the argument to load-file).
|
||||
|
||||
|
||||
;;; The curl hacker's C conventions
|
||||
|
||||
;;; we use intent-level 2
|
||||
(setq c-basic-offset 2)
|
||||
;;; never ever use tabs to indent!
|
||||
(setq indent-tabs-mode nil)
|
||||
;;; I like this, stolen from Subversion! ;-)
|
||||
(setq angry-mob-with-torches-and-pitchforks t)
|
@@ -10,6 +10,12 @@ To Think About When Contributing Source Code
|
||||
in mind when you decide to write a contribution to the project. This concerns
|
||||
new features as well as corrections to existing flaws or bugs.
|
||||
|
||||
Join the Community
|
||||
|
||||
Skip over to http://curl.haxx.se/mail/ and join the appropriate mailing
|
||||
list(s). Read up on details before you post questions. Read this file before
|
||||
you start sending patches!
|
||||
|
||||
The License Issue
|
||||
|
||||
When contributing with code, you agree to put your changes and new code under
|
||||
@@ -21,6 +27,12 @@ The License Issue
|
||||
GPL (as we don't want the GPL virus to attack users of libcurl) but they must
|
||||
use "GPL compatible" licenses.
|
||||
|
||||
What To Read
|
||||
|
||||
Source code, the man pages, the INTERALS document, the TODO, the most recent
|
||||
CHANGES. Just lurking on the libcurl mailing list is gonna give you a lot of
|
||||
insights on what's going on right now.
|
||||
|
||||
Naming
|
||||
|
||||
Try using a non-confusing naming scheme for your new functions and variable
|
||||
@@ -87,7 +99,9 @@ Write Access to CVS Repository
|
||||
If you are a frequent contributor, or have another good reason, you can of
|
||||
course get write access to the CVS repository and then you'll be able to
|
||||
check-in all your changes straight into the CVS tree instead of sending all
|
||||
changes by mail as patches. Just ask if this is what you'd want.
|
||||
changes by mail as patches. Just ask if this is what you'd want. You will be
|
||||
required to have posted a few quality patches first, before you can be
|
||||
granted write access.
|
||||
|
||||
Test Cases
|
||||
|
||||
|
@@ -12,6 +12,7 @@ man_MANS = \
|
||||
curl_easy_init.3 \
|
||||
curl_easy_perform.3 \
|
||||
curl_easy_setopt.3 \
|
||||
curl_easy_duphandle.3 \
|
||||
curl_formparse.3 \
|
||||
curl_formadd.3 \
|
||||
curl_formfree.3 \
|
||||
@@ -39,6 +40,7 @@ HTMLPAGES = \
|
||||
curl_easy_init.html \
|
||||
curl_easy_perform.html \
|
||||
curl_easy_setopt.html \
|
||||
curl_easy_duphandle.html \
|
||||
curl_formadd.html \
|
||||
curl_formparse.html \
|
||||
curl_formfree.html \
|
||||
|
19
docs/TODO
19
docs/TODO
@@ -21,21 +21,12 @@ To do in a future release (random order):
|
||||
* Make the connect non-blocking so that timeouts work for connect in
|
||||
multi-threaded programs
|
||||
|
||||
* Add an interface that enables a user to select prefered SSL ciphers to use.
|
||||
|
||||
* Make curl deal with cookies better. libcurl should be able to maintain a
|
||||
"cookie jar". Updating it with cookies that is received, and using it to
|
||||
pass cookies to the servers that have matching cookies in the jar.
|
||||
http://curl.haxx.se/dev/cookie-jar.txt
|
||||
|
||||
* Consider an interface to libcurl that allows applications to easier get to
|
||||
know what cookies that are sent back in the response headers.
|
||||
|
||||
* Make SSL session ids get used if multiple HTTPS documents from the same
|
||||
host is requested. http://curl.haxx.se/dev/SSL_session_id.txt
|
||||
|
||||
* HTTP PUT for files passed on stdin. Requires libcurl to send the file
|
||||
with chunked content encoding. http://curl.haxx.se/dev/HTTP-PUT-stdin.txt
|
||||
* HTTP PUT for files passed on stdin *OR* when the --crlf option is
|
||||
used. Requires libcurl to send the file with chunked content
|
||||
encoding. http://curl.haxx.se/dev/HTTP-PUT-stdin.txt
|
||||
|
||||
* Introduce another callback interface for upload/download that makes one
|
||||
less copy of data and thus a faster operation.
|
||||
@@ -57,10 +48,6 @@ To do in a future release (random order):
|
||||
|
||||
* Make TELNET work on windows!
|
||||
|
||||
* Add a command line option that allows the output file to get the same time
|
||||
stamp as the remote file. libcurl already is capable of fetching the remote
|
||||
file's date.
|
||||
|
||||
* Make curl's SSL layer option capable of using other free SSL libraries.
|
||||
Such as the Mozilla Security Services
|
||||
(http://www.mozilla.org/projects/security/pki/nss/) and GNUTLS
|
||||
|
37
docs/curl.1
37
docs/curl.1
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man curl.1
|
||||
.\" Written by Daniel Stenberg
|
||||
.\"
|
||||
.TH curl 1 "16 Aug 2001" "Curl 7.8.1" "Curl Manual"
|
||||
.TH curl 1 "12 Sep 2001" "Curl 7.9" "Curl Manual"
|
||||
.SH NAME
|
||||
curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
|
||||
HTTPS syntax.
|
||||
@@ -91,6 +91,12 @@ also be enforced by using an URL that ends with ";type=A". This option causes
|
||||
data sent to stdout to be in text mode for win32 systems.
|
||||
|
||||
If this option is used twice, the second one will disable ASCII usage.
|
||||
.IP "--ciphers <list of ciphers>"
|
||||
(SSL) Specifies which ciphers to use in the connection. The list of ciphers
|
||||
must be using valid ciphers. Read up on SSL cipher list details on this URL:
|
||||
.I http://www.openssl.org/docs/apps/ciphers.html (Option added in curl 7.9)
|
||||
|
||||
If this option is used severl times, the last one will override the others.
|
||||
.IP "--connect-timeout <seconds>"
|
||||
Maximum time in seconds that you allow the connection to the server to take.
|
||||
This only limits the connection phase, once curl has connected this option is
|
||||
@@ -100,15 +106,16 @@ also the
|
||||
option.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "-c/--continue"
|
||||
.B Deprecated. Use '-C -' instead.
|
||||
Continue/Resume a previous file transfer. This instructs curl to
|
||||
continue appending data on the file where it was previously left,
|
||||
possibly because of a broken connection to the server. There must be
|
||||
a named physical file to append to for this to work.
|
||||
Note: Upload resume is depening on a command named SIZE not always
|
||||
present in all ftp servers! Upload resume is for FTP only.
|
||||
HTTP resume is only possible with HTTP/1.1 or later servers.
|
||||
.IP "-c/--cookie-jar <file name>"
|
||||
Specify to which file you want curl to write all cookies after a completed
|
||||
operation. Curl writes all cookies previously read from a specified file as
|
||||
well as all cookies received from remote server(s). If no cookies are known,
|
||||
no file will be written. The file will be written using the Netscape cookie
|
||||
file format. If you set the file name to a single dash, "-", the cookies will
|
||||
be written to stdout. (Option added in curl 7.9)
|
||||
|
||||
If this option is used several times, the last specfied file name will be
|
||||
used.
|
||||
.IP "-C/--continue-at <offset>"
|
||||
Continue/Resume a previous file transfer at the given offset. The
|
||||
given offset is the exact number of bytes that will be skipped
|
||||
@@ -237,7 +244,7 @@ added in curl 7.6)
|
||||
When used, this option will make all data specified with -d/--data or
|
||||
--data-binary to be used in a HTTP GET request instead of the POST request
|
||||
that otherwise would be used. The data will be appended to the URL with a '?'
|
||||
separator.
|
||||
separator. (Option added in curl 7.9)
|
||||
.IP "-h/--help"
|
||||
Usage help.
|
||||
.IP "-H/--header <header>"
|
||||
@@ -324,6 +331,8 @@ file in the user's home directory for login name and password. This is
|
||||
typically used for ftp on unix. If used with http, curl will enable user
|
||||
authentication. See
|
||||
.BR netrc(4)
|
||||
or
|
||||
.BR ftp(1)
|
||||
for details on the file format. Curl will not complain if that file
|
||||
hasn't the right permissions (it should not be world nor group
|
||||
readable). The environment variable "HOME" is used to find the home
|
||||
@@ -452,6 +461,12 @@ FTP range downloads only support the simple syntax 'start-stop' (optionally
|
||||
with one of the numbers omitted). It depends on the non-RFC command SIZE.
|
||||
|
||||
If this option is used several times, the last one will be used.
|
||||
.IP "-R/--remote-time"
|
||||
When used, this will make libcurl attempt to figure out the timestamp of the
|
||||
remote file, and if that is available make the local file get that same
|
||||
timestamp.
|
||||
|
||||
If this option is used twice, the second time disables this again.
|
||||
.IP "-s/--silent"
|
||||
Silent mode. Don't show progress meter or error messages. Makes
|
||||
Curl mute.
|
||||
|
37
docs/curl_easy_duphandle.3
Normal file
37
docs/curl_easy_duphandle.3
Normal file
@@ -0,0 +1,37 @@
|
||||
.\" You can view this file with:
|
||||
.\" nroff -man [file]
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_easy_duphandle 3 "18 September 2001" "libcurl 7.9" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_duphandle - Clone a libcurl session handle
|
||||
.SH SYNOPSIS
|
||||
.B #include <curl/curl.h>
|
||||
.sp
|
||||
.BI "CURL *curl_easy_duphandle(CURL *"handle ");"
|
||||
.ad
|
||||
.SH DESCRIPTION
|
||||
This function will return a new curl handle, a duplicate, using all the
|
||||
options previously set in the input curl \fIhandle\fP. Both handles can
|
||||
subsequently be used independently and they must both be freed with
|
||||
\fIcurl_easy_cleanup()\fP.
|
||||
|
||||
All strings that the input handle has been told to point to (as opposed to
|
||||
copy) with previous calls to \fIcurl_easy_setopt\fP using char * inputs, will
|
||||
be pointed to by the new handle as well. You must therefore make sure to keep
|
||||
the data around until both handles have been cleaned up.
|
||||
|
||||
The new handle will \fBnot\fP inherit any state information, no connections,
|
||||
no SSL sessions and no cookies.
|
||||
|
||||
\fBNote\fP that even in multi-threaded programs, this function must be called
|
||||
in a synchronous way, the input handle may not be in use when cloned.
|
||||
|
||||
This function was added in libcurl 7.9.
|
||||
.SH RETURN VALUE
|
||||
If this function returns NULL, something went wrong and no valid handle was
|
||||
returned.
|
||||
.SH "SEE ALSO"
|
||||
.BR curl_easy_init "(3)," curl_easy_cleanup "(3)," curl_global_init "(3)
|
||||
.SH BUGS
|
||||
Surely there are some, you tell me!
|
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man [file]
|
||||
.\" $Id$
|
||||
.\"
|
||||
.TH curl_easy_setopt 3 "22 August 2001" "libcurl 7.8.1" "libcurl Manual"
|
||||
.TH curl_easy_setopt 3 "12 Sep 2001" "libcurl 7.9" "libcurl Manual"
|
||||
.SH NAME
|
||||
curl_easy_setopt - Set curl easy-session options
|
||||
.SH SYNOPSIS
|
||||
@@ -515,6 +515,24 @@ previously using the same curl handle. (Added in 7.8.1)
|
||||
Pass a long. Set if we should verify the Common name from the peer certificate
|
||||
in the SSL handshake, set 1 to check existence, 2 to ensure that it matches
|
||||
the provided hostname. (Added in 7.8.1)
|
||||
.TP
|
||||
.B CURLOPT_COOKIEJAR
|
||||
Pass a file name as char *, zero terminated. This will make libcurl dump all
|
||||
internally known cookies to the specified file when curl_easy_cleanup() is
|
||||
called. If no cookies are known, no file will be created. Specify "-" to
|
||||
instead have the cookies written to stdout.
|
||||
.TP
|
||||
.B CURLOPT_SSL_CIPHER_LIST
|
||||
Pass a char *, pointing to a zero terminated string holding the list of
|
||||
ciphers to use for the SSL connection. The list must be syntactly correct, it
|
||||
consists of one or more cipher strings separated by colons. Commas or spaces
|
||||
are also acceptable separators but colons are normally used, \!, \- and \+ can
|
||||
be used as operators. Valid examples of cipher lists include 'RC4-SHA',
|
||||
\'SHA1+DES\', 'TLSv1' and 'DEFAULT'. The default list is normally set when you
|
||||
compile OpenSSL.
|
||||
|
||||
You'll find all details about cipher lists on this URL:
|
||||
.I http://www.openssl.org/docs/apps/ciphers.html
|
||||
.PP
|
||||
.SH RETURN VALUE
|
||||
0 means the option was set properly, non-zero means an error as
|
||||
|
@@ -6,7 +6,7 @@ AUTOMAKE_OPTIONS = foreign no-dependencies
|
||||
|
||||
EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit.c postit2.c \
|
||||
win32sockets.c persistant.c ftpget.c Makefile.example \
|
||||
multithread.c getinmemory.c ftpupload.c
|
||||
multithread.c getinmemory.c ftpupload.c httpput.c
|
||||
|
||||
all:
|
||||
@echo "done"
|
||||
|
100
docs/examples/httpput.c
Normal file
100
docs/examples/httpput.c
Normal file
@@ -0,0 +1,100 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* $Id$
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
/*
|
||||
* This example shows a HTTP PUT operation. PUTs a file given as a command
|
||||
* line argument to the URL also given on the command line.
|
||||
*
|
||||
* This example also uses its own read callback.
|
||||
*/
|
||||
|
||||
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||
{
|
||||
size_t retcode;
|
||||
|
||||
/* in real-world cases, this would probably get this data differently
|
||||
as this fread() stuff is exactly what the library already would do
|
||||
by default internally */
|
||||
retcode = fread(ptr, size, nmemb, stream);
|
||||
|
||||
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
CURL *curl;
|
||||
CURLcode res;
|
||||
FILE *ftpfile;
|
||||
FILE * hd_src ;
|
||||
int hd ;
|
||||
struct stat file_info;
|
||||
|
||||
char *file;
|
||||
char *url;
|
||||
|
||||
if(argc < 3)
|
||||
return 1;
|
||||
|
||||
file= argv[1];
|
||||
url = argv[2];
|
||||
|
||||
/* get the file size of the local file */
|
||||
hd = open(file, O_RDONLY) ;
|
||||
fstat(hd, &file_info);
|
||||
close(hd) ;
|
||||
|
||||
/* get a FILE * of the same file, could also be made with
|
||||
fdopen() from the previous descriptor, but hey this is just
|
||||
an example! */
|
||||
hd_src = fopen(file, "rb");
|
||||
|
||||
/* In windows, this will init the winsock stuff */
|
||||
curl_global_init(CURL_GLOBAL_ALL);
|
||||
|
||||
/* get a curl handle */
|
||||
curl = curl_easy_init();
|
||||
if(curl) {
|
||||
/* we want to use our own read function */
|
||||
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||
|
||||
/* enable uploading */
|
||||
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ;
|
||||
|
||||
/* HTTP PUT please */
|
||||
curl_easy_setopt(curl, CURLOPT_PUT, TRUE);
|
||||
|
||||
/* specify target */
|
||||
curl_easy_setopt(curl,CURLOPT_URL, url);
|
||||
|
||||
/* now specify which file to upload */
|
||||
curl_easy_setopt(curl, CURLOPT_INFILE, hd_src);
|
||||
|
||||
/* and give the size of the upload (optional) */
|
||||
curl_easy_setopt(curl, CURLOPT_INFILESIZE, file_info.st_size);
|
||||
|
||||
/* Now run off and do what you've been told! */
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
/* always cleanup */
|
||||
curl_easy_cleanup(curl);
|
||||
}
|
||||
fclose(hd_src); /* close the local file */
|
||||
|
||||
curl_global_cleanup();
|
||||
return 0;
|
||||
}
|
@@ -458,6 +458,9 @@ typedef enum {
|
||||
operation. Set file name to "-" (dash) to make it go to stdout. */
|
||||
CINIT(COOKIEJAR, OBJECTPOINT, 82),
|
||||
|
||||
/* Specify which SSL ciphers to use */
|
||||
CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83),
|
||||
|
||||
CURLOPT_LASTENTRY /* the last unusued */
|
||||
} CURLoption;
|
||||
|
||||
@@ -545,8 +548,8 @@ CURLcode curl_global_init(long flags);
|
||||
void curl_global_cleanup(void);
|
||||
|
||||
/* This is the version number */
|
||||
#define LIBCURL_VERSION "7.8.2-pre1"
|
||||
#define LIBCURL_VERSION_NUM 0x070802
|
||||
#define LIBCURL_VERSION "7.9"
|
||||
#define LIBCURL_VERSION_NUM 0x070900
|
||||
|
||||
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
||||
struct curl_slist {
|
||||
|
@@ -46,6 +46,21 @@ void curl_easy_cleanup(CURL *curl);
|
||||
*/
|
||||
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
||||
|
||||
|
||||
/*
|
||||
* NAME curl_easy_duphandle()
|
||||
*
|
||||
* DESCRIPTION
|
||||
*
|
||||
* Creates a new curl session handle with the same options set for the handle
|
||||
* passed in. Duplicating a handle could only be a matter of cloning data and
|
||||
* options, internal state info and things like persistant connections cannot
|
||||
* be transfered. It is useful in multithreaded applications when you can run
|
||||
* curl_easy_duphandle() for each new thread to avoid a series of identical
|
||||
* curl_easy_setopt() invokes in every thread.
|
||||
*/
|
||||
CURL* curl_easy_duphandle(CURL *curl);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
8
java/MANIFEST
Normal file
8
java/MANIFEST
Normal file
@@ -0,0 +1,8 @@
|
||||
CurlGlue.java
|
||||
CurlWrite.java
|
||||
define2java.pl
|
||||
javacurl.c
|
||||
Makefile
|
||||
README
|
||||
test.java
|
||||
MANIFEST
|
@@ -13,3 +13,5 @@ stuff supported.
|
||||
The interface is not set yet, bring your suggestions!
|
||||
|
||||
Feel free to grab the source files in here and help out!
|
||||
|
||||
The 'test.java' is the actual program that uses the curl stuff.
|
||||
|
@@ -1,3 +1,25 @@
|
||||
/*****************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the MPL or the MIT/X-derivate
|
||||
* licenses. You may pick one of these licenses.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
|
||||
#include <curl/curl.h> /* libcurl header */
|
||||
#include "CurlGlue.h" /* the JNI-generated glue header file */
|
||||
|
@@ -29,7 +29,7 @@ LINKRS = link.exe -lib /out:$(PROGRAM_NAME) /LIBPATH:$(OPENSSL_PATH)/out32dll
|
||||
|
||||
CFLAGS = /I "../include" /nologo /W3 /GX /D "WIN32" /D "VC6" /D "_MBCS" /D "_LIB" /YX /FD /c /D "MSDOS"
|
||||
LFLAGS = /nologo
|
||||
LINKLIBS = wsock32.lib
|
||||
LINKLIBS = ws2_32.lib
|
||||
LINKSLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
||||
|
||||
RELEASE_OBJS= \
|
||||
|
@@ -260,3 +260,11 @@ void *suck(int *lenptr) {
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
10
lib/cookie.c
10
lib/cookie.c
@@ -600,7 +600,7 @@ int Curl_cookie_output(struct CookieInfo *c, char *dumphere)
|
||||
FILE *out;
|
||||
bool use_stdout=FALSE;
|
||||
|
||||
if(0 == c->numcookies)
|
||||
if((NULL == c) || (0 == c->numcookies))
|
||||
/* If there are no known cookies, we don't write or even create any
|
||||
destination file */
|
||||
return 0;
|
||||
@@ -676,3 +676,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
10
lib/dict.c
10
lib/dict.c
@@ -90,7 +90,7 @@ CURLcode Curl_dict(struct connectdata *conn)
|
||||
char *nthdef = NULL; /* This is not part of the protocol, but required
|
||||
by RFC 2229 */
|
||||
CURLcode result=CURLE_OK;
|
||||
struct UrlData *data=conn->data;
|
||||
struct SessionHandle *data=conn->data;
|
||||
|
||||
char *path = conn->path;
|
||||
long *bytecount = &conn->bytecount;
|
||||
@@ -232,3 +232,11 @@ CURLcode Curl_dict(struct connectdata *conn)
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -82,3 +82,11 @@ DllMain (
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
92
lib/easy.c
92
lib/easy.c
@@ -94,7 +94,7 @@ static CURLcode win32_init(void)
|
||||
WORD wVersionRequested;
|
||||
WSADATA wsaData;
|
||||
int err;
|
||||
wVersionRequested = MAKEWORD(1, 1);
|
||||
wVersionRequested = MAKEWORD(2, 0);
|
||||
|
||||
err = WSAStartup(wVersionRequested, &wsaData);
|
||||
|
||||
@@ -103,14 +103,14 @@ static CURLcode win32_init(void)
|
||||
/* winsock.dll. */
|
||||
return CURLE_FAILED_INIT;
|
||||
|
||||
/* Confirm that the Windows Sockets DLL supports 1.1.*/
|
||||
/* Confirm that the Windows Sockets DLL supports 2.0.*/
|
||||
/* Note that if the DLL supports versions greater */
|
||||
/* than 1.1 in addition to 1.1, it will still return */
|
||||
/* 1.1 in wVersion since that is the version we */
|
||||
/* than 2.0 in addition to 2.0, it will still return */
|
||||
/* 2.0 in wVersion since that is the version we */
|
||||
/* requested. */
|
||||
|
||||
if ( LOBYTE( wsaData.wVersion ) != 1 ||
|
||||
HIBYTE( wsaData.wVersion ) != 1 ) {
|
||||
if ( LOBYTE( wsaData.wVersion ) != 2 ||
|
||||
HIBYTE( wsaData.wVersion ) != 0 ) {
|
||||
/* Tell the user that we couldn't find a useable */
|
||||
|
||||
/* winsock.dll. */
|
||||
@@ -175,7 +175,7 @@ void curl_global_cleanup(void)
|
||||
CURL *curl_easy_init(void)
|
||||
{
|
||||
CURLcode res;
|
||||
struct UrlData *data;
|
||||
struct SessionHandle *data;
|
||||
|
||||
/* Make sure we inited the global SSL stuff */
|
||||
if (!initialized)
|
||||
@@ -186,9 +186,6 @@ CURL *curl_easy_init(void)
|
||||
if(res != CURLE_OK)
|
||||
return NULL;
|
||||
|
||||
/* SAC */
|
||||
data->device = NULL;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -199,7 +196,7 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
||||
func_T param_func = (func_T)0;
|
||||
long param_long = 0;
|
||||
void *param_obj = NULL;
|
||||
struct UrlData *data = curl;
|
||||
struct SessionHandle *data = curl;
|
||||
|
||||
va_start(arg, tag);
|
||||
|
||||
@@ -231,14 +228,14 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
||||
|
||||
CURLcode curl_easy_perform(CURL *curl)
|
||||
{
|
||||
struct UrlData *data = (struct UrlData *)curl;
|
||||
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||
|
||||
return Curl_perform(data);
|
||||
}
|
||||
|
||||
void curl_easy_cleanup(CURL *curl)
|
||||
{
|
||||
struct UrlData *data = (struct UrlData *)curl;
|
||||
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||
Curl_close(data);
|
||||
}
|
||||
|
||||
@@ -246,10 +243,77 @@ CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...)
|
||||
{
|
||||
va_list arg;
|
||||
void *paramp;
|
||||
struct UrlData *data = (struct UrlData *)curl;
|
||||
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||
|
||||
va_start(arg, info);
|
||||
paramp = va_arg(arg, void *);
|
||||
|
||||
return Curl_getinfo(data, info, paramp);
|
||||
}
|
||||
|
||||
CURL *curl_easy_duphandle(CURL *incurl)
|
||||
{
|
||||
struct SessionHandle *data=(struct SessionHandle *)incurl;
|
||||
|
||||
struct SessionHandle *outcurl = (struct SessionHandle *)
|
||||
malloc(sizeof(struct SessionHandle));
|
||||
|
||||
if(NULL == outcurl)
|
||||
return NULL; /* failure */
|
||||
|
||||
/* start with clearing the entire new struct */
|
||||
memset(outcurl, 0, sizeof(struct SessionHandle));
|
||||
|
||||
/*
|
||||
* We setup a few buffers we need. We should probably make them
|
||||
* get setup on-demand in the code, as that would probably decrease
|
||||
* the likeliness of us forgetting to init a buffer here in the future.
|
||||
*/
|
||||
outcurl->state.headerbuff=(char*)malloc(HEADERSIZE);
|
||||
if(!outcurl->state.headerbuff) {
|
||||
free(outcurl); /* free the memory again */
|
||||
return NULL;
|
||||
}
|
||||
outcurl->state.headersize=HEADERSIZE;
|
||||
|
||||
/* copy all userdefined values */
|
||||
outcurl->set = data->set;
|
||||
outcurl->state.numconnects = data->state.numconnects;
|
||||
outcurl->state.connects = (struct connectdata **)
|
||||
malloc(sizeof(struct connectdata *) * outcurl->state.numconnects);
|
||||
|
||||
if(!outcurl->state.connects) {
|
||||
free(outcurl->state.headerbuff);
|
||||
free(outcurl);
|
||||
return NULL;
|
||||
}
|
||||
memset(outcurl->state.connects, 0,
|
||||
sizeof(struct connectdata *)*outcurl->state.numconnects);
|
||||
|
||||
outcurl->progress.flags = data->progress.flags;
|
||||
outcurl->progress.callback = data->progress.callback;
|
||||
|
||||
/* duplicate all values in 'change' */
|
||||
if(data->change.url) {
|
||||
outcurl->change.url = strdup(data->change.url);
|
||||
outcurl->change.url_alloc = TRUE;
|
||||
}
|
||||
if(data->change.proxy) {
|
||||
outcurl->change.proxy = strdup(data->change.proxy);
|
||||
outcurl->change.proxy_alloc = TRUE;
|
||||
}
|
||||
if(data->change.referer) {
|
||||
outcurl->change.referer = strdup(data->change.referer);
|
||||
outcurl->change.referer_alloc = TRUE;
|
||||
}
|
||||
|
||||
return outcurl;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -110,3 +110,11 @@ char *curl_unescape(const char *string, int length)
|
||||
return ns;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
12
lib/file.c
12
lib/file.c
@@ -142,8 +142,8 @@ CURLcode Curl_file(struct connectdata *conn)
|
||||
struct stat statbuf;
|
||||
ssize_t expected_size=-1;
|
||||
ssize_t nread;
|
||||
struct UrlData *data = conn->data;
|
||||
char *buf = data->buffer;
|
||||
struct SessionHandle *data = conn->data;
|
||||
char *buf = data->state.buffer;
|
||||
int bytecount = 0;
|
||||
struct timeval start = Curl_tvnow();
|
||||
struct timeval now = start;
|
||||
@@ -196,3 +196,11 @@ CURLcode Curl_file(struct connectdata *conn)
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -1322,3 +1322,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
180
lib/ftp.c
180
lib/ftp.c
@@ -98,7 +98,7 @@ static CURLcode _ftp_cwd(struct connectdata *conn, char *path);
|
||||
/* easy-to-use macro: */
|
||||
#define ftpsendf Curl_ftpsendf
|
||||
|
||||
static CURLcode AllowServerConnect(struct UrlData *data,
|
||||
static CURLcode AllowServerConnect(struct SessionHandle *data,
|
||||
struct connectdata *conn,
|
||||
int sock)
|
||||
{
|
||||
@@ -178,7 +178,7 @@ int Curl_GetFTPResponse(int sockfd,
|
||||
struct timeval interval;
|
||||
fd_set rkeepfd;
|
||||
fd_set readfd;
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
char *line_start;
|
||||
int code=0; /* default "error code" to return */
|
||||
|
||||
@@ -190,9 +190,9 @@ int Curl_GetFTPResponse(int sockfd,
|
||||
if (ftpcode)
|
||||
*ftpcode = 0; /* 0 for errors */
|
||||
|
||||
if(data->timeout) {
|
||||
if(data->set.timeout) {
|
||||
/* if timeout is requested, find out how much remaining time we have */
|
||||
timeout = data->timeout - /* timeout time */
|
||||
timeout = data->set.timeout - /* timeout time */
|
||||
(Curl_tvlong(Curl_tvnow()) - Curl_tvlong(conn->now)); /* spent time */
|
||||
if(timeout <=0 ) {
|
||||
failf(data, "Transfer aborted due to timeout");
|
||||
@@ -255,9 +255,9 @@ int Curl_GetFTPResponse(int sockfd,
|
||||
the line isn't really terminated until the LF comes */
|
||||
|
||||
/* output debug output if that is requested */
|
||||
if(data->bits.verbose) {
|
||||
fputs("< ", data->err);
|
||||
fwrite(line_start, perline, 1, data->err);
|
||||
if(data->set.verbose) {
|
||||
fputs("< ", data->set.err);
|
||||
fwrite(line_start, perline, 1, data->set.err);
|
||||
/* no need to output LF here, it is part of the data */
|
||||
}
|
||||
|
||||
@@ -339,8 +339,8 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
||||
{
|
||||
/* this is FTP and no proxy */
|
||||
int nread;
|
||||
struct UrlData *data=conn->data;
|
||||
char *buf = data->buffer; /* this is our buffer */
|
||||
struct SessionHandle *data=conn->data;
|
||||
char *buf = data->state.buffer; /* this is our buffer */
|
||||
struct FTP *ftp;
|
||||
CURLcode result;
|
||||
int ftpcode;
|
||||
@@ -360,11 +360,11 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
||||
/* get some initial data into the ftp struct */
|
||||
ftp->bytecountp = &conn->bytecount;
|
||||
|
||||
/* duplicate to keep them even when the data struct changes */
|
||||
ftp->user = strdup(data->user);
|
||||
ftp->passwd = strdup(data->passwd);
|
||||
/* no need to duplicate them, the data struct won't change */
|
||||
ftp->user = data->state.user;
|
||||
ftp->passwd = data->state.passwd;
|
||||
|
||||
if (data->bits.tunnel_thru_httpproxy) {
|
||||
if (data->set.tunnel_thru_httpproxy) {
|
||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
||||
conn->hostname, conn->remote_port);
|
||||
@@ -393,14 +393,14 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
||||
|
||||
#ifdef KRB4
|
||||
/* if not anonymous login, try a secure login */
|
||||
if(data->bits.krb4) {
|
||||
if(data->set.krb4) {
|
||||
|
||||
/* request data protection level (default is 'clear') */
|
||||
Curl_sec_request_prot(conn, "private");
|
||||
|
||||
/* We set private first as default, in case the line below fails to
|
||||
set a valid level */
|
||||
Curl_sec_request_prot(conn, data->krb4_level);
|
||||
Curl_sec_request_prot(conn, data->set.krb4_level);
|
||||
|
||||
if(Curl_sec_login(conn) != 0)
|
||||
infof(data, "Logging in with password in cleartext!\n");
|
||||
@@ -462,7 +462,7 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
||||
/* we may need to issue a KAUTH here to have access to the files
|
||||
* do it if user supplied a password
|
||||
*/
|
||||
if(conn->data->passwd && *conn->data->passwd)
|
||||
if(data->state.passwd && *data->state.passwd)
|
||||
Curl_krb_kauth(conn);
|
||||
#endif
|
||||
}
|
||||
@@ -530,27 +530,27 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
||||
/* argument is already checked for validity */
|
||||
CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||
{
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct FTP *ftp = conn->proto.ftp;
|
||||
ssize_t nread;
|
||||
char *buf = data->buffer; /* this is our buffer */
|
||||
char *buf = data->state.buffer; /* this is our buffer */
|
||||
int ftpcode;
|
||||
|
||||
if(data->bits.upload) {
|
||||
if((-1 != data->infilesize) && (data->infilesize != *ftp->bytecountp)) {
|
||||
if(data->set.upload) {
|
||||
if((-1 != data->set.infilesize) && (data->set.infilesize != *ftp->bytecountp)) {
|
||||
failf(data, "Wrote only partial file (%d out of %d bytes)",
|
||||
*ftp->bytecountp, data->infilesize);
|
||||
*ftp->bytecountp, data->set.infilesize);
|
||||
return CURLE_PARTIAL_FILE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if((-1 != conn->size) && (conn->size != *ftp->bytecountp) &&
|
||||
(conn->maxdownload != *ftp->bytecountp)) {
|
||||
failf(data, "Received only partial file");
|
||||
failf(data, "Received only partial file: %d bytes", *ftp->bytecountp);
|
||||
return CURLE_PARTIAL_FILE;
|
||||
}
|
||||
else if(!conn->bits.resume_done &&
|
||||
!data->bits.no_body &&
|
||||
!data->set.no_body &&
|
||||
(0 == *ftp->bytecountp)) {
|
||||
failf(data, "No data was received!");
|
||||
return CURLE_FTP_COULDNT_RETR_FILE;
|
||||
@@ -564,7 +564,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||
sclose(conn->secondarysocket);
|
||||
conn->secondarysocket = -1;
|
||||
|
||||
if(!data->bits.no_body && !conn->bits.resume_done) {
|
||||
if(!data->set.no_body && !conn->bits.resume_done) {
|
||||
/* now let's see what the server says about the transfer we
|
||||
just performed: */
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
|
||||
@@ -581,8 +581,8 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||
conn->bits.resume_done = FALSE; /* clean this for next connection */
|
||||
|
||||
/* Send any post-transfer QUOTE strings? */
|
||||
if(data->postquote) {
|
||||
CURLcode result = _ftp_sendquote(conn, data->postquote);
|
||||
if(data->set.postquote) {
|
||||
CURLcode result = _ftp_sendquote(conn, data->set.postquote);
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -603,7 +603,7 @@ CURLcode _ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
|
||||
ftpsendf(conn->firstsocket, conn, "%s", item->data);
|
||||
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||
conn->data->buffer, conn, &ftpcode);
|
||||
conn->data->state.buffer, conn, &ftpcode);
|
||||
if (nread < 0)
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
|
||||
@@ -627,12 +627,12 @@ CURLcode _ftp_cwd(struct connectdata *conn, char *path)
|
||||
|
||||
ftpsendf(conn->firstsocket, conn, "CWD %s", path);
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||
conn->data->buffer, conn, &ftpcode);
|
||||
conn->data->state.buffer, conn, &ftpcode);
|
||||
if (nread < 0)
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
|
||||
if (ftpcode != 250) {
|
||||
failf(conn->data, "Couldn't change back to directory %s", path);
|
||||
failf(conn->data, "Couldn't cd to %s", path);
|
||||
return CURLE_FTP_ACCESS_DENIED;
|
||||
}
|
||||
|
||||
@@ -645,7 +645,7 @@ CURLcode _ftp_getfiletime(struct connectdata *conn, char *file)
|
||||
CURLcode result=CURLE_OK;
|
||||
int ftpcode; /* for ftp status */
|
||||
ssize_t nread;
|
||||
char *buf = conn->data->buffer;
|
||||
char *buf = conn->data->state.buffer;
|
||||
|
||||
/* we have requested to get the modified-time of the file, this is yet
|
||||
again a grey area as the MDTM is not kosher RFC959 */
|
||||
@@ -666,7 +666,7 @@ CURLcode _ftp_getfiletime(struct connectdata *conn, char *file)
|
||||
sprintf(buf, "%04d%02d%02d %02d:%02d:%02d",
|
||||
year, month, day, hour, minute, second);
|
||||
/* now, convert this into a time() value: */
|
||||
conn->data->progress.filetime = curl_getdate(buf, &secs);
|
||||
conn->data->info.filetime = curl_getdate(buf, &secs);
|
||||
}
|
||||
else {
|
||||
infof(conn->data, "unsupported MDTM reply format\n");
|
||||
@@ -678,10 +678,10 @@ CURLcode _ftp_getfiletime(struct connectdata *conn, char *file)
|
||||
static CURLcode _ftp_transfertype(struct connectdata *conn,
|
||||
bool ascii)
|
||||
{
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
int ftpcode;
|
||||
ssize_t nread;
|
||||
char *buf=data->buffer;
|
||||
char *buf=data->state.buffer;
|
||||
|
||||
ftpsendf(conn->firstsocket, conn, "TYPE %s", ascii?"A":"I");
|
||||
|
||||
@@ -702,10 +702,10 @@ static
|
||||
CURLcode _ftp_getsize(struct connectdata *conn, char *file,
|
||||
ssize_t *size)
|
||||
{
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
int ftpcode;
|
||||
ssize_t nread;
|
||||
char *buf=data->buffer;
|
||||
char *buf=data->state.buffer;
|
||||
|
||||
ftpsendf(conn->firstsocket, conn, "SIZE %s", file);
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
|
||||
@@ -729,8 +729,8 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
/* this is FTP and no proxy */
|
||||
ssize_t nread;
|
||||
CURLcode result;
|
||||
struct UrlData *data=conn->data;
|
||||
char *buf = data->buffer; /* this is our buffer */
|
||||
struct SessionHandle *data=conn->data;
|
||||
char *buf = data->state.buffer; /* this is our buffer */
|
||||
/* for the ftp PORT mode */
|
||||
int portsock=-1;
|
||||
#if defined (HAVE_INET_NTOA_R)
|
||||
@@ -750,8 +750,8 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
int ftpcode; /* for ftp status */
|
||||
|
||||
/* Send any QUOTE strings? */
|
||||
if(data->quote) {
|
||||
if ((result = _ftp_sendquote(conn, data->quote)) != CURLE_OK)
|
||||
if(data->set.quote) {
|
||||
if ((result = _ftp_sendquote(conn, data->set.quote)) != CURLE_OK)
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -770,7 +770,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
}
|
||||
|
||||
/* Requested time of file? */
|
||||
if(data->bits.get_filetime && ftp->file) {
|
||||
if(data->set.get_filetime && ftp->file) {
|
||||
result = _ftp_getfiletime(conn, ftp->file);
|
||||
if(result)
|
||||
return result;
|
||||
@@ -778,7 +778,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
|
||||
/* If we have selected NOBODY, it means that we only want file information.
|
||||
Which in FTP can't be much more than the file size! */
|
||||
if(data->bits.no_body) {
|
||||
if(data->set.no_body) {
|
||||
/* The SIZE command is _not_ RFC 959 specified, and therefor many servers
|
||||
may not support it! It is however the only way we have to get a file's
|
||||
size! */
|
||||
@@ -786,7 +786,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
|
||||
/* Some servers return different sizes for different modes, and thus we
|
||||
must set the proper type before we check the size */
|
||||
result = _ftp_transfertype(conn, data->bits.ftp_ascii);
|
||||
result = _ftp_transfertype(conn, data->set.ftp_ascii);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
@@ -804,13 +804,13 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
well, we "emulate" a HTTP-style header in our output. */
|
||||
|
||||
#ifdef HAVE_STRFTIME
|
||||
if(data->bits.get_filetime && data->progress.filetime) {
|
||||
if(data->set.get_filetime && data->info.filetime) {
|
||||
struct tm *tm;
|
||||
#ifdef HAVE_LOCALTIME_R
|
||||
struct tm buffer;
|
||||
tm = (struct tm *)localtime_r(&data->progress.filetime, &buffer);
|
||||
tm = (struct tm *)localtime_r(&data->info.filetime, &buffer);
|
||||
#else
|
||||
tm = localtime(&data->progress.filetime);
|
||||
tm = localtime(&data->info.filetime);
|
||||
#endif
|
||||
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
|
||||
strftime(buf, BUFSIZE-1, "Last-Modified: %a, %d %b %Y %H:%M:%S %Z\r\n",
|
||||
@@ -825,7 +825,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
}
|
||||
|
||||
/* We have chosen to use the PORT command */
|
||||
if(data->bits.ftp_use_port) {
|
||||
if(data->set.ftp_use_port) {
|
||||
#ifdef ENABLE_IPV6
|
||||
struct addrinfo hints, *res, *ai;
|
||||
struct sockaddr_storage ss;
|
||||
@@ -933,12 +933,14 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
if (getnameinfo((struct sockaddr *)&ss, sslen,
|
||||
portmsgbuf, sizeof(portmsgbuf), tmp, sizeof(tmp), niflags))
|
||||
continue;
|
||||
|
||||
/* do not transmit IPv6 scope identifier to the wire */
|
||||
if (sa->sa_family == AF_INET6) {
|
||||
char *q = strchr(portmsgbuf, '%');
|
||||
if (q)
|
||||
*q = '\0';
|
||||
}
|
||||
|
||||
ftpsendf(conn->firstsocket, conn, "%s |%d|%s|%s|", *modep, eprtaf,
|
||||
portmsgbuf, tmp);
|
||||
} else if (strcmp(*modep, "LPRT") == 0 ||
|
||||
@@ -957,26 +959,33 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < alen; i++) {
|
||||
if (portmsgbuf[0])
|
||||
snprintf(tmp, sizeof(tmp), ",%u", ap[i]);
|
||||
else
|
||||
snprintf(tmp, sizeof(tmp), "%u", ap[i]);
|
||||
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (strcmp(*modep, "LPRT") == 0) {
|
||||
snprintf(tmp, sizeof(tmp), ",%d", plen);
|
||||
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf))
|
||||
continue;
|
||||
}
|
||||
|
||||
for (i = 0; i < plen; i++) {
|
||||
snprintf(tmp, sizeof(tmp), ",%u", pp[i]);
|
||||
|
||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
ftpsendf(conn->firstsocket, conn, "%s %s", *modep, portmsgbuf);
|
||||
}
|
||||
|
||||
@@ -996,6 +1005,10 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
freeaddrinfo(res);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
/* we set the secondary socket variable to this for now, it
|
||||
is only so that the cleanup function will close it in case
|
||||
we fail before the true secondary stuff is made */
|
||||
conn->secondarysocket = portsock;
|
||||
|
||||
#else
|
||||
struct sockaddr_in sa;
|
||||
@@ -1005,15 +1018,15 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
unsigned short porttouse;
|
||||
char myhost[256] = "";
|
||||
|
||||
if(data->ftpport) {
|
||||
if(Curl_if2ip(data->ftpport, myhost, sizeof(myhost))) {
|
||||
if(data->set.ftpport) {
|
||||
if(Curl_if2ip(data->set.ftpport, myhost, sizeof(myhost))) {
|
||||
h = Curl_gethost(data, myhost, &hostdataptr);
|
||||
}
|
||||
else {
|
||||
if(strlen(data->ftpport)>1)
|
||||
h = Curl_gethost(data, data->ftpport, &hostdataptr);
|
||||
if(strlen(data->set.ftpport)>1)
|
||||
h = Curl_gethost(data, data->set.ftpport, &hostdataptr);
|
||||
if(h)
|
||||
strcpy(myhost, data->ftpport); /* buffer overflow risk */
|
||||
strcpy(myhost, data->set.ftpport); /* buffer overflow risk */
|
||||
}
|
||||
}
|
||||
if(! *myhost) {
|
||||
@@ -1165,6 +1178,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
break;
|
||||
str++;
|
||||
}
|
||||
|
||||
if(!*str) {
|
||||
failf(data, "Couldn't interpret this 227-reply: %s", buf);
|
||||
return CURLE_FTP_WEIRD_227_FORMAT;
|
||||
@@ -1172,7 +1186,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
|
||||
sprintf(newhost, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||
newport = (port[0]<<8) + port[1];
|
||||
if(data->bits.httpproxy) {
|
||||
if(data->change.proxy) {
|
||||
/*
|
||||
* This is a tunnel through a http proxy and we need to connect to the
|
||||
* proxy again here. We already have the name info for it since the
|
||||
@@ -1214,7 +1228,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
if (conn->secondarysocket < 0)
|
||||
continue;
|
||||
|
||||
if(data->bits.verbose) {
|
||||
if(data->set.verbose) {
|
||||
char hbuf[NI_MAXHOST];
|
||||
char nbuf[NI_MAXHOST];
|
||||
char sbuf[NI_MAXSERV];
|
||||
@@ -1228,6 +1242,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
snprintf(nbuf, sizeof(nbuf), "?");
|
||||
snprintf(sbuf, sizeof(sbuf), "?");
|
||||
}
|
||||
|
||||
if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
|
||||
NULL, 0, 0)) {
|
||||
infof(data, "Connecting to %s port %s\n", nbuf, sbuf);
|
||||
@@ -1258,7 +1273,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
|
||||
serv_addr.sin_port = htons(connectport);
|
||||
|
||||
if(data->bits.verbose) {
|
||||
if(data->set.verbose) {
|
||||
struct in_addr in;
|
||||
struct hostent * answer;
|
||||
|
||||
@@ -1346,7 +1361,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
}
|
||||
#endif /*ENABLE_IPV6*/
|
||||
|
||||
if (data->bits.tunnel_thru_httpproxy) {
|
||||
if (data->set.tunnel_thru_httpproxy) {
|
||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->secondarysocket,
|
||||
newhost, newport);
|
||||
@@ -1360,10 +1375,10 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
/* we have the (new) data connection ready */
|
||||
infof(data, "Connected the data stream!\n");
|
||||
|
||||
if(data->bits.upload) {
|
||||
if(data->set.upload) {
|
||||
|
||||
/* Set type to binary (unless specified ASCII) */
|
||||
result = _ftp_transfertype(conn, data->bits.ftp_ascii);
|
||||
result = _ftp_transfertype(conn, data->set.ftp_ascii);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
@@ -1395,7 +1410,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
/* do we still game? */
|
||||
int passed=0;
|
||||
/* enable append instead */
|
||||
data->bits.ftp_append = 1;
|
||||
data->set.ftp_append = 1;
|
||||
|
||||
/* Now, let's read off the proper amount of bytes from the
|
||||
input. If we knew it was a proper file we could've just
|
||||
@@ -1408,7 +1423,8 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
readthisamountnow = BUFSIZE;
|
||||
|
||||
actuallyread =
|
||||
data->fread(data->buffer, 1, readthisamountnow, data->in);
|
||||
data->set.fread(data->state.buffer, 1, readthisamountnow,
|
||||
data->set.in);
|
||||
|
||||
passed += actuallyread;
|
||||
if(actuallyread != readthisamountnow) {
|
||||
@@ -1419,10 +1435,10 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
while(passed != conn->resume_from);
|
||||
|
||||
/* now, decrease the size of the read */
|
||||
if(data->infilesize>0) {
|
||||
data->infilesize -= conn->resume_from;
|
||||
if(data->set.infilesize>0) {
|
||||
data->set.infilesize -= conn->resume_from;
|
||||
|
||||
if(data->infilesize <= 0) {
|
||||
if(data->set.infilesize <= 0) {
|
||||
infof(data, "File already completely uploaded\n");
|
||||
|
||||
/* no data to transfer */
|
||||
@@ -1440,8 +1456,8 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
}
|
||||
}
|
||||
|
||||
/* Send everything on data->in to the socket */
|
||||
if(data->bits.ftp_append)
|
||||
/* Send everything on data->set.in to the socket */
|
||||
if(data->set.ftp_append)
|
||||
/* we append onto the file instead of rewriting it */
|
||||
ftpsendf(conn->firstsocket, conn, "APPE %s", ftp->file);
|
||||
else
|
||||
@@ -1457,7 +1473,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
return CURLE_FTP_COULDNT_STOR_FILE;
|
||||
}
|
||||
|
||||
if(data->bits.ftp_use_port) {
|
||||
if(data->set.ftp_use_port) {
|
||||
/* PORT means we are now awaiting the server to connect to us. */
|
||||
result = AllowServerConnect(data, conn, portsock);
|
||||
if( result )
|
||||
@@ -1469,7 +1485,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
/* When we know we're uploading a specified file, we can get the file
|
||||
size prior to the actual upload. */
|
||||
|
||||
Curl_pgrsSetUploadSize(data, data->infilesize);
|
||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
||||
|
||||
result = Curl_Transfer(conn, -1, -1, FALSE, NULL, /* no download */
|
||||
conn->secondarysocket, bytecountp);
|
||||
@@ -1520,7 +1536,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
from, to, totalsize);
|
||||
}
|
||||
|
||||
if((data->bits.ftp_list_only) || !ftp->file) {
|
||||
if((data->set.ftp_list_only) || !ftp->file) {
|
||||
/* The specified path ends with a slash, and therefore we think this
|
||||
is a directory that is requested, use LIST. But before that we
|
||||
need to set ASCII transfer mode. */
|
||||
@@ -1536,12 +1552,12 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
standard in any way */
|
||||
|
||||
ftpsendf(conn->firstsocket, conn, "%s",
|
||||
data->customrequest?data->customrequest:
|
||||
(data->bits.ftp_list_only?"NLST":"LIST"));
|
||||
data->set.customrequest?data->set.customrequest:
|
||||
(data->set.ftp_list_only?"NLST":"LIST"));
|
||||
}
|
||||
else {
|
||||
/* Set type to binary (unless specified ASCII) */
|
||||
result = _ftp_transfertype(conn, data->bits.ftp_ascii);
|
||||
result = _ftp_transfertype(conn, data->set.ftp_ascii);
|
||||
if(result)
|
||||
return result;
|
||||
|
||||
@@ -1557,7 +1573,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
result = _ftp_getsize(conn, ftp->file, &foundsize);
|
||||
|
||||
if(CURLE_OK != result) {
|
||||
infof(data, "ftp server doesn't support SIZE");
|
||||
infof(data, "ftp server doesn't support SIZE\n");
|
||||
/* We couldn't get the size and therefore we can't know if there
|
||||
really is a part of the file left to get, although the server
|
||||
will just close the connection when we start the connection so it
|
||||
@@ -1647,7 +1663,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
int size=-1; /* default unknown size */
|
||||
|
||||
if(!dirlist &&
|
||||
!data->bits.ftp_ascii &&
|
||||
!data->set.ftp_ascii &&
|
||||
(-1 == downloadsize)) {
|
||||
/*
|
||||
* It seems directory listings either don't show the size or very
|
||||
@@ -1684,7 +1700,7 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
else if(downloadsize > -1)
|
||||
size = downloadsize;
|
||||
|
||||
if(data->bits.ftp_use_port) {
|
||||
if(data->set.ftp_use_port) {
|
||||
result = AllowServerConnect(data, conn, portsock);
|
||||
if( result )
|
||||
return result;
|
||||
@@ -1717,7 +1733,7 @@ CURLcode Curl_ftp(struct connectdata *conn)
|
||||
{
|
||||
CURLcode retcode;
|
||||
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct FTP *ftp;
|
||||
int dirlength=0; /* 0 forces strlen() */
|
||||
|
||||
@@ -1793,8 +1809,8 @@ size_t Curl_ftpsendf(int fd, struct connectdata *conn,
|
||||
vsnprintf(s, 250, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if(conn->data->bits.verbose)
|
||||
fprintf(conn->data->err, "> %s\n", s);
|
||||
if(conn->data->set.verbose)
|
||||
fprintf(conn->data->set.err, "> %s\n", s);
|
||||
|
||||
strcat(s, "\r\n"); /* append a trailing CRLF */
|
||||
|
||||
@@ -1811,12 +1827,16 @@ CURLcode Curl_ftp_disconnect(struct connectdata *conn)
|
||||
|
||||
/* The FTP session may or may not have been allocated/setup at this point! */
|
||||
if(ftp) {
|
||||
if(ftp->user)
|
||||
free(ftp->user);
|
||||
if(ftp->passwd)
|
||||
free(ftp->passwd);
|
||||
if(ftp->entrypath)
|
||||
free(ftp->entrypath);
|
||||
}
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -2126,3 +2126,11 @@ main (ac, av)
|
||||
/* NOTREACHED */
|
||||
}
|
||||
#endif /* defined (TEST) */
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -66,3 +66,11 @@ char *curl_getenv(const char *v)
|
||||
{
|
||||
return GetEnv(v);
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -35,22 +35,23 @@
|
||||
* This is supposed to be called in the beginning of a permform() session
|
||||
* and should reset all session-info variables
|
||||
*/
|
||||
CURLcode Curl_initinfo(struct UrlData *data)
|
||||
CURLcode Curl_initinfo(struct SessionHandle *data)
|
||||
{
|
||||
struct Progress *pro = &data->progress;
|
||||
struct PureInfo *info =&data->info;
|
||||
|
||||
pro->t_nslookup = 0;
|
||||
pro->t_connect = 0;
|
||||
pro->t_pretransfer = 0;
|
||||
|
||||
pro->httpcode = 0;
|
||||
pro->httpversion=0;
|
||||
pro->filetime=0;
|
||||
info->httpcode = 0;
|
||||
info->httpversion=0;
|
||||
info->filetime=0;
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
||||
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||
{
|
||||
va_list arg;
|
||||
long *param_longp;
|
||||
@@ -80,19 +81,19 @@ CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
||||
|
||||
switch(info) {
|
||||
case CURLINFO_EFFECTIVE_URL:
|
||||
*param_charp = data->url?data->url:(char *)"";
|
||||
*param_charp = data->change.url?data->change.url:(char *)"";
|
||||
break;
|
||||
case CURLINFO_HTTP_CODE:
|
||||
*param_longp = data->progress.httpcode;
|
||||
*param_longp = data->info.httpcode;
|
||||
break;
|
||||
case CURLINFO_FILETIME:
|
||||
*param_longp = data->progress.filetime;
|
||||
*param_longp = data->info.filetime;
|
||||
break;
|
||||
case CURLINFO_HEADER_SIZE:
|
||||
*param_longp = data->header_size;
|
||||
*param_longp = data->info.header_size;
|
||||
break;
|
||||
case CURLINFO_REQUEST_SIZE:
|
||||
*param_longp = data->request_size;
|
||||
*param_longp = data->info.request_size;
|
||||
break;
|
||||
case CURLINFO_TOTAL_TIME:
|
||||
*param_doublep = data->progress.timespent;
|
||||
@@ -119,7 +120,7 @@ CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
||||
*param_doublep = data->progress.ulspeed;
|
||||
break;
|
||||
case CURLINFO_SSL_VERIFYRESULT:
|
||||
*param_longp = data->ssl.certverifyresult;
|
||||
*param_longp = data->set.ssl.certverifyresult;
|
||||
break;
|
||||
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
|
||||
*param_doublep = data->progress.size_dl;
|
||||
@@ -132,3 +133,11 @@ CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
||||
}
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -22,7 +22,7 @@
|
||||
*
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...);
|
||||
CURLcode Curl_initinfo(struct UrlData *data);
|
||||
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...);
|
||||
CURLcode Curl_initinfo(struct SessionHandle *data);
|
||||
|
||||
#endif
|
||||
|
@@ -244,3 +244,11 @@ char *getpass(const char *prompt)
|
||||
return getpass_r(prompt, buf, sizeof(buf));
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
12
lib/hostip.c
12
lib/hostip.c
@@ -89,7 +89,7 @@ static char *MakeIP(unsigned long num,char *addr, int addr_len)
|
||||
}
|
||||
|
||||
#ifdef ENABLE_IPV6
|
||||
struct addrinfo *Curl_getaddrinfo(struct UrlData *data,
|
||||
struct addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||
char *hostname,
|
||||
int port)
|
||||
{
|
||||
@@ -119,7 +119,7 @@ struct addrinfo *Curl_getaddrinfo(struct UrlData *data,
|
||||
#define INADDR_NONE (unsigned long) ~0
|
||||
#endif
|
||||
|
||||
struct hostent *Curl_gethost(struct UrlData *data,
|
||||
struct hostent *Curl_gethost(struct SessionHandle *data,
|
||||
char *hostname,
|
||||
char **bufp)
|
||||
{
|
||||
@@ -215,3 +215,11 @@ struct hostent *Curl_gethost(struct UrlData *data,
|
||||
}
|
||||
return (h);
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -24,11 +24,11 @@
|
||||
*****************************************************************************/
|
||||
|
||||
struct addrinfo;
|
||||
struct addrinfo *Curl_getaddrinfo(struct UrlData *data,
|
||||
struct addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||
char *hostname,
|
||||
int port);
|
||||
|
||||
struct hostent *Curl_gethost(struct UrlData *data,
|
||||
struct hostent *Curl_gethost(struct SessionHandle *data,
|
||||
char *hostname,
|
||||
char **bufp);
|
||||
|
||||
|
208
lib/http.c
208
lib/http.c
@@ -128,10 +128,10 @@ static
|
||||
size_t add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in)
|
||||
{
|
||||
size_t amount;
|
||||
if(conn->data->bits.verbose) {
|
||||
fputs("> ", conn->data->err);
|
||||
if(conn->data->set.verbose) {
|
||||
fputs("> ", conn->data->set.err);
|
||||
/* this data _may_ contain binary stuff */
|
||||
fwrite(in->buffer, in->size_used, 1, conn->data->err);
|
||||
fwrite(in->buffer, in->size_used, 1, conn->data->set.err);
|
||||
}
|
||||
|
||||
Curl_write(conn, sockfd, in->buffer, in->size_used, &amount);
|
||||
@@ -204,31 +204,18 @@ CURLcode add_buffer(send_buffer *in, const void *inptr, size_t size)
|
||||
*/
|
||||
|
||||
static
|
||||
int GetLine(int sockfd, char *buf, struct connectdata *conn)
|
||||
int GetLine(int sockfd, char *ptr, struct connectdata *conn)
|
||||
{
|
||||
ssize_t nread;
|
||||
int read_rc=1;
|
||||
char *ptr;
|
||||
struct UrlData *data=conn->data;
|
||||
|
||||
ptr=buf;
|
||||
|
||||
/* get us a full line, terminated with a newline */
|
||||
for(nread=0;
|
||||
(nread<BUFSIZE) && read_rc;
|
||||
nread++, ptr++) {
|
||||
for(nread=0; (nread<BUFSIZE); nread++, ptr++) {
|
||||
if((CURLE_OK != Curl_read(conn, sockfd, ptr, 1, &nread)) ||
|
||||
(nread <= 0) ||
|
||||
(*ptr == '\n'))
|
||||
(nread <= 0) || (*ptr == '\n'))
|
||||
break;
|
||||
}
|
||||
*ptr=0; /* zero terminate */
|
||||
|
||||
if(data->bits.verbose) {
|
||||
fputs("< ", data->err);
|
||||
fwrite(buf, 1, nread, data->err);
|
||||
fputs("\n", data->err);
|
||||
}
|
||||
return nread>0?nread:0;
|
||||
}
|
||||
|
||||
@@ -238,12 +225,12 @@ int GetLine(int sockfd, char *buf, struct connectdata *conn)
|
||||
* This function checks the linked list of custom HTTP headers for a particular
|
||||
* header (prefix).
|
||||
*/
|
||||
static bool checkheaders(struct UrlData *data, const char *thisheader)
|
||||
static bool checkheaders(struct SessionHandle *data, const char *thisheader)
|
||||
{
|
||||
struct curl_slist *head;
|
||||
size_t thislen = strlen(thisheader);
|
||||
|
||||
for(head = data->headers; head; head=head->next) {
|
||||
for(head = data->set.headers; head; head=head->next) {
|
||||
if(strnequal(head->data, thisheader, thislen)) {
|
||||
return TRUE;
|
||||
}
|
||||
@@ -263,7 +250,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
{
|
||||
int httperror=0;
|
||||
int subversion=0;
|
||||
struct UrlData *data=conn->data;
|
||||
struct SessionHandle *data=conn->data;
|
||||
|
||||
infof(data, "Establish HTTP proxy tunnel to %s:%d\n", hostname, remote_port);
|
||||
|
||||
@@ -275,14 +262,17 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
"\r\n",
|
||||
hostname, remote_port,
|
||||
(conn->bits.proxy_user_passwd)?conn->allocptr.proxyuserpwd:"",
|
||||
(data->useragent?conn->allocptr.uagent:"")
|
||||
(data->set.useragent?conn->allocptr.uagent:"")
|
||||
);
|
||||
|
||||
/* wait for the proxy to send us a HTTP/1.0 200 OK header */
|
||||
while(GetLine(tunnelsocket, data->buffer, conn)) {
|
||||
if('\r' == data->buffer[0])
|
||||
while(GetLine(tunnelsocket, data->state.buffer, conn)) {
|
||||
if('\r' == data->state.buffer[0])
|
||||
break; /* end of headers */
|
||||
if(2 == sscanf(data->buffer, "HTTP/1.%d %d",
|
||||
if(data->set.verbose)
|
||||
fprintf(data->set.err, "< %s\n", data->state.buffer);
|
||||
|
||||
if(2 == sscanf(data->state.buffer, "HTTP/1.%d %d",
|
||||
&subversion,
|
||||
&httperror)) {
|
||||
;
|
||||
@@ -306,7 +296,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
*/
|
||||
CURLcode Curl_http_connect(struct connectdata *conn)
|
||||
{
|
||||
struct UrlData *data;
|
||||
struct SessionHandle *data;
|
||||
CURLcode result;
|
||||
|
||||
data=conn->data;
|
||||
@@ -318,7 +308,7 @@ CURLcode Curl_http_connect(struct connectdata *conn)
|
||||
* has occured, can we start talking SSL
|
||||
*/
|
||||
if (conn->protocol & PROT_HTTPS) {
|
||||
if (data->bits.httpproxy) {
|
||||
if (data->change.proxy) {
|
||||
/* HTTPS through a proxy can only be done with a tunnel */
|
||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
||||
conn->hostname, conn->remote_port);
|
||||
@@ -332,42 +322,33 @@ CURLcode Curl_http_connect(struct connectdata *conn)
|
||||
return result;
|
||||
}
|
||||
|
||||
if(conn->bits.user_passwd && !data->bits.this_is_a_follow) {
|
||||
if(conn->bits.user_passwd && !data->state.this_is_a_follow) {
|
||||
/* Authorization: is requested, this is not a followed location, get the
|
||||
original host name */
|
||||
data->auth_host = strdup(conn->hostname);
|
||||
data->state.auth_host = strdup(conn->hostname);
|
||||
}
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/* called from curl_close() when this struct is about to get wasted, free
|
||||
protocol-specific resources */
|
||||
CURLcode Curl_http_close(struct connectdata *conn)
|
||||
{
|
||||
if(conn->data->auth_host)
|
||||
free(conn->data->auth_host);
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
CURLcode Curl_http_done(struct connectdata *conn)
|
||||
{
|
||||
struct UrlData *data;
|
||||
struct SessionHandle *data;
|
||||
long *bytecount = &conn->bytecount;
|
||||
struct HTTP *http;
|
||||
|
||||
data=conn->data;
|
||||
http=conn->proto.http;
|
||||
|
||||
if(HTTPREQ_POST_FORM == data->httpreq) {
|
||||
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||
*bytecount = http->readbytecount + http->writebytecount;
|
||||
|
||||
Curl_formclean(http->sendit); /* Now free that whole lot */
|
||||
|
||||
data->fread = http->storefread; /* restore */
|
||||
data->in = http->in; /* restore */
|
||||
data->set.fread = http->storefread; /* restore */
|
||||
data->set.in = http->in; /* restore */
|
||||
}
|
||||
else if(HTTPREQ_PUT == data->httpreq) {
|
||||
else if(HTTPREQ_PUT == data->set.httpreq) {
|
||||
*bytecount = http->readbytecount + http->writebytecount;
|
||||
}
|
||||
|
||||
@@ -377,8 +358,8 @@ CURLcode Curl_http_done(struct connectdata *conn)
|
||||
|
||||
CURLcode Curl_http(struct connectdata *conn)
|
||||
{
|
||||
struct UrlData *data=conn->data;
|
||||
char *buf = data->buffer; /* this is a short cut to the buffer */
|
||||
struct SessionHandle *data=conn->data;
|
||||
char *buf = data->state.buffer; /* this is a short cut to the buffer */
|
||||
CURLcode result=CURLE_OK;
|
||||
struct HTTP *http;
|
||||
struct Cookie *co=NULL; /* no cookies from start */
|
||||
@@ -402,8 +383,8 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
conn->bits.close = FALSE;
|
||||
|
||||
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
||||
data->bits.upload) {
|
||||
data->httpreq = HTTPREQ_PUT;
|
||||
data->set.upload) {
|
||||
data->set.httpreq = HTTPREQ_PUT;
|
||||
}
|
||||
|
||||
/* The User-Agent string has been built in url.c already, because it might
|
||||
@@ -420,11 +401,12 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
|
||||
/* To prevent the user+password to get sent to other than the original
|
||||
host due to a location-follow, we do some weirdo checks here */
|
||||
if(!data->bits.this_is_a_follow ||
|
||||
!data->auth_host ||
|
||||
strequal(data->auth_host, conn->hostname)) {
|
||||
sprintf(data->buffer, "%s:%s", data->user, data->passwd);
|
||||
if(Curl_base64_encode(data->buffer, strlen(data->buffer),
|
||||
if(!data->state.this_is_a_follow ||
|
||||
!data->state.auth_host ||
|
||||
strequal(data->state.auth_host, conn->hostname)) {
|
||||
sprintf(data->state.buffer, "%s:%s",
|
||||
data->state.user, data->state.passwd);
|
||||
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer),
|
||||
&authorization) >= 0) {
|
||||
if(conn->allocptr.userpwd)
|
||||
free(conn->allocptr.userpwd);
|
||||
@@ -434,31 +416,30 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
}
|
||||
}
|
||||
}
|
||||
if((data->bits.http_set_referer) && !checkheaders(data, "Referer:")) {
|
||||
if((data->change.referer) && !checkheaders(data, "Referer:")) {
|
||||
if(conn->allocptr.ref)
|
||||
free(conn->allocptr.ref);
|
||||
conn->allocptr.ref = aprintf("Referer: %s\015\012", data->referer);
|
||||
conn->allocptr.ref = aprintf("Referer: %s\015\012", data->change.referer);
|
||||
}
|
||||
if(data->cookie && !checkheaders(data, "Cookie:")) {
|
||||
if(data->set.cookie && !checkheaders(data, "Cookie:")) {
|
||||
if(conn->allocptr.cookie)
|
||||
free(conn->allocptr.cookie);
|
||||
conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->cookie);
|
||||
conn->allocptr.cookie = aprintf("Cookie: %s\015\012", data->set.cookie);
|
||||
}
|
||||
|
||||
if(data->cookies) {
|
||||
co = Curl_cookie_getlist(data->cookies,
|
||||
host,
|
||||
ppath,
|
||||
host, ppath,
|
||||
conn->protocol&PROT_HTTPS?TRUE:FALSE);
|
||||
}
|
||||
if ((data->bits.httpproxy) && !(conn->protocol&PROT_HTTPS)) {
|
||||
if ((data->change.proxy) && !(conn->protocol&PROT_HTTPS)) {
|
||||
/* The path sent to the proxy is in fact the entire URL */
|
||||
ppath = data->url;
|
||||
ppath = data->change.url;
|
||||
}
|
||||
if(HTTPREQ_POST_FORM == data->httpreq) {
|
||||
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||
/* we must build the whole darned post sequence first, so that we have
|
||||
a size of the whole shebang before we start to send it */
|
||||
http->sendit = Curl_getFormData(data->httppost, &http->postsize);
|
||||
http->sendit = Curl_getFormData(data->set.httppost, &http->postsize);
|
||||
}
|
||||
|
||||
if(!checkheaders(data, "Host:")) {
|
||||
@@ -486,9 +467,9 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
if(!checkheaders(data, "Accept:"))
|
||||
http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";
|
||||
|
||||
if(( (HTTPREQ_POST == data->httpreq) ||
|
||||
(HTTPREQ_POST_FORM == data->httpreq) ||
|
||||
(HTTPREQ_PUT == data->httpreq) ) &&
|
||||
if(( (HTTPREQ_POST == data->set.httpreq) ||
|
||||
(HTTPREQ_POST_FORM == data->set.httpreq) ||
|
||||
(HTTPREQ_PUT == data->set.httpreq) ) &&
|
||||
conn->resume_from) {
|
||||
/**********************************************************************
|
||||
* Resuming upload in HTTP means that we PUT or POST and that we have
|
||||
@@ -521,7 +502,8 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
readthisamountnow = BUFSIZE;
|
||||
|
||||
actuallyread =
|
||||
data->fread(data->buffer, 1, readthisamountnow, data->in);
|
||||
data->set.fread(data->state.buffer, 1, readthisamountnow,
|
||||
data->set.in);
|
||||
|
||||
passed += actuallyread;
|
||||
if(actuallyread != readthisamountnow) {
|
||||
@@ -532,10 +514,10 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
} while(passed != conn->resume_from); /* loop until done */
|
||||
|
||||
/* now, decrease the size of the read */
|
||||
if(data->infilesize>0) {
|
||||
data->infilesize -= conn->resume_from;
|
||||
if(data->set.infilesize>0) {
|
||||
data->set.infilesize -= conn->resume_from;
|
||||
|
||||
if(data->infilesize <= 0) {
|
||||
if(data->set.infilesize <= 0) {
|
||||
failf(data, "File already completely uploaded\n");
|
||||
return CURLE_PARTIAL_FILE;
|
||||
}
|
||||
@@ -549,16 +531,16 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
* or uploading and we always let customized headers override our internal
|
||||
* ones if any such are specified.
|
||||
*/
|
||||
if((data->httpreq == HTTPREQ_GET) &&
|
||||
if((data->set.httpreq == HTTPREQ_GET) &&
|
||||
!checkheaders(data, "Range:")) {
|
||||
conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n", conn->range);
|
||||
}
|
||||
else if((data->httpreq != HTTPREQ_GET) &&
|
||||
else if((data->set.httpreq != HTTPREQ_GET) &&
|
||||
!checkheaders(data, "Content-Range:")) {
|
||||
|
||||
if(conn->resume_from) {
|
||||
/* This is because "resume" was selected */
|
||||
long total_expected_size= conn->resume_from + data->infilesize;
|
||||
long total_expected_size= conn->resume_from + data->set.infilesize;
|
||||
conn->allocptr.rangeline = aprintf("Content-Range: bytes %s%ld/%ld\r\n",
|
||||
conn->range, total_expected_size-1,
|
||||
total_expected_size);
|
||||
@@ -567,14 +549,14 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
/* Range was selected and then we just pass the incoming range and
|
||||
append total size */
|
||||
conn->allocptr.rangeline = aprintf("Content-Range: bytes %s/%d\r\n",
|
||||
conn->range, data->infilesize);
|
||||
conn->range, data->set.infilesize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
do {
|
||||
send_buffer *req_buffer;
|
||||
struct curl_slist *headers=data->headers;
|
||||
struct curl_slist *headers=data->set.headers;
|
||||
|
||||
/* initialize a dynamic send-buffer */
|
||||
req_buffer = add_buffer_init();
|
||||
@@ -593,11 +575,11 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
"%s" /* accept */
|
||||
"%s", /* referer */
|
||||
|
||||
data->customrequest?data->customrequest:
|
||||
(data->bits.no_body?"HEAD":
|
||||
((HTTPREQ_POST == data->httpreq) ||
|
||||
(HTTPREQ_POST_FORM == data->httpreq))?"POST":
|
||||
(HTTPREQ_PUT == data->httpreq)?"PUT":"GET"),
|
||||
data->set.customrequest?data->set.customrequest:
|
||||
(data->set.no_body?"HEAD":
|
||||
((HTTPREQ_POST == data->set.httpreq) ||
|
||||
(HTTPREQ_POST_FORM == data->set.httpreq))?"POST":
|
||||
(HTTPREQ_PUT == data->set.httpreq)?"PUT":"GET"),
|
||||
ppath,
|
||||
(conn->bits.proxy_user_passwd &&
|
||||
conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"",
|
||||
@@ -605,13 +587,13 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
conn->allocptr.userpwd:"",
|
||||
(conn->bits.use_range && conn->allocptr.rangeline)?
|
||||
conn->allocptr.rangeline:"",
|
||||
(data->useragent && *data->useragent && conn->allocptr.uagent)?
|
||||
(data->set.useragent && *data->set.useragent && conn->allocptr.uagent)?
|
||||
conn->allocptr.uagent:"",
|
||||
(conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: <data> */
|
||||
(conn->allocptr.host?conn->allocptr.host:""), /* Host: host */
|
||||
http->p_pragma?http->p_pragma:"",
|
||||
http->p_accept?http->p_accept:"",
|
||||
(data->bits.http_set_referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> <CRLF> */
|
||||
(data->change.referer && conn->allocptr.ref)?conn->allocptr.ref:"" /* Referer: <data> <CRLF> */
|
||||
);
|
||||
|
||||
if(co) {
|
||||
@@ -636,7 +618,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
co=NULL;
|
||||
}
|
||||
|
||||
if(data->timecondition) {
|
||||
if(data->set.timecondition) {
|
||||
struct tm *thistime;
|
||||
|
||||
/* Phil Karn (Fri, 13 Apr 2001) pointed out that the If-Modified-Since
|
||||
@@ -651,9 +633,9 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
/* We assume that the presense of localtime_r() proves the presense
|
||||
of gmtime_r() which is a bit ugly but might work */
|
||||
struct tm keeptime;
|
||||
thistime = (struct tm *)gmtime_r(&data->timevalue, &keeptime);
|
||||
thistime = (struct tm *)gmtime_r(&data->set.timevalue, &keeptime);
|
||||
#else
|
||||
thistime = gmtime(&data->timevalue);
|
||||
thistime = gmtime(&data->set.timevalue);
|
||||
#endif
|
||||
if(NULL == thistime) {
|
||||
failf(data, "localtime() failed!");
|
||||
@@ -667,7 +649,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
/* TODO: Right, we *could* write a replacement here */
|
||||
strcpy(buf, "no strftime() support");
|
||||
#endif
|
||||
switch(data->timecondition) {
|
||||
switch(data->set.timecondition) {
|
||||
case TIMECOND_IFMODSINCE:
|
||||
default:
|
||||
add_bufferf(req_buffer,
|
||||
@@ -702,7 +684,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
headers = headers->next;
|
||||
}
|
||||
|
||||
if(HTTPREQ_POST_FORM == data->httpreq) {
|
||||
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||
char contentType[256];
|
||||
int linelength=0;
|
||||
if(Curl_FormInit(&http->form, http->sendit)) {
|
||||
@@ -710,13 +692,13 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
return CURLE_HTTP_POST_ERROR;
|
||||
}
|
||||
|
||||
http->storefread = data->fread; /* backup */
|
||||
http->in = data->in; /* backup */
|
||||
http->storefread = data->set.fread; /* backup */
|
||||
http->in = data->set.in; /* backup */
|
||||
|
||||
data->fread = (curl_read_callback)
|
||||
data->set.fread = (curl_read_callback)
|
||||
Curl_FormReader; /* set the read function to read from the
|
||||
generated form data */
|
||||
data->in = (FILE *)&http->form;
|
||||
data->set.in = (FILE *)&http->form;
|
||||
|
||||
add_bufferf(req_buffer,
|
||||
"Content-Length: %d\r\n", http->postsize-2);
|
||||
@@ -727,7 +709,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
there is one packet coming back from the web server) */
|
||||
add_bufferf(req_buffer,
|
||||
"Expect: 100-continue\r\n");
|
||||
data->bits.expect100header = TRUE;
|
||||
data->set.expect100header = TRUE;
|
||||
|
||||
/* Get Content-Type: line from Curl_FormReadOneLine, which happens
|
||||
to always be the first line. We can know this for sure since
|
||||
@@ -747,7 +729,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
Curl_pgrsSetUploadSize(data, http->postsize);
|
||||
|
||||
/* fire away the whole request to the server */
|
||||
data->request_size =
|
||||
data->info.request_size =
|
||||
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
||||
|
||||
/* setup variables for the upcoming transfer */
|
||||
@@ -760,22 +742,22 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else if(HTTPREQ_PUT == data->httpreq) {
|
||||
else if(HTTPREQ_PUT == data->set.httpreq) {
|
||||
/* Let's PUT the data to the server! */
|
||||
|
||||
if(data->infilesize>0) {
|
||||
if(data->set.infilesize>0) {
|
||||
add_bufferf(req_buffer,
|
||||
"Content-Length: %d\r\n\r\n", /* file size */
|
||||
data->infilesize );
|
||||
data->set.infilesize );
|
||||
}
|
||||
else
|
||||
add_bufferf(req_buffer, "\015\012");
|
||||
|
||||
/* set the upload size to the progress meter */
|
||||
Curl_pgrsSetUploadSize(data, data->infilesize);
|
||||
Curl_pgrsSetUploadSize(data, data->set.infilesize);
|
||||
|
||||
/* this sends the buffer and frees all the buffer resources */
|
||||
data->request_size =
|
||||
data->info.request_size =
|
||||
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
||||
|
||||
/* prepare for transfer */
|
||||
@@ -788,17 +770,17 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
|
||||
}
|
||||
else {
|
||||
if(HTTPREQ_POST == data->httpreq) {
|
||||
if(HTTPREQ_POST == data->set.httpreq) {
|
||||
/* this is the simple POST, using x-www-form-urlencoded style */
|
||||
|
||||
if(!data->postfields) {
|
||||
if(!data->set.postfields) {
|
||||
/*
|
||||
* This is an attempt to do a POST without having anything to
|
||||
* actually send. Let's make a NULL pointer equal "" here. Good/bad
|
||||
* ?
|
||||
*/
|
||||
data->postfields = (char *)"";
|
||||
data->postfieldsize = 0; /* it might been set to something illegal,
|
||||
data->set.postfields = (char *)"";
|
||||
data->set.postfieldsize = 0; /* it might been set to something illegal,
|
||||
anything > 0 would be! */
|
||||
}
|
||||
|
||||
@@ -807,32 +789,32 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
actually set your own */
|
||||
add_bufferf(req_buffer,
|
||||
"Content-Length: %d\r\n",
|
||||
(data->postfieldsize?data->postfieldsize:
|
||||
strlen(data->postfields)) );
|
||||
(data->set.postfieldsize?data->set.postfieldsize:
|
||||
strlen(data->set.postfields)) );
|
||||
|
||||
if(!checkheaders(data, "Content-Type:"))
|
||||
add_bufferf(req_buffer,
|
||||
"Content-Type: application/x-www-form-urlencoded\r\n");
|
||||
|
||||
/* and here comes the actual data */
|
||||
if(data->postfieldsize) {
|
||||
if(data->set.postfieldsize) {
|
||||
add_buffer(req_buffer, "\r\n", 2);
|
||||
add_buffer(req_buffer, data->postfields,
|
||||
data->postfieldsize);
|
||||
add_buffer(req_buffer, data->set.postfields,
|
||||
data->set.postfieldsize);
|
||||
add_buffer(req_buffer, "\r\n", 2);
|
||||
}
|
||||
else {
|
||||
add_bufferf(req_buffer,
|
||||
"\r\n"
|
||||
"%s\r\n",
|
||||
data->postfields );
|
||||
data->set.postfields );
|
||||
}
|
||||
}
|
||||
else
|
||||
add_buffer(req_buffer, "\r\n", 2);
|
||||
|
||||
/* issue the request */
|
||||
data->request_size =
|
||||
data->info.request_size =
|
||||
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
||||
|
||||
/* HTTP GET/HEAD download: */
|
||||
@@ -847,3 +829,11 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -33,7 +33,6 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
CURLcode Curl_http(struct connectdata *conn);
|
||||
CURLcode Curl_http_done(struct connectdata *conn);
|
||||
CURLcode Curl_http_connect(struct connectdata *conn);
|
||||
CURLcode Curl_http_close(struct connectdata *conn);
|
||||
|
||||
/* The following functions are defined in http_chunks.c */
|
||||
void Curl_httpchunk_init(struct connectdata *conn);
|
||||
|
@@ -44,7 +44,7 @@
|
||||
* Chunk format (simplified):
|
||||
*
|
||||
* <HEX SIZE>[ chunk extension ] CRLF
|
||||
* <DATA>
|
||||
* <DATA> CRLF
|
||||
*
|
||||
* Highlights from RFC2616 section 3.6 say:
|
||||
|
||||
@@ -220,3 +220,11 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
||||
}
|
||||
return CHUNKE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -124,3 +124,11 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size)
|
||||
#else
|
||||
#define if2ip(x) NULL
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
28
lib/krb4.c
28
lib/krb4.c
@@ -248,17 +248,17 @@ krb4_auth(void *app_data, struct connectdata *conn)
|
||||
Curl_ftpsendf(conn->firstsocket, conn, "ADAT %s", p);
|
||||
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||
conn->data->buffer, conn, NULL);
|
||||
conn->data->state.buffer, conn, NULL);
|
||||
if(nread < 0)
|
||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
||||
free(p);
|
||||
|
||||
if(/*ret != COMPLETE*/conn->data->buffer[0] != '2'){
|
||||
if(/*ret != COMPLETE*/conn->data->state.buffer[0] != '2'){
|
||||
printf("Server didn't accept auth data.\n");
|
||||
return AUTH_ERROR;
|
||||
}
|
||||
|
||||
p = strstr(conn->data->buffer, "ADAT=");
|
||||
p = strstr(conn->data->state.buffer, "ADAT=");
|
||||
if(!p){
|
||||
printf("Remote host didn't send adat reply.\n");
|
||||
return AUTH_ERROR;
|
||||
@@ -314,20 +314,20 @@ void Curl_krb_kauth(struct connectdata *conn)
|
||||
save = Curl_set_command_prot(conn, prot_private);
|
||||
|
||||
Curl_ftpsendf(conn->firstsocket, conn,
|
||||
"SITE KAUTH %s", conn->data->user);
|
||||
"SITE KAUTH %s", conn->data->state.user);
|
||||
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->buffer,
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->state.buffer,
|
||||
conn, NULL);
|
||||
if(nread < 0)
|
||||
return /*CURLE_OPERATION_TIMEOUTED*/;
|
||||
|
||||
if(/*ret != CONTINUE*/conn->data->buffer[0] != '3'){
|
||||
if(/*ret != CONTINUE*/conn->data->state.buffer[0] != '3'){
|
||||
Curl_set_command_prot(conn, save);
|
||||
/*code = -1;***/
|
||||
return;
|
||||
}
|
||||
|
||||
p = strstr(conn->data->buffer, "T=");
|
||||
p = strstr(conn->data->state.buffer, "T=");
|
||||
if(!p) {
|
||||
printf("Bad reply from server.\n");
|
||||
Curl_set_command_prot(conn, save);
|
||||
@@ -344,7 +344,7 @@ void Curl_krb_kauth(struct connectdata *conn)
|
||||
tkt.length = tmp;
|
||||
tktcopy.length = tkt.length;
|
||||
|
||||
p = strstr(conn->data->buffer, "P=");
|
||||
p = strstr(conn->data->state.buffer, "P=");
|
||||
if(!p) {
|
||||
printf("Bad reply from server.\n");
|
||||
Curl_set_command_prot(conn, save);
|
||||
@@ -354,7 +354,7 @@ void Curl_krb_kauth(struct connectdata *conn)
|
||||
for(; *p && *p != ' ' && *p != '\r' && *p != '\n'; p++);
|
||||
*p = 0;
|
||||
|
||||
des_string_to_key (conn->data->passwd, &key);
|
||||
des_string_to_key (conn->data->state.passwd, &key);
|
||||
des_key_sched(&key, schedule);
|
||||
|
||||
des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat,
|
||||
@@ -383,7 +383,7 @@ void Curl_krb_kauth(struct connectdata *conn)
|
||||
Curl_ftpsendf(conn->firstsocket, conn,
|
||||
"SITE KAUTH %s %s", name, p);
|
||||
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->buffer,
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket, conn->data->state.buffer,
|
||||
conn, NULL);
|
||||
if(nread < 0)
|
||||
return /*CURLE_OPERATION_TIMEOUTED*/;
|
||||
@@ -392,3 +392,11 @@ void Curl_krb_kauth(struct connectdata *conn)
|
||||
}
|
||||
|
||||
#endif /* KRB4 */
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
20
lib/ldap.c
20
lib/ldap.c
@@ -116,7 +116,7 @@ static void * DynaGetFunction(const char *name)
|
||||
|
||||
static int WriteProc(void *param, char *text, int len)
|
||||
{
|
||||
struct UrlData *data = (struct UrlData *)param;
|
||||
struct SessionHandle *data = (struct SessionHandle *)param;
|
||||
len = 0; /* prevent compiler warning */
|
||||
Curl_client_write(data, CLIENTWRITE_BODY, text, 0);
|
||||
return 0;
|
||||
@@ -142,9 +142,9 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
||||
void *entryIterator;
|
||||
|
||||
int ldaptext;
|
||||
struct UrlData *data=conn->data;
|
||||
struct SessionHandle *data=conn->data;
|
||||
|
||||
infof(data, "LDAP: %s %s\n", data->url);
|
||||
infof(data, "LDAP: %s %s\n", data->change.url);
|
||||
|
||||
DynaOpen();
|
||||
if (libldap == NULL) {
|
||||
@@ -152,7 +152,7 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
||||
return CURLE_LIBRARY_NOT_FOUND;
|
||||
}
|
||||
|
||||
ldaptext = data->bits.ftp_ascii; /* This is a dirty hack */
|
||||
ldaptext = data->set.ftp_ascii; /* This is a dirty hack */
|
||||
|
||||
/* The types are needed because ANSI C distinguishes between
|
||||
* pointer-to-object (data) and pointer-to-function.
|
||||
@@ -173,12 +173,12 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
||||
conn->hostname, conn->port);
|
||||
status = CURLE_COULDNT_CONNECT;
|
||||
} else {
|
||||
rc = ldap_simple_bind_s(server, data->user, data->passwd);
|
||||
rc = ldap_simple_bind_s(server, data->state.user, data->state.passwd);
|
||||
if (rc != 0) {
|
||||
failf(data, "LDAP: %s", ldap_err2string(rc));
|
||||
status = CURLE_LDAP_CANNOT_BIND;
|
||||
} else {
|
||||
rc = ldap_url_search_s(server, data->url, 0, &result);
|
||||
rc = ldap_url_search_s(server, data->change.url, 0, &result);
|
||||
if (rc != 0) {
|
||||
failf(data, "LDAP: %s", ldap_err2string(rc));
|
||||
status = CURLE_LDAP_SEARCH_FAILED;
|
||||
@@ -213,3 +213,11 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
||||
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -31,4 +31,5 @@ EXPORTS
|
||||
curl_mvfprintf @ 22 ;
|
||||
curl_strequal @ 23 ;
|
||||
curl_strnequal @ 24 ;
|
||||
curl_easy_duphandle @ 25 ;
|
||||
|
||||
|
@@ -156,3 +156,11 @@ int curl_fclose(FILE *file, int line, const char *source)
|
||||
}
|
||||
|
||||
#endif /* MALLOCDEBUG */
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -1232,3 +1232,11 @@ int main()
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -201,3 +201,11 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -93,17 +93,17 @@ static char *max5data(double bytes, char *max5)
|
||||
|
||||
void Curl_pgrsDone(struct connectdata *conn)
|
||||
{
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
if(!(data->progress.flags & PGRS_HIDE)) {
|
||||
data->progress.lastshow=0;
|
||||
Curl_pgrsUpdate(conn); /* the final (forced) update */
|
||||
if(!data->progress.callback)
|
||||
/* only output if we don't use progress callback */
|
||||
fprintf(data->err, "\n");
|
||||
fprintf(data->set.err, "\n");
|
||||
}
|
||||
}
|
||||
|
||||
void Curl_pgrsTime(struct UrlData *data, timerid timer)
|
||||
void Curl_pgrsTime(struct SessionHandle *data, timerid timer)
|
||||
{
|
||||
switch(timer) {
|
||||
default:
|
||||
@@ -135,23 +135,23 @@ void Curl_pgrsTime(struct UrlData *data, timerid timer)
|
||||
}
|
||||
}
|
||||
|
||||
void Curl_pgrsStartNow(struct UrlData *data)
|
||||
void Curl_pgrsStartNow(struct SessionHandle *data)
|
||||
{
|
||||
data->progress.speeder_c = 0; /* reset the progress meter display */
|
||||
data->progress.start = Curl_tvnow();
|
||||
}
|
||||
|
||||
void Curl_pgrsSetDownloadCounter(struct UrlData *data, double size)
|
||||
void Curl_pgrsSetDownloadCounter(struct SessionHandle *data, double size)
|
||||
{
|
||||
data->progress.downloaded = size;
|
||||
}
|
||||
|
||||
void Curl_pgrsSetUploadCounter(struct UrlData *data, double size)
|
||||
void Curl_pgrsSetUploadCounter(struct SessionHandle *data, double size)
|
||||
{
|
||||
data->progress.uploaded = size;
|
||||
}
|
||||
|
||||
void Curl_pgrsSetDownloadSize(struct UrlData *data, double size)
|
||||
void Curl_pgrsSetDownloadSize(struct SessionHandle *data, double size)
|
||||
{
|
||||
if(size > 0) {
|
||||
data->progress.size_dl = size;
|
||||
@@ -159,7 +159,7 @@ void Curl_pgrsSetDownloadSize(struct UrlData *data, double size)
|
||||
}
|
||||
}
|
||||
|
||||
void Curl_pgrsSetUploadSize(struct UrlData *data, double size)
|
||||
void Curl_pgrsSetUploadSize(struct SessionHandle *data, double size)
|
||||
{
|
||||
if(size > 0) {
|
||||
data->progress.size_ul = size;
|
||||
@@ -188,7 +188,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
double total_transfer;
|
||||
double total_expected_transfer;
|
||||
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
|
||||
int nowindex = data->progress.speeder_c% CURR_TIME;
|
||||
int checkindex;
|
||||
@@ -211,9 +211,9 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
else if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
|
||||
if (!data->progress.callback) {
|
||||
if(conn->resume_from)
|
||||
fprintf(data->err, "** Resuming transfer from byte position %d\n",
|
||||
fprintf(data->set.err, "** Resuming transfer from byte position %d\n",
|
||||
conn->resume_from);
|
||||
fprintf(data->err,
|
||||
fprintf(data->set.err,
|
||||
" %% Total %% Received %% Xferd Average Speed Time Curr.\n"
|
||||
" Dload Upload Total Current Left Speed\n");
|
||||
}
|
||||
@@ -254,8 +254,8 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
|
||||
if(data->progress.flags & PGRS_HIDE)
|
||||
return 0;
|
||||
else if(data->fprogress) {
|
||||
result= data->fprogress(data->progress_client,
|
||||
else if(data->set.fprogress) {
|
||||
result= data->set.fprogress(data->set.progress_client,
|
||||
data->progress.size_dl,
|
||||
data->progress.downloaded,
|
||||
data->progress.size_ul,
|
||||
@@ -310,7 +310,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
if(total_expected_transfer)
|
||||
total_percen=(double)(total_transfer/total_expected_transfer)*100;
|
||||
|
||||
fprintf(data->err,
|
||||
fprintf(data->set.err,
|
||||
"\r%3d %s %3d %s %3d %s %s %s %s %s %s %s",
|
||||
(int)total_percen, /* total % */
|
||||
max5data(total_expected_transfer, max5[2]), /* total size */
|
||||
@@ -328,7 +328,15 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
||||
);
|
||||
|
||||
/* we flush the output stream to make it appear as soon as possible */
|
||||
fflush(data->err);
|
||||
fflush(data->set.err);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -37,13 +37,13 @@ typedef enum {
|
||||
} timerid;
|
||||
|
||||
void Curl_pgrsDone(struct connectdata *);
|
||||
void Curl_pgrsStartNow(struct UrlData *data);
|
||||
void Curl_pgrsSetDownloadSize(struct UrlData *data, double size);
|
||||
void Curl_pgrsSetUploadSize(struct UrlData *data, double size);
|
||||
void Curl_pgrsSetDownloadCounter(struct UrlData *data, double size);
|
||||
void Curl_pgrsSetUploadCounter(struct UrlData *data, double size);
|
||||
void Curl_pgrsStartNow(struct SessionHandle *data);
|
||||
void Curl_pgrsSetDownloadSize(struct SessionHandle *data, double size);
|
||||
void Curl_pgrsSetUploadSize(struct SessionHandle *data, double size);
|
||||
void Curl_pgrsSetDownloadCounter(struct SessionHandle *data, double size);
|
||||
void Curl_pgrsSetUploadCounter(struct SessionHandle *data, double size);
|
||||
int Curl_pgrsUpdate(struct connectdata *);
|
||||
void Curl_pgrsTime(struct UrlData *data, timerid timer);
|
||||
void Curl_pgrsTime(struct SessionHandle *data, timerid timer);
|
||||
|
||||
|
||||
/* Don't show progress for sizes smaller than: */
|
||||
|
@@ -417,15 +417,15 @@ sec_prot_internal(struct connectdata *conn, int level)
|
||||
"PBSZ %u", s);
|
||||
/* wait for feedback */
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||
conn->data->buffer, conn, NULL);
|
||||
conn->data->state.buffer, conn, NULL);
|
||||
if(nread < 0)
|
||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
||||
if(/*ret != COMPLETE*/conn->data->buffer[0] != '2'){
|
||||
if(/*ret != COMPLETE*/conn->data->state.buffer[0] != '2'){
|
||||
failf(conn->data, "Failed to set protection buffer size.\n");
|
||||
return -1;
|
||||
}
|
||||
conn->buffer_size = s;
|
||||
p = strstr(/*reply_string*/conn->data->buffer, "PBSZ=");
|
||||
p = strstr(/*reply_string*/conn->data->state.buffer, "PBSZ=");
|
||||
if(p)
|
||||
sscanf(p, "PBSZ=%u", &s);
|
||||
if(s < conn->buffer_size)
|
||||
@@ -436,10 +436,10 @@ sec_prot_internal(struct connectdata *conn, int level)
|
||||
"PROT %c", level["CSEP"]);
|
||||
/* wait for feedback */
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||
conn->data->buffer, conn, NULL);
|
||||
conn->data->state.buffer, conn, NULL);
|
||||
if(nread < 0)
|
||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
||||
if(/*ret != COMPLETE*/conn->data->buffer[0] != '2'){
|
||||
if(/*ret != COMPLETE*/conn->data->state.buffer[0] != '2'){
|
||||
failf(conn->data, "Failed to set protection level.\n");
|
||||
return -1;
|
||||
}
|
||||
@@ -472,7 +472,7 @@ Curl_sec_login(struct connectdata *conn)
|
||||
int ret;
|
||||
struct Curl_sec_client_mech **m;
|
||||
ssize_t nread;
|
||||
struct UrlData *data=conn->data;
|
||||
struct SessionHandle *data=conn->data;
|
||||
|
||||
for(m = mechs; *m && (*m)->name; m++) {
|
||||
void *tmp;
|
||||
@@ -494,18 +494,18 @@ Curl_sec_login(struct connectdata *conn)
|
||||
"AUTH %s", (*m)->name);
|
||||
/* wait for feedback */
|
||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||
conn->data->buffer, conn, NULL);
|
||||
conn->data->state.buffer, conn, NULL);
|
||||
if(nread < 0)
|
||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
||||
if(/*ret != CONTINUE*/conn->data->buffer[0] != '3'){
|
||||
if(/*code == 504*/strncmp(conn->data->buffer,"504",3) == 0) {
|
||||
if(/*ret != CONTINUE*/conn->data->state.buffer[0] != '3'){
|
||||
if(/*code == 504*/strncmp(conn->data->state.buffer,"504",3) == 0) {
|
||||
infof(data,
|
||||
"%s is not supported by the server.\n", (*m)->name);
|
||||
}
|
||||
else if(/*code == 534*/strncmp(conn->data->buffer,"534",3) == 0) {
|
||||
else if(/*code == 534*/strncmp(conn->data->state.buffer,"534",3) == 0) {
|
||||
infof(data, "%s rejected as security mechanism.\n", (*m)->name);
|
||||
}
|
||||
else if(/*ret == ERROR*/conn->data->buffer[0] == '5') {
|
||||
else if(/*ret == ERROR*/conn->data->state.buffer[0] == '5') {
|
||||
infof(data, "The server doesn't support the FTP "
|
||||
"security extensions.\n");
|
||||
return -1;
|
||||
@@ -546,3 +546,11 @@ Curl_sec_end(struct connectdata *conn)
|
||||
}
|
||||
|
||||
#endif /* KRB4 */
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
38
lib/sendf.c
38
lib/sendf.c
@@ -122,13 +122,13 @@ void curl_slist_free_all(struct curl_slist *list)
|
||||
|
||||
/* Curl_infof() is for info message along the way */
|
||||
|
||||
void Curl_infof(struct UrlData *data, const char *fmt, ...)
|
||||
void Curl_infof(struct SessionHandle *data, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if(data->bits.verbose) {
|
||||
if(data->set.verbose) {
|
||||
va_start(ap, fmt);
|
||||
fputs("* ", data->err);
|
||||
vfprintf(data->err, fmt, ap);
|
||||
fputs("* ", data->set.err);
|
||||
vfprintf(data->set.err, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
@@ -136,12 +136,12 @@ void Curl_infof(struct UrlData *data, const char *fmt, ...)
|
||||
/* Curl_failf() is for messages stating why we failed, the LAST one will be
|
||||
returned for the user (if requested) */
|
||||
|
||||
void Curl_failf(struct UrlData *data, const char *fmt, ...)
|
||||
void Curl_failf(struct SessionHandle *data, const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, fmt);
|
||||
if(data->errorbuffer)
|
||||
vsnprintf(data->errorbuffer, CURL_ERROR_SIZE, fmt, ap);
|
||||
if(data->set.errorbuffer)
|
||||
vsnprintf(data->set.errorbuffer, CURL_ERROR_SIZE, fmt, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
@@ -149,7 +149,7 @@ void Curl_failf(struct UrlData *data, const char *fmt, ...)
|
||||
size_t Curl_sendf(int sockfd, struct connectdata *conn,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
size_t bytes_written;
|
||||
char *s;
|
||||
va_list ap;
|
||||
@@ -158,8 +158,8 @@ size_t Curl_sendf(int sockfd, struct connectdata *conn,
|
||||
va_end(ap);
|
||||
if(!s)
|
||||
return 0; /* failure */
|
||||
if(data->bits.verbose)
|
||||
fprintf(data->err, "> %s", s);
|
||||
if(data->set.verbose)
|
||||
fprintf(data->set.err, "> %s", s);
|
||||
|
||||
/* Write the buffer to the socket */
|
||||
Curl_write(conn, sockfd, s, strlen(s), &bytes_written);
|
||||
@@ -219,7 +219,7 @@ CURLcode Curl_write(struct connectdata *conn, int sockfd,
|
||||
The bit pattern defines to what "streams" to write to. Body and/or header.
|
||||
The defines are in sendf.h of course.
|
||||
*/
|
||||
CURLcode Curl_client_write(struct UrlData *data,
|
||||
CURLcode Curl_client_write(struct SessionHandle *data,
|
||||
int type,
|
||||
char *ptr,
|
||||
size_t len)
|
||||
@@ -230,22 +230,22 @@ CURLcode Curl_client_write(struct UrlData *data,
|
||||
len = strlen(ptr);
|
||||
|
||||
if(type & CLIENTWRITE_BODY) {
|
||||
wrote = data->fwrite(ptr, 1, len, data->out);
|
||||
wrote = data->set.fwrite(ptr, 1, len, data->set.out);
|
||||
if(wrote != len) {
|
||||
failf (data, "Failed writing body");
|
||||
return CURLE_WRITE_ERROR;
|
||||
}
|
||||
}
|
||||
if((type & CLIENTWRITE_HEADER) &&
|
||||
(data->fwrite_header || data->writeheader) ) {
|
||||
(data->set.fwrite_header || data->set.writeheader) ) {
|
||||
/*
|
||||
* Write headers to the same callback or to the especially setup
|
||||
* header callback function (added after version 7.7.1).
|
||||
*/
|
||||
curl_write_callback writeit=
|
||||
data->fwrite_header?data->fwrite_header:data->fwrite;
|
||||
data->set.fwrite_header?data->set.fwrite_header:data->set.fwrite;
|
||||
|
||||
wrote = writeit(ptr, 1, len, data->writeheader);
|
||||
wrote = writeit(ptr, 1, len, data->set.writeheader);
|
||||
if(wrote != len) {
|
||||
failf (data, "Failed writing header");
|
||||
return CURLE_WRITE_ERROR;
|
||||
@@ -291,3 +291,11 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd,
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -24,8 +24,8 @@
|
||||
*****************************************************************************/
|
||||
|
||||
size_t Curl_sendf(int fd, struct connectdata *, const char *fmt, ...);
|
||||
void Curl_infof(struct UrlData *, const char *fmt, ...);
|
||||
void Curl_failf(struct UrlData *, const char *fmt, ...);
|
||||
void Curl_infof(struct SessionHandle *, const char *fmt, ...);
|
||||
void Curl_failf(struct SessionHandle *, const char *fmt, ...);
|
||||
|
||||
#define infof Curl_infof
|
||||
#define failf Curl_failf
|
||||
@@ -41,7 +41,7 @@ typedef struct send_buffer send_buffer;
|
||||
#define CLIENTWRITE_HEADER 2
|
||||
#define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER)
|
||||
|
||||
CURLcode Curl_client_write(struct UrlData *data, int type, char *ptr,
|
||||
CURLcode Curl_client_write(struct SessionHandle *data, int type, char *ptr,
|
||||
size_t len);
|
||||
|
||||
/* internal read-function, does plain socket, SSL and krb4 */
|
||||
|
@@ -34,37 +34,44 @@
|
||||
#include "sendf.h"
|
||||
#include "speedcheck.h"
|
||||
|
||||
void Curl_speedinit(struct UrlData *data)
|
||||
void Curl_speedinit(struct SessionHandle *data)
|
||||
{
|
||||
memset(&data->keeps_speed, 0, sizeof(struct timeval));
|
||||
memset(&data->state.keeps_speed, 0, sizeof(struct timeval));
|
||||
}
|
||||
|
||||
CURLcode Curl_speedcheck(struct UrlData *data,
|
||||
CURLcode Curl_speedcheck(struct SessionHandle *data,
|
||||
struct timeval now)
|
||||
{
|
||||
if((data->progress.current_speed >= 0) &&
|
||||
data->low_speed_time &&
|
||||
(Curl_tvlong(data->keeps_speed) != 0) &&
|
||||
(data->progress.current_speed < data->low_speed_limit)) {
|
||||
data->set.low_speed_time &&
|
||||
(Curl_tvlong(data->state.keeps_speed) != 0) &&
|
||||
(data->progress.current_speed < data->set.low_speed_limit)) {
|
||||
|
||||
/* We are now below the "low speed limit". If we are below it
|
||||
for "low speed time" seconds we consider that enough reason
|
||||
to abort the download. */
|
||||
|
||||
if( Curl_tvdiff(now, data->keeps_speed) > data->low_speed_time) {
|
||||
if( Curl_tvdiff(now, data->state.keeps_speed) > data->set.low_speed_time) {
|
||||
/* we have been this slow for long enough, now die */
|
||||
failf(data,
|
||||
"Operation too slow. "
|
||||
"Less than %d bytes/sec transfered the last %d seconds",
|
||||
data->low_speed_limit,
|
||||
data->low_speed_time);
|
||||
data->set.low_speed_limit,
|
||||
data->set.low_speed_time);
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* we keep up the required speed all right */
|
||||
data->keeps_speed = now;
|
||||
data->state.keeps_speed = now;
|
||||
}
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -27,8 +27,8 @@
|
||||
|
||||
#include "timeval.h"
|
||||
|
||||
void Curl_speedinit(struct UrlData *data);
|
||||
CURLcode Curl_speedcheck(struct UrlData *data,
|
||||
void Curl_speedinit(struct SessionHandle *data);
|
||||
CURLcode Curl_speedcheck(struct SessionHandle *data,
|
||||
struct timeval now);
|
||||
|
||||
#endif
|
||||
|
234
lib/ssluse.c
234
lib/ssluse.c
@@ -94,9 +94,9 @@ bool seed_enough(struct connectdata *conn, /* unused for now */
|
||||
static
|
||||
int random_the_seed(struct connectdata *conn)
|
||||
{
|
||||
char *buf = conn->data->buffer; /* point to the big buffer */
|
||||
char *buf = conn->data->state.buffer; /* point to the big buffer */
|
||||
int nread=0;
|
||||
struct UrlData *data=conn->data;
|
||||
struct SessionHandle *data=conn->data;
|
||||
|
||||
/* Q: should we add support for a random file name as a libcurl option?
|
||||
A: Yes, it is here */
|
||||
@@ -104,13 +104,13 @@ int random_the_seed(struct connectdata *conn)
|
||||
#ifndef RANDOM_FILE
|
||||
/* if RANDOM_FILE isn't defined, we only perform this if an option tells
|
||||
us to! */
|
||||
if(data->ssl.random_file)
|
||||
if(data->set.ssl.random_file)
|
||||
#define RANDOM_FILE "" /* doesn't matter won't be used */
|
||||
#endif
|
||||
{
|
||||
/* let the option override the define */
|
||||
nread += RAND_load_file((data->ssl.random_file?
|
||||
data->ssl.random_file:RANDOM_FILE),
|
||||
nread += RAND_load_file((data->set.ssl.random_file?
|
||||
data->set.ssl.random_file:RANDOM_FILE),
|
||||
16384);
|
||||
if(seed_enough(conn, nread))
|
||||
return nread;
|
||||
@@ -122,13 +122,13 @@ int random_the_seed(struct connectdata *conn)
|
||||
#ifndef EGD_SOCKET
|
||||
/* If we don't have the define set, we only do this if the egd-option
|
||||
is set */
|
||||
if(data->ssl.egdsocket)
|
||||
if(data->set.ssl.egdsocket)
|
||||
#define EGD_SOCKET "" /* doesn't matter won't be used */
|
||||
#endif
|
||||
{
|
||||
/* If there's an option and a define, the option overrides the
|
||||
define */
|
||||
int ret = RAND_egd(data->ssl.egdsocket?data->ssl.egdsocket:EGD_SOCKET);
|
||||
int ret = RAND_egd(data->set.ssl.egdsocket?data->set.ssl.egdsocket:EGD_SOCKET);
|
||||
if(-1 != ret) {
|
||||
nread += ret;
|
||||
if(seed_enough(conn, nread))
|
||||
@@ -176,23 +176,23 @@ int cert_stuff(struct connectdata *conn,
|
||||
char *cert_file,
|
||||
char *key_file)
|
||||
{
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
if (cert_file != NULL) {
|
||||
SSL *ssl;
|
||||
X509 *x509;
|
||||
|
||||
if(data->cert_passwd) {
|
||||
if(data->set.cert_passwd) {
|
||||
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
|
||||
/*
|
||||
* If password has been given, we store that in the global
|
||||
* area (*shudder*) for a while:
|
||||
*/
|
||||
strcpy(global_passwd, data->cert_passwd);
|
||||
strcpy(global_passwd, data->set.cert_passwd);
|
||||
#else
|
||||
/*
|
||||
* We set the password in the callback userdata
|
||||
*/
|
||||
SSL_CTX_set_default_passwd_cb_userdata(conn->ssl.ctx, data->cert_passwd);
|
||||
SSL_CTX_set_default_passwd_cb_userdata(conn->ssl.ctx, data->set.cert_passwd);
|
||||
#endif
|
||||
/* Set passwd callback: */
|
||||
SSL_CTX_set_default_passwd_cb(conn->ssl.ctx, passwd_callback);
|
||||
@@ -200,7 +200,7 @@ int cert_stuff(struct connectdata *conn,
|
||||
|
||||
if (SSL_CTX_use_certificate_file(conn->ssl.ctx,
|
||||
cert_file,
|
||||
SSL_FILETYPE_PEM) <= 0) {
|
||||
SSL_FILETYPE_PEM) != 1) {
|
||||
failf(data, "unable to set certificate file (wrong password?)\n");
|
||||
return(0);
|
||||
}
|
||||
@@ -209,7 +209,7 @@ int cert_stuff(struct connectdata *conn,
|
||||
|
||||
if (SSL_CTX_use_PrivateKey_file(conn->ssl.ctx,
|
||||
key_file,
|
||||
SSL_FILETYPE_PEM) <= 0) {
|
||||
SSL_FILETYPE_PEM) != 1) {
|
||||
failf(data, "unable to set public key file\n");
|
||||
return(0);
|
||||
}
|
||||
@@ -263,7 +263,6 @@ static int init_ssl=0;
|
||||
void Curl_SSL_init(void)
|
||||
{
|
||||
#ifdef USE_SSLEAY
|
||||
|
||||
/* make sure this is only done once */
|
||||
if(0 != init_ssl)
|
||||
return;
|
||||
@@ -275,9 +274,32 @@ void Curl_SSL_init(void)
|
||||
|
||||
/* Setup all the global SSL stuff */
|
||||
SSLeay_add_ssl_algorithms();
|
||||
#else
|
||||
/* SSL disabled, do nothing */
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Global cleanup */
|
||||
void Curl_SSL_cleanup(void)
|
||||
{
|
||||
#ifdef USE_SSLEAY
|
||||
if(init_ssl) {
|
||||
/* only cleanup if we did a previous init */
|
||||
|
||||
/* Free the SSL error strings */
|
||||
ERR_free_strings();
|
||||
|
||||
/* EVP_cleanup() removes all ciphers and digests from the
|
||||
table. */
|
||||
EVP_cleanup();
|
||||
}
|
||||
#else
|
||||
/* SSL disabled, do nothing */
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef USE_SSLEAY
|
||||
|
||||
/*
|
||||
* This function is called when an SSL connection is closed.
|
||||
*/
|
||||
@@ -310,32 +332,15 @@ void Curl_SSL_Close(struct connectdata *conn)
|
||||
}
|
||||
}
|
||||
|
||||
/* Global cleanup */
|
||||
void Curl_SSL_cleanup(void)
|
||||
{
|
||||
#ifdef USE_SSLEAY
|
||||
|
||||
if(init_ssl) {
|
||||
/* only cleanup if we did a previous init */
|
||||
|
||||
/* Free the SSL error strings */
|
||||
ERR_free_strings();
|
||||
|
||||
/* EVP_cleanup() removes all ciphers and digests from the
|
||||
table. */
|
||||
EVP_cleanup();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* This sets up a session cache to the specified size.
|
||||
*/
|
||||
CURLcode Curl_SSL_InitSessions(struct UrlData *data, long amount)
|
||||
CURLcode Curl_SSL_InitSessions(struct SessionHandle *data, long amount)
|
||||
{
|
||||
struct curl_ssl_session *session;
|
||||
|
||||
if(data->ssl.session)
|
||||
if(data->state.session)
|
||||
/* this is just a precaution to prevent multiple inits */
|
||||
return CURLE_OK;
|
||||
|
||||
@@ -348,9 +353,9 @@ CURLcode Curl_SSL_InitSessions(struct UrlData *data, long amount)
|
||||
memset(session, 0, amount * sizeof(struct curl_ssl_session));
|
||||
|
||||
/* store the info in the SSL section */
|
||||
data->ssl.numsessions = amount;
|
||||
data->ssl.session = session;
|
||||
data->ssl.sessionage = 1; /* this is brand new */
|
||||
data->set.ssl.numsessions = amount;
|
||||
data->state.session = session;
|
||||
data->state.sessionage = 1; /* this is brand new */
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
@@ -363,19 +368,19 @@ static int Get_SSL_Session(struct connectdata *conn,
|
||||
SSL_SESSION **ssl_sessionid)
|
||||
{
|
||||
struct curl_ssl_session *check;
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
long i;
|
||||
|
||||
for(i=0; i< data->ssl.numsessions; i++) {
|
||||
check = &data->ssl.session[i];
|
||||
for(i=0; i< data->set.ssl.numsessions; i++) {
|
||||
check = &data->state.session[i];
|
||||
if(!check->sessionid)
|
||||
/* not session ID means blank entry */
|
||||
continue;
|
||||
if(strequal(conn->name, check->name) &&
|
||||
(conn->remote_port == check->remote_port) ) {
|
||||
/* yes, we have a session ID! */
|
||||
data->ssl.sessionage++; /* increase general age */
|
||||
check->age = data->ssl.sessionage; /* set this as used in this age */
|
||||
data->state.sessionage++; /* increase general age */
|
||||
check->age = data->state.sessionage; /* set this as used in this age */
|
||||
*ssl_sessionid = check->sessionid;
|
||||
return FALSE;
|
||||
}
|
||||
@@ -409,16 +414,18 @@ static int Kill_Single_Session(struct curl_ssl_session *session)
|
||||
* This function is called when the 'data' struct is going away. Close
|
||||
* down everything and free all resources!
|
||||
*/
|
||||
int Curl_SSL_Close_All(struct UrlData *data)
|
||||
int Curl_SSL_Close_All(struct SessionHandle *data)
|
||||
{
|
||||
int i;
|
||||
for(i=0; i< data->ssl.numsessions; i++)
|
||||
|
||||
if(data->state.session) {
|
||||
for(i=0; i< data->set.ssl.numsessions; i++)
|
||||
/* the single-killer function handles empty table slots */
|
||||
Kill_Single_Session(&data->ssl.session[i]);
|
||||
Kill_Single_Session(&data->state.session[i]);
|
||||
|
||||
/* free the cache data */
|
||||
free(data->ssl.session);
|
||||
|
||||
free(data->state.session);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -430,8 +437,8 @@ static int Store_SSL_Session(struct connectdata *conn)
|
||||
SSL_SESSION *ssl_sessionid;
|
||||
struct curl_ssl_session *store;
|
||||
int i;
|
||||
struct UrlData *data=conn->data; /* the mother of all structs */
|
||||
int oldest_age=data->ssl.session[0].age; /* zero if unused */
|
||||
struct SessionHandle *data=conn->data; /* the mother of all structs */
|
||||
int oldest_age=data->state.session[0].age; /* zero if unused */
|
||||
|
||||
/* ask OpenSSL, say please */
|
||||
ssl_sessionid = SSL_get1_session(conn->ssl.handle);
|
||||
@@ -444,27 +451,76 @@ static int Store_SSL_Session(struct connectdata *conn)
|
||||
the oldest if necessary) */
|
||||
|
||||
/* find an empty slot for us, or find the oldest */
|
||||
for(i=0; (i<data->ssl.numsessions) && data->ssl.session[i].sessionid; i++) {
|
||||
if(data->ssl.session[i].age < oldest_age) {
|
||||
oldest_age = data->ssl.session[i].age;
|
||||
store = &data->ssl.session[i];
|
||||
for(i=0; (i<data->set.ssl.numsessions) && data->state.session[i].sessionid; i++) {
|
||||
if(data->state.session[i].age < oldest_age) {
|
||||
oldest_age = data->state.session[i].age;
|
||||
store = &data->state.session[i];
|
||||
}
|
||||
}
|
||||
if(i == data->ssl.numsessions)
|
||||
if(i == data->set.ssl.numsessions)
|
||||
/* cache is full, we must "kill" the oldest entry! */
|
||||
Kill_Single_Session(store);
|
||||
else
|
||||
store = &data->ssl.session[i]; /* use this slot */
|
||||
store = &data->state.session[i]; /* use this slot */
|
||||
|
||||
/* now init the session struct wisely */
|
||||
store->sessionid = ssl_sessionid;
|
||||
store->age = data->ssl.sessionage; /* set current age */
|
||||
store->age = data->state.sessionage; /* set current age */
|
||||
store->name = strdup(conn->name); /* clone host name */
|
||||
store->remote_port = conn->remote_port; /* port number */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int Curl_ASN1_UTCTIME_output(struct connectdata *conn,
|
||||
const char *prefix,
|
||||
ASN1_UTCTIME *tm)
|
||||
{
|
||||
char *asn1_string;
|
||||
int gmt=FALSE;
|
||||
int i;
|
||||
int year=0,month=0,day=0,hour=0,minute=0,second=0;
|
||||
struct SessionHandle *data = conn->data;
|
||||
|
||||
if(!data->set.verbose)
|
||||
return 0;
|
||||
|
||||
i=tm->length;
|
||||
asn1_string=(char *)tm->data;
|
||||
|
||||
if (i < 10)
|
||||
return 1;
|
||||
if (asn1_string[i-1] == 'Z')
|
||||
gmt=TRUE;
|
||||
for (i=0; i<10; i++)
|
||||
if ((asn1_string[i] > '9') || (asn1_string[i] < '0'))
|
||||
return 2;
|
||||
|
||||
year= (asn1_string[0]-'0')*10+(asn1_string[1]-'0');
|
||||
if (year < 50)
|
||||
year+=100;
|
||||
|
||||
month= (asn1_string[2]-'0')*10+(asn1_string[3]-'0');
|
||||
if ((month > 12) || (month < 1))
|
||||
return 3;
|
||||
|
||||
day= (asn1_string[4]-'0')*10+(asn1_string[5]-'0');
|
||||
hour= (asn1_string[6]-'0')*10+(asn1_string[7]-'0');
|
||||
minute= (asn1_string[8]-'0')*10+(asn1_string[9]-'0');
|
||||
|
||||
if ( (asn1_string[10] >= '0') && (asn1_string[10] <= '9') &&
|
||||
(asn1_string[11] >= '0') && (asn1_string[11] <= '9'))
|
||||
second= (asn1_string[10]-'0')*10+(asn1_string[11]-'0');
|
||||
|
||||
infof(data,
|
||||
"%s%04d-%02d-%02d %02d:%02d:%02d %s\n",
|
||||
prefix, year+1900, month, day, hour, minute, second, (gmt?"GMT":""));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* ====================================================== */
|
||||
CURLcode
|
||||
Curl_SSLConnect(struct connectdata *conn)
|
||||
@@ -472,11 +528,12 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
CURLcode retcode = CURLE_OK;
|
||||
|
||||
#ifdef USE_SSLEAY
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
int err;
|
||||
char * str;
|
||||
SSL_METHOD *req_method;
|
||||
SSL_SESSION *ssl_sessionid=NULL;
|
||||
ASN1_TIME *certdate;
|
||||
|
||||
/* mark this is being ssl enabled from here on out. */
|
||||
conn->ssl.use = TRUE;
|
||||
@@ -484,7 +541,7 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
/* Make funny stuff to get random input */
|
||||
random_the_seed(conn);
|
||||
|
||||
switch(data->ssl.version) {
|
||||
switch(data->set.ssl.version) {
|
||||
default:
|
||||
req_method = SSLv23_client_method();
|
||||
break;
|
||||
@@ -503,21 +560,29 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
}
|
||||
|
||||
if(data->cert) {
|
||||
if (!cert_stuff(conn, data->cert, data->cert)) {
|
||||
if(data->set.cert) {
|
||||
if (!cert_stuff(conn, data->set.cert, data->set.cert)) {
|
||||
/* failf() is already done in cert_stuff() */
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if(data->ssl.verifypeer){
|
||||
if(data->set.ssl.cipher_list) {
|
||||
if (!SSL_CTX_set_cipher_list(conn->ssl.ctx,
|
||||
data->set.ssl.cipher_list)) {
|
||||
failf(data, "failed setting cipher list\n");
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
}
|
||||
|
||||
if(data->set.ssl.verifypeer){
|
||||
SSL_CTX_set_verify(conn->ssl.ctx,
|
||||
SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
|
||||
SSL_VERIFY_CLIENT_ONCE,
|
||||
cert_verify_callback);
|
||||
if (!SSL_CTX_load_verify_locations(conn->ssl.ctx,
|
||||
data->ssl.CAfile,
|
||||
data->ssl.CApath)) {
|
||||
data->set.ssl.CAfile,
|
||||
data->set.ssl.CApath)) {
|
||||
failf(data,"error setting cerficate verify locations\n");
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
@@ -547,7 +612,10 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
SSL_set_fd (conn->ssl.handle, conn->firstsocket);
|
||||
err = SSL_connect (conn->ssl.handle);
|
||||
|
||||
if (-1 == err) {
|
||||
/* 1 is fine
|
||||
0 is "not successful but was shut down controlled"
|
||||
<0 is "handshake was not successful, because a fatal error occurred" */
|
||||
if (err <= 0) {
|
||||
err = ERR_get_error();
|
||||
failf(data, "SSL: %s", ERR_error_string(err, NULL));
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
@@ -587,23 +655,35 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
infof(data, "\t subject: %s\n", str);
|
||||
CRYPTO_free(str);
|
||||
|
||||
if (data->ssl.verifyhost) {
|
||||
certdate = X509_get_notBefore(conn->ssl.server_cert);
|
||||
Curl_ASN1_UTCTIME_output(conn, "\t start date: ", certdate);
|
||||
|
||||
certdate = X509_get_notAfter(conn->ssl.server_cert);
|
||||
Curl_ASN1_UTCTIME_output(conn, "\t expire date: ", certdate);
|
||||
|
||||
if (data->set.ssl.verifyhost) {
|
||||
char peer_CN[257];
|
||||
if (X509_NAME_get_text_by_NID(X509_get_subject_name(conn->ssl.server_cert), NID_commonName, peer_CN, sizeof(peer_CN)) < 0) {
|
||||
if (X509_NAME_get_text_by_NID(X509_get_subject_name(conn->ssl.server_cert),
|
||||
NID_commonName,
|
||||
peer_CN,
|
||||
sizeof(peer_CN)) < 0) {
|
||||
failf(data, "SSL: unable to obtain common name from peer certificate");
|
||||
X509_free(conn->ssl.server_cert);
|
||||
return CURLE_SSL_PEER_CERTIFICATE;
|
||||
}
|
||||
|
||||
if (!strequal(peer_CN, conn->hostname)) {
|
||||
if (data->ssl.verifyhost > 1) {
|
||||
failf(data, "SSL: certificate subject name '%s' does not match target host name '%s'",
|
||||
if (data->set.ssl.verifyhost > 1) {
|
||||
failf(data, "SSL: certificate subject name '%s' does not match "
|
||||
"target host name '%s'",
|
||||
peer_CN, conn->hostname);
|
||||
X509_free(conn->ssl.server_cert);
|
||||
return CURLE_SSL_PEER_CERTIFICATE;
|
||||
}
|
||||
else
|
||||
infof(data, "\t common name: %s (does not match '%s')\n", peer_CN, conn->hostname);
|
||||
infof(data,
|
||||
"\t common name: %s (does not match '%s')\n",
|
||||
peer_CN, conn->hostname);
|
||||
}
|
||||
else
|
||||
infof(data, "\t common name: %s (matched)\n", peer_CN);
|
||||
@@ -622,16 +702,16 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
/* We could do all sorts of certificate verification stuff here before
|
||||
deallocating the certificate. */
|
||||
|
||||
if(data->ssl.verifypeer) {
|
||||
data->ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle);
|
||||
if (data->ssl.certverifyresult != X509_V_OK) {
|
||||
if(data->set.ssl.verifypeer) {
|
||||
data->set.ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle);
|
||||
if (data->set.ssl.certverifyresult != X509_V_OK) {
|
||||
failf(data, "SSL certificate verify result: %d\n",
|
||||
data->ssl.certverifyresult);
|
||||
data->set.ssl.certverifyresult);
|
||||
retcode = CURLE_SSL_PEER_CERTIFICATE;
|
||||
}
|
||||
}
|
||||
else
|
||||
data->ssl.certverifyresult=0;
|
||||
data->set.ssl.certverifyresult=0;
|
||||
|
||||
X509_free(conn->ssl.server_cert);
|
||||
#else /* USE_SSLEAY */
|
||||
@@ -640,3 +720,11 @@ Curl_SSLConnect(struct connectdata *conn)
|
||||
#endif
|
||||
return retcode;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -24,14 +24,15 @@
|
||||
*****************************************************************************/
|
||||
#include "urldata.h"
|
||||
CURLcode Curl_SSLConnect(struct connectdata *conn);
|
||||
|
||||
void Curl_SSL_init(void); /* Global SSL init */
|
||||
void Curl_SSL_cleanup(void); /* Global SSL cleanup */
|
||||
|
||||
/* init the SSL session ID cache */
|
||||
CURLcode Curl_SSL_InitSessions(struct UrlData *, long);
|
||||
CURLcode Curl_SSL_InitSessions(struct SessionHandle *, long);
|
||||
void Curl_SSL_Close(struct connectdata *conn); /* close a SSL connection */
|
||||
|
||||
/* tell the SSL stuff to close down all open information regarding
|
||||
connections (and thus session ID caching etc) */
|
||||
int Curl_SSL_Close_All(struct UrlData *data);
|
||||
int Curl_SSL_Close_All(struct SessionHandle *data);
|
||||
#endif
|
||||
|
@@ -107,3 +107,11 @@ size_t Curl_strlcat(char *dst, const char *src, size_t siz)
|
||||
return(dlen + (s - src)); /* count does not include NUL */
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -65,3 +65,10 @@ Curl_strtok_r(char *ptr, const char *sep, char **end)
|
||||
|
||||
#endif /* this was only compiled if strtok_r wasn't present */
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
136
lib/telnet.c
136
lib/telnet.c
@@ -35,7 +35,7 @@
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
||||
#include <winsock.h>
|
||||
#include <winsock2.h>
|
||||
#include <time.h>
|
||||
#include <io.h>
|
||||
#else
|
||||
@@ -105,7 +105,7 @@ void telrcv(struct connectdata *,
|
||||
unsigned char *inbuf, /* Data received from socket */
|
||||
int count); /* Number of bytes received */
|
||||
|
||||
static void printoption(struct UrlData *data,
|
||||
static void printoption(struct SessionHandle *data,
|
||||
const char *direction,
|
||||
int cmd, int option);
|
||||
|
||||
@@ -114,7 +114,7 @@ static void send_negotiation(struct connectdata *, int cmd, int option);
|
||||
static void set_local_option(struct connectdata *, int cmd, int option);
|
||||
static void set_remote_option(struct connectdata *, int cmd, int option);
|
||||
|
||||
static void printsub(struct UrlData *data,
|
||||
static void printsub(struct SessionHandle *data,
|
||||
int direction, unsigned char *pointer, int length);
|
||||
static void suboption(struct connectdata *);
|
||||
|
||||
@@ -152,8 +152,8 @@ struct TELNET {
|
||||
int him[256];
|
||||
int himq[256];
|
||||
int him_preferred[256];
|
||||
char *subopt_ttype; /* Set with suboption TTYPE */
|
||||
char *subopt_xdisploc; /* Set with suboption XDISPLOC */
|
||||
char subopt_ttype[32]; /* Set with suboption TTYPE */
|
||||
char subopt_xdisploc[128]; /* Set with suboption XDISPLOC */
|
||||
struct curl_slist *telnet_vars; /* Environment variables */
|
||||
|
||||
/* suboptions */
|
||||
@@ -215,13 +215,13 @@ static void negotiate(struct connectdata *conn)
|
||||
}
|
||||
}
|
||||
|
||||
static void printoption(struct UrlData *data,
|
||||
static void printoption(struct SessionHandle *data,
|
||||
const char *direction, int cmd, int option)
|
||||
{
|
||||
const char *fmt;
|
||||
const char *opt;
|
||||
|
||||
if (data->bits.verbose)
|
||||
if (data->set.verbose)
|
||||
{
|
||||
if (cmd == IAC)
|
||||
{
|
||||
@@ -627,14 +627,14 @@ void rec_dont(struct connectdata *conn, int option)
|
||||
}
|
||||
|
||||
|
||||
static void printsub(struct UrlData *data,
|
||||
static void printsub(struct SessionHandle *data,
|
||||
int direction, /* '<' or '>' */
|
||||
unsigned char *pointer, /* where suboption data is */
|
||||
int length) /* length of suboption data */
|
||||
{
|
||||
int i = 0;
|
||||
|
||||
if (data->bits.verbose)
|
||||
if (data->set.verbose)
|
||||
{
|
||||
if (direction)
|
||||
{
|
||||
@@ -745,7 +745,7 @@ static int check_telnet_options(struct connectdata *conn)
|
||||
char option_keyword[128];
|
||||
char option_arg[256];
|
||||
char *buf;
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
||||
|
||||
/* Add the user name as an environment variable if it
|
||||
@@ -753,26 +753,28 @@ static int check_telnet_options(struct connectdata *conn)
|
||||
if(conn->bits.user_passwd)
|
||||
{
|
||||
char *buf = malloc(256);
|
||||
sprintf(buf, "USER,%s", data->user);
|
||||
sprintf(buf, "USER,%s", data->state.user);
|
||||
tn->telnet_vars = curl_slist_append(tn->telnet_vars, buf);
|
||||
|
||||
tn->us_preferred[TELOPT_NEW_ENVIRON] = YES;
|
||||
}
|
||||
|
||||
for(head = data->telnet_options; head; head=head->next) {
|
||||
for(head = data->set.telnet_options; head; head=head->next) {
|
||||
if(sscanf(head->data, "%127[^= ]%*[ =]%255s",
|
||||
option_keyword, option_arg) == 2) {
|
||||
|
||||
/* Terminal type */
|
||||
if(strequal(option_keyword, "TTYPE")) {
|
||||
tn->subopt_ttype = option_arg;
|
||||
strncpy(tn->subopt_ttype, option_arg, 31);
|
||||
tn->subopt_ttype[31] = 0; /* String termination */
|
||||
tn->us_preferred[TELOPT_TTYPE] = YES;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Display variable */
|
||||
if(strequal(option_keyword, "XDISPLOC")) {
|
||||
tn->subopt_xdisploc = option_arg;
|
||||
strncpy(tn->subopt_xdisploc, option_arg, 127);
|
||||
tn->subopt_xdisploc[127] = 0; /* String termination */
|
||||
tn->us_preferred[TELOPT_XDISPLOC] = YES;
|
||||
continue;
|
||||
}
|
||||
@@ -814,7 +816,7 @@ static void suboption(struct connectdata *conn)
|
||||
int tmplen;
|
||||
char varname[128];
|
||||
char varval[128];
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
||||
|
||||
printsub(data, '<', (unsigned char *)tn->subbuffer, SB_LEN(tn)+2);
|
||||
@@ -868,7 +870,7 @@ void telrcv(struct connectdata *conn,
|
||||
{
|
||||
unsigned char c;
|
||||
int index = 0;
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
||||
|
||||
while(count--)
|
||||
@@ -1031,13 +1033,20 @@ CURLcode Curl_telnet_done(struct connectdata *conn)
|
||||
CURLcode Curl_telnet(struct connectdata *conn)
|
||||
{
|
||||
CURLcode code;
|
||||
struct UrlData *data = conn->data;
|
||||
struct SessionHandle *data = conn->data;
|
||||
int sockfd = conn->firstsocket;
|
||||
#ifdef WIN32
|
||||
WSAEVENT event_handle;
|
||||
WSANETWORKEVENTS events;
|
||||
HANDLE stdin_handle;
|
||||
HANDLE objs[2];
|
||||
DWORD waitret;
|
||||
#else
|
||||
fd_set readfd;
|
||||
fd_set keepfd;
|
||||
|
||||
#endif
|
||||
bool keepon = TRUE;
|
||||
char *buf = data->buffer;
|
||||
char *buf = data->state.buffer;
|
||||
ssize_t nread;
|
||||
struct TELNET *tn;
|
||||
|
||||
@@ -1051,6 +1060,86 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
||||
if(code)
|
||||
return code;
|
||||
|
||||
#ifdef WIN32
|
||||
/* We want to wait for both stdin and the socket. Since
|
||||
** the select() function in winsock only works on sockets
|
||||
** we have to use the WaitForMultipleObjects() call.
|
||||
*/
|
||||
|
||||
/* First, create a sockets event object */
|
||||
event_handle = WSACreateEvent();
|
||||
|
||||
/* The get the Windows file handle for stdin */
|
||||
stdin_handle = GetStdHandle(STD_INPUT_HANDLE);
|
||||
|
||||
/* Create the list of objects to wait for */
|
||||
objs[0] = stdin_handle;
|
||||
objs[1] = event_handle;
|
||||
|
||||
/* Tell winsock what events we want to listen to */
|
||||
if(WSAEventSelect(sockfd, event_handle, FD_READ|FD_CLOSE) == SOCKET_ERROR) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Keep on listening and act on events */
|
||||
while(keepon) {
|
||||
waitret = WaitForMultipleObjects(2, objs, FALSE, INFINITE);
|
||||
switch(waitret - WAIT_OBJECT_0)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
unsigned char outbuf[2];
|
||||
int out_count = 0;
|
||||
size_t bytes_written;
|
||||
char *buffer = buf;
|
||||
|
||||
if(!ReadFile(stdin_handle, buf, 255, &nread, NULL)) {
|
||||
keepon = FALSE;
|
||||
break;
|
||||
}
|
||||
|
||||
while(nread--) {
|
||||
outbuf[0] = *buffer++;
|
||||
out_count = 1;
|
||||
if(outbuf[0] == IAC)
|
||||
outbuf[out_count++] = IAC;
|
||||
|
||||
Curl_write(conn, conn->firstsocket, outbuf,
|
||||
out_count, &bytes_written);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case 1:
|
||||
if(WSAEnumNetworkEvents(sockfd, event_handle, &events)
|
||||
!= SOCKET_ERROR)
|
||||
{
|
||||
if(events.lNetworkEvents & FD_READ)
|
||||
{
|
||||
Curl_read(conn, sockfd, buf, BUFSIZE - 1, &nread);
|
||||
|
||||
telrcv(conn, (unsigned char *)buf, nread);
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
/* Negotiate if the peer has started negotiating,
|
||||
otherwise don't. We don't want to speak telnet with
|
||||
non-telnet servers, like POP or SMTP. */
|
||||
if(tn->please_negotiate && !tn->already_negotiated) {
|
||||
negotiate(conn);
|
||||
tn->already_negotiated = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if(events.lNetworkEvents & FD_CLOSE)
|
||||
{
|
||||
keepon = FALSE;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
#else
|
||||
FD_ZERO (&readfd); /* clear it */
|
||||
FD_SET (sockfd, &readfd);
|
||||
FD_SET (1, &readfd);
|
||||
@@ -1108,6 +1197,15 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
/* mark this as "no further transfer wanted" */
|
||||
return Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -74,3 +74,11 @@ long Curl_tvlong (struct timeval t1)
|
||||
{
|
||||
return t1.tv_sec;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
169
lib/transfer.c
169
lib/transfer.c
@@ -209,16 +209,16 @@ Transfer(struct connectdata *c_conn)
|
||||
int writetype;
|
||||
|
||||
/* the highest fd we use + 1 */
|
||||
struct UrlData *data;
|
||||
struct SessionHandle *data;
|
||||
struct connectdata *conn = (struct connectdata *)c_conn;
|
||||
char *buf;
|
||||
int maxfd;
|
||||
|
||||
data = conn->data; /* there's the root struct */
|
||||
buf = data->buffer;
|
||||
buf = data->state.buffer;
|
||||
maxfd = (conn->sockfd>conn->writesockfd?conn->sockfd:conn->writesockfd)+1;
|
||||
|
||||
hbufp = data->headerbuff;
|
||||
hbufp = data->state.headerbuff;
|
||||
|
||||
myalarm (0); /* switch off the alarm-style timeout */
|
||||
|
||||
@@ -244,7 +244,7 @@ Transfer(struct connectdata *c_conn)
|
||||
}
|
||||
/* we want header and/or body, if neither then don't do this! */
|
||||
if(conn->getheader ||
|
||||
!data->bits.no_body) {
|
||||
!data->set.no_body) {
|
||||
fd_set readfd;
|
||||
fd_set writefd;
|
||||
fd_set rkeepfd;
|
||||
@@ -267,7 +267,7 @@ Transfer(struct connectdata *c_conn)
|
||||
|
||||
FD_ZERO (&writefd); /* clear it */
|
||||
if(conn->writesockfd != -1) {
|
||||
if (data->bits.expect100header)
|
||||
if (data->set.expect100header)
|
||||
/* wait with write until we either got 100-continue or a timeout */
|
||||
write_after_100_header = TRUE;
|
||||
else {
|
||||
@@ -350,19 +350,19 @@ Transfer(struct connectdata *c_conn)
|
||||
* We enlarge the header buffer if it seems to be too
|
||||
* smallish
|
||||
*/
|
||||
if (hbuflen + (int)str_length >= data->headersize) {
|
||||
if (hbuflen + (int)str_length >= data->state.headersize) {
|
||||
char *newbuff;
|
||||
long newsize=MAX((hbuflen+str_length)*3/2,
|
||||
data->headersize*2);
|
||||
hbufp_index = hbufp - data->headerbuff;
|
||||
newbuff = (char *)realloc(data->headerbuff, newsize);
|
||||
data->state.headersize*2);
|
||||
hbufp_index = hbufp - data->state.headerbuff;
|
||||
newbuff = (char *)realloc(data->state.headerbuff, newsize);
|
||||
if(!newbuff) {
|
||||
failf (data, "Failed to alloc memory for big header!");
|
||||
return CURLE_READ_ERROR;
|
||||
}
|
||||
data->headersize=newsize;
|
||||
data->headerbuff = newbuff;
|
||||
hbufp = data->headerbuff + hbufp_index;
|
||||
data->state.headersize=newsize;
|
||||
data->state.headerbuff = newbuff;
|
||||
hbufp = data->state.headerbuff + hbufp_index;
|
||||
}
|
||||
strcpy (hbufp, str);
|
||||
hbufp += strlen (str);
|
||||
@@ -378,19 +378,19 @@ Transfer(struct connectdata *c_conn)
|
||||
* fit in the allocated header buffer, or else we enlarge
|
||||
* it.
|
||||
*/
|
||||
if (hbuflen + (str - str_start) >= data->headersize) {
|
||||
if (hbuflen + (str - str_start) >= data->state.headersize) {
|
||||
char *newbuff;
|
||||
long newsize=MAX((hbuflen+(str-str_start))*3/2,
|
||||
data->headersize*2);
|
||||
hbufp_index = hbufp - data->headerbuff;
|
||||
newbuff = (char *)realloc(data->headerbuff, newsize);
|
||||
data->state.headersize*2);
|
||||
hbufp_index = hbufp - data->state.headerbuff;
|
||||
newbuff = (char *)realloc(data->state.headerbuff, newsize);
|
||||
if(!newbuff) {
|
||||
failf (data, "Failed to alloc memory for big header!");
|
||||
return CURLE_READ_ERROR;
|
||||
}
|
||||
data->headersize= newsize;
|
||||
data->headerbuff = newbuff;
|
||||
hbufp = data->headerbuff + hbufp_index;
|
||||
data->state.headersize= newsize;
|
||||
data->state.headerbuff = newbuff;
|
||||
hbufp = data->state.headerbuff + hbufp_index;
|
||||
}
|
||||
|
||||
/* copy to end of line */
|
||||
@@ -399,7 +399,7 @@ Transfer(struct connectdata *c_conn)
|
||||
hbuflen += str - str_start;
|
||||
*hbufp = 0;
|
||||
|
||||
p = data->headerbuff;
|
||||
p = data->state.headerbuff;
|
||||
|
||||
/****
|
||||
* We now have a FULL header line that p points to
|
||||
@@ -449,15 +449,15 @@ Transfer(struct connectdata *c_conn)
|
||||
/* now, only output this if the header AND body are requested:
|
||||
*/
|
||||
writetype = CLIENTWRITE_HEADER;
|
||||
if (data->bits.http_include_header)
|
||||
if (data->set.http_include_header)
|
||||
writetype |= CLIENTWRITE_BODY;
|
||||
|
||||
urg = Curl_client_write(data, writetype, data->headerbuff,
|
||||
p - data->headerbuff);
|
||||
urg = Curl_client_write(data, writetype, data->state.headerbuff,
|
||||
p - data->state.headerbuff);
|
||||
if(urg)
|
||||
return urg;
|
||||
|
||||
data->header_size += p - data->headerbuff;
|
||||
data->info.header_size += p - data->state.headerbuff;
|
||||
|
||||
if(!header) {
|
||||
/*
|
||||
@@ -466,7 +466,7 @@ Transfer(struct connectdata *c_conn)
|
||||
* If we requested a "no body", this is a good time to get
|
||||
* out and return home.
|
||||
*/
|
||||
if(data->bits.no_body)
|
||||
if(data->set.no_body)
|
||||
return CURLE_OK;
|
||||
|
||||
if(!conn->bits.close) {
|
||||
@@ -489,7 +489,7 @@ Transfer(struct connectdata *c_conn)
|
||||
|
||||
/* We continue reading headers, so reset the line-based
|
||||
header parsing variables hbufp && hbuflen */
|
||||
hbufp = data->headerbuff;
|
||||
hbufp = data->state.headerbuff;
|
||||
hbuflen = 0;
|
||||
continue;
|
||||
}
|
||||
@@ -516,17 +516,17 @@ Transfer(struct connectdata *c_conn)
|
||||
}
|
||||
|
||||
if (nc) {
|
||||
data->progress.httpcode = httpcode;
|
||||
data->progress.httpversion = httpversion;
|
||||
data->info.httpcode = httpcode;
|
||||
data->info.httpversion = httpversion;
|
||||
|
||||
/* 404 -> URL not found! */
|
||||
if (
|
||||
( ((data->bits.http_follow_location) &&
|
||||
( ((data->set.http_follow_location) &&
|
||||
(httpcode >= 400))
|
||||
||
|
||||
(!data->bits.http_follow_location &&
|
||||
(!data->set.http_follow_location &&
|
||||
(httpcode >= 300)))
|
||||
&& (data->bits.http_fail_on_error)) {
|
||||
&& (data->set.http_fail_on_error)) {
|
||||
/* If we have been told to fail hard on HTTP-errors,
|
||||
here is the check for that: */
|
||||
/* serious error, go home! */
|
||||
@@ -624,14 +624,14 @@ Transfer(struct connectdata *c_conn)
|
||||
}
|
||||
else if(strnequal("Last-Modified:", p,
|
||||
strlen("Last-Modified:")) &&
|
||||
(data->timecondition || data->bits.get_filetime) ) {
|
||||
(data->set.timecondition || data->set.get_filetime) ) {
|
||||
time_t secs=time(NULL);
|
||||
timeofdoc = curl_getdate(p+strlen("Last-Modified:"), &secs);
|
||||
if(data->bits.get_filetime)
|
||||
data->progress.filetime = timeofdoc;
|
||||
if(data->set.get_filetime)
|
||||
data->info.filetime = timeofdoc;
|
||||
}
|
||||
else if ((httpcode >= 300 && httpcode < 400) &&
|
||||
(data->bits.http_follow_location) &&
|
||||
(data->set.http_follow_location) &&
|
||||
strnequal("Location:", p, 9)) {
|
||||
/* this is the URL that the server advices us to get instead */
|
||||
char *ptr;
|
||||
@@ -660,17 +660,17 @@ Transfer(struct connectdata *c_conn)
|
||||
*/
|
||||
|
||||
writetype = CLIENTWRITE_HEADER;
|
||||
if (data->bits.http_include_header)
|
||||
if (data->set.http_include_header)
|
||||
writetype |= CLIENTWRITE_BODY;
|
||||
|
||||
urg = Curl_client_write(data, writetype, p, hbuflen);
|
||||
if(urg)
|
||||
return urg;
|
||||
|
||||
data->header_size += hbuflen;
|
||||
data->info.header_size += hbuflen;
|
||||
|
||||
/* reset hbufp pointer && hbuflen */
|
||||
hbufp = data->headerbuff;
|
||||
hbufp = data->state.headerbuff;
|
||||
hbuflen = 0;
|
||||
}
|
||||
while (*str); /* header line within buffer */
|
||||
@@ -706,7 +706,7 @@ Transfer(struct connectdata *c_conn)
|
||||
}
|
||||
else if (conn->resume_from &&
|
||||
!content_range &&
|
||||
(data->httpreq==HTTPREQ_GET)) {
|
||||
(data->set.httpreq==HTTPREQ_GET)) {
|
||||
/* we wanted to resume a download, although the server
|
||||
doesn't seem to support this and we did this with a GET
|
||||
(if it wasn't a GET we did a POST or PUT resume) */
|
||||
@@ -714,23 +714,23 @@ Transfer(struct connectdata *c_conn)
|
||||
"byte ranges. Cannot resume.");
|
||||
return CURLE_HTTP_RANGE_ERROR;
|
||||
}
|
||||
else if(data->timecondition && !conn->range) {
|
||||
else if(data->set.timecondition && !conn->range) {
|
||||
/* A time condition has been set AND no ranges have been
|
||||
requested. This seems to be what chapter 13.3.4 of
|
||||
RFC 2616 defines to be the correct action for a
|
||||
HTTP/1.1 client */
|
||||
if((timeofdoc > 0) && (data->timevalue > 0)) {
|
||||
switch(data->timecondition) {
|
||||
if((timeofdoc > 0) && (data->set.timevalue > 0)) {
|
||||
switch(data->set.timecondition) {
|
||||
case TIMECOND_IFMODSINCE:
|
||||
default:
|
||||
if(timeofdoc < data->timevalue) {
|
||||
if(timeofdoc < data->set.timevalue) {
|
||||
infof(data,
|
||||
"The requested document is not new enough\n");
|
||||
return CURLE_OK;
|
||||
}
|
||||
break;
|
||||
case TIMECOND_IFUNMODSINCE:
|
||||
if(timeofdoc > data->timevalue) {
|
||||
if(timeofdoc > data->set.timevalue) {
|
||||
infof(data,
|
||||
"The requested document is not old enough\n");
|
||||
return CURLE_OK;
|
||||
@@ -797,14 +797,10 @@ Transfer(struct connectdata *c_conn)
|
||||
if((keepon & KEEP_WRITE) && FD_ISSET(conn->writesockfd, &writefd)) {
|
||||
/* write */
|
||||
|
||||
char scratch[BUFSIZE * 2];
|
||||
int i, si;
|
||||
size_t bytes_written;
|
||||
|
||||
if(data->crlf)
|
||||
buf = data->buffer; /* put it back on the buffer */
|
||||
|
||||
nread = data->fread(buf, 1, conn->upload_bufsize, data->in);
|
||||
nread = data->set.fread(buf, 1, conn->upload_bufsize, data->set.in);
|
||||
|
||||
/* the signed int typecase of nread of for systems that has
|
||||
unsigned size_t */
|
||||
@@ -818,18 +814,18 @@ Transfer(struct connectdata *c_conn)
|
||||
Curl_pgrsSetUploadCounter(data, (double)writebytecount);
|
||||
|
||||
/* convert LF to CRLF if so asked */
|
||||
if (data->crlf) {
|
||||
if (data->set.crlf) {
|
||||
for(i = 0, si = 0; i < (int)nread; i++, si++) {
|
||||
if (buf[i] == 0x0a) {
|
||||
scratch[si++] = 0x0d;
|
||||
scratch[si] = 0x0a;
|
||||
data->state.scratch[si++] = 0x0d;
|
||||
data->state.scratch[si] = 0x0a;
|
||||
}
|
||||
else {
|
||||
scratch[si] = buf[i];
|
||||
data->state.scratch[si] = buf[i];
|
||||
}
|
||||
}
|
||||
nread = si;
|
||||
buf = scratch; /* point to the new buffer */
|
||||
buf = data->state.scratch; /* point to the new buffer */
|
||||
}
|
||||
|
||||
/* write to socket */
|
||||
@@ -840,6 +836,8 @@ Transfer(struct connectdata *c_conn)
|
||||
failf(data, "Failed uploading data");
|
||||
return CURLE_WRITE_ERROR;
|
||||
}
|
||||
if(data->set.crlf)
|
||||
buf = data->state.buffer; /* put it back on the buffer */
|
||||
|
||||
}
|
||||
|
||||
@@ -863,7 +861,7 @@ Transfer(struct connectdata *c_conn)
|
||||
conn->upload_bufsize=(long)min(data->progress.ulspeed, BUFSIZE);
|
||||
}
|
||||
|
||||
if (data->timeout && (Curl_tvdiff (now, start) > data->timeout)) {
|
||||
if (data->set.timeout && (Curl_tvdiff (now, start) > data->set.timeout)) {
|
||||
failf (data, "Operation timed out with %d out of %d bytes received",
|
||||
bytecount, conn->size);
|
||||
return CURLE_OPERATION_TIMEOUTED;
|
||||
@@ -876,7 +874,7 @@ Transfer(struct connectdata *c_conn)
|
||||
* returning.
|
||||
*/
|
||||
|
||||
if(!(data->bits.no_body) && contentlength &&
|
||||
if(!(data->set.no_body) && contentlength &&
|
||||
(bytecount != contentlength)) {
|
||||
failf(data, "transfer closed with %d bytes remaining to read",
|
||||
contentlength-bytecount);
|
||||
@@ -898,14 +896,14 @@ Transfer(struct connectdata *c_conn)
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
CURLcode Curl_perform(struct UrlData *data)
|
||||
CURLcode Curl_perform(struct SessionHandle *data)
|
||||
{
|
||||
CURLcode res;
|
||||
struct connectdata *conn=NULL;
|
||||
bool port=TRUE; /* allow data->use_port to set port to use */
|
||||
bool port=TRUE; /* allow data->set.use_port to set port to use */
|
||||
char *newurl = NULL; /* possibly a new URL to follow to! */
|
||||
|
||||
if(!data->url)
|
||||
if(!data->change.url)
|
||||
/* we can't do anything wihout URL */
|
||||
return CURLE_URL_MALFORMAT;
|
||||
|
||||
@@ -913,11 +911,11 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
/* Init the SSL session ID cache here. We do it here since we want to
|
||||
do it after the *_setopt() calls (that could change the size) but
|
||||
before any transfer. */
|
||||
Curl_SSL_InitSessions(data, data->ssl.numsessions);
|
||||
Curl_SSL_InitSessions(data, data->set.ssl.numsessions);
|
||||
#endif
|
||||
|
||||
data->followlocation=0; /* reset the location-follow counter */
|
||||
data->bits.this_is_a_follow = FALSE; /* reset this */
|
||||
data->set.followlocation=0; /* reset the location-follow counter */
|
||||
data->state.this_is_a_follow = FALSE; /* reset this */
|
||||
|
||||
Curl_initinfo(data); /* reset session-specific information "variables" */
|
||||
|
||||
@@ -964,30 +962,28 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
port=TRUE; /* by default we use the user set port number even after
|
||||
a Location: */
|
||||
|
||||
if (data->maxredirs && (data->followlocation >= data->maxredirs)) {
|
||||
failf(data,"Maximum (%d) redirects followed", data->maxredirs);
|
||||
if (data->set.maxredirs && (data->set.followlocation >= data->set.maxredirs)) {
|
||||
failf(data,"Maximum (%d) redirects followed", data->set.maxredirs);
|
||||
res=CURLE_TOO_MANY_REDIRECTS;
|
||||
break;
|
||||
}
|
||||
|
||||
/* mark the next request as a followed location: */
|
||||
data->bits.this_is_a_follow = TRUE;
|
||||
data->state.this_is_a_follow = TRUE;
|
||||
|
||||
data->followlocation++; /* count location-followers */
|
||||
data->set.followlocation++; /* count location-followers */
|
||||
|
||||
if(data->bits.http_auto_referer) {
|
||||
if(data->set.http_auto_referer) {
|
||||
/* We are asked to automatically set the previous URL as the
|
||||
referer when we get the next URL. We pick the ->url field,
|
||||
which may or may not be 100% correct */
|
||||
|
||||
if(data->free_referer) {
|
||||
if(data->change.referer_alloc)
|
||||
/* If we already have an allocated referer, free this first */
|
||||
free(data->referer);
|
||||
}
|
||||
free(data->change.referer);
|
||||
|
||||
data->referer = strdup(data->url);
|
||||
data->free_referer = TRUE; /* yes, free this later */
|
||||
data->bits.http_set_referer = TRUE; /* might have been false */
|
||||
data->change.referer = strdup(data->change.url);
|
||||
data->change.referer_alloc = TRUE; /* yes, free this later */
|
||||
}
|
||||
|
||||
if(2 != sscanf(newurl, "%15[^:]://%c", prot, &letter)) {
|
||||
@@ -1005,7 +1001,7 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
|
||||
/* we must make our own copy of the URL to play with, as it may
|
||||
point to read-only data */
|
||||
char *url_clone=strdup(data->url);
|
||||
char *url_clone=strdup(data->change.url);
|
||||
|
||||
if(!url_clone)
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
@@ -1055,16 +1051,16 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
port = FALSE;
|
||||
}
|
||||
|
||||
if(data->bits.urlstringalloc)
|
||||
free(data->url);
|
||||
if(data->change.url_alloc)
|
||||
free(data->change.url);
|
||||
else
|
||||
data->change.url_alloc = TRUE; /* the URL is allocated */
|
||||
|
||||
/* TBD: set the URL with curl_setopt() */
|
||||
data->url = newurl;
|
||||
data->change.url = newurl;
|
||||
newurl = NULL; /* don't free! */
|
||||
|
||||
data->bits.urlstringalloc = TRUE; /* the URL is allocated */
|
||||
|
||||
infof(data, "Follows Location: to new URL: '%s'\n", data->url);
|
||||
infof(data, "Follows Location: to new URL: '%s'\n", data->change.url);
|
||||
|
||||
/*
|
||||
* We get here when the HTTP code is 300-399. We need to perform
|
||||
@@ -1072,7 +1068,7 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
* Discussed on the curl mailing list and posted about on the 26th
|
||||
* of January 2001.
|
||||
*/
|
||||
switch(data->progress.httpcode) {
|
||||
switch(data->info.httpcode) {
|
||||
case 300: /* Multiple Choices */
|
||||
case 301: /* Moved Permanently */
|
||||
case 306: /* Not used */
|
||||
@@ -1103,7 +1099,7 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
case 303: /* See Other */
|
||||
/* Disable both types of POSTs, since doing a second POST when
|
||||
* following isn't what anyone would want! */
|
||||
data->httpreq = HTTPREQ_GET; /* enforce GET request */
|
||||
data->set.httpreq = HTTPREQ_GET; /* enforce GET request */
|
||||
infof(data, "Disables POST, goes with GET\n");
|
||||
break;
|
||||
case 304: /* Not Modified */
|
||||
@@ -1132,7 +1128,7 @@ CURLcode Curl_perform(struct UrlData *data)
|
||||
free(newurl);
|
||||
|
||||
/* make sure the alarm is switched off! */
|
||||
if(data->timeout || data->connecttimeout)
|
||||
if(data->set.timeout || data->set.connecttimeout)
|
||||
myalarm(0);
|
||||
|
||||
return res;
|
||||
@@ -1166,3 +1162,10 @@ Curl_Transfer(struct connectdata *c_conn, /* connection data */
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
@@ -22,7 +22,7 @@
|
||||
*
|
||||
* $Id$
|
||||
*****************************************************************************/
|
||||
CURLcode Curl_perform(struct UrlData *data);
|
||||
CURLcode Curl_perform(struct SessionHandle *data);
|
||||
|
||||
/* This sets up a forthcoming transfer */
|
||||
CURLcode
|
||||
|
@@ -27,10 +27,10 @@
|
||||
* Prototypes for library-wide functions provided by url.c
|
||||
*/
|
||||
|
||||
CURLcode Curl_open(struct UrlData **curl);
|
||||
CURLcode Curl_setopt(struct UrlData *data, CURLoption option, ...);
|
||||
CURLcode Curl_close(struct UrlData *data); /* the opposite of curl_open() */
|
||||
CURLcode Curl_connect(struct UrlData *,
|
||||
CURLcode Curl_open(struct SessionHandle **curl);
|
||||
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...);
|
||||
CURLcode Curl_close(struct SessionHandle *data); /* the opposite of curl_open() */
|
||||
CURLcode Curl_connect(struct SessionHandle *,
|
||||
struct connectdata **,
|
||||
bool allow_port);
|
||||
CURLcode Curl_do(struct connectdata *);
|
||||
|
358
lib/urldata.h
358
lib/urldata.h
@@ -7,7 +7,7 @@
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2000, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
* Copyright (C) 2001, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* In order to be useful for every potential user, curl and libcurl are
|
||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||
@@ -27,10 +27,6 @@
|
||||
|
||||
#include "setup.h"
|
||||
|
||||
#ifndef MAXHOSTNAMELEN
|
||||
#define MAXHOSTNAMELEN 256
|
||||
#endif
|
||||
|
||||
#define PORT_FTP 21
|
||||
#define PORT_TELNET 23
|
||||
#define PORT_GOPHER 70
|
||||
@@ -142,10 +138,9 @@ struct ssl_config_data {
|
||||
char *CAfile; /* cerficate to verify peer against */
|
||||
char *random_file; /* path to file containing "random" data */
|
||||
char *egdsocket; /* path to file containing the EGD daemon socket */
|
||||
char *cipher_list; /* list of ciphers to use */
|
||||
|
||||
struct curl_ssl_session *session; /* array of 'numsessions' size */
|
||||
long numsessions; /* SSL session id cache size */
|
||||
long sessionage; /* number of the most recent session */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
@@ -212,7 +207,7 @@ struct ConnectBits {
|
||||
*/
|
||||
struct connectdata {
|
||||
/**** Fields set when inited and not modified again */
|
||||
struct UrlData *data; /* link to the root CURL struct */
|
||||
struct SessionHandle *data; /* link to the root CURL struct */
|
||||
int connectindex; /* what index in the connects index this particular
|
||||
struct has */
|
||||
|
||||
@@ -348,9 +343,21 @@ struct connectdata {
|
||||
void *generic;
|
||||
} proto;
|
||||
|
||||
|
||||
};
|
||||
|
||||
/*
|
||||
* Struct to keep statistical and informational data.
|
||||
*/
|
||||
struct PureInfo {
|
||||
int httpcode;
|
||||
int httpversion;
|
||||
time_t filetime; /* If requested, this is might get set. It may be 0 if
|
||||
the time was unretrievable */
|
||||
long header_size; /* size of read header(s) in bytes */
|
||||
long request_size; /* the amount of bytes sent in the request(s) */
|
||||
};
|
||||
|
||||
|
||||
struct Progress {
|
||||
long lastshow; /* time() of the last displayed progress meter or NULL to
|
||||
force redraw at next call */
|
||||
@@ -368,17 +375,12 @@ struct Progress {
|
||||
double dlspeed;
|
||||
double ulspeed;
|
||||
|
||||
struct timeval start;
|
||||
struct timeval t_startsingle;
|
||||
/* various data stored for possible later report */
|
||||
double t_nslookup;
|
||||
double t_connect;
|
||||
double t_pretransfer;
|
||||
int httpcode;
|
||||
int httpversion;
|
||||
time_t filetime; /* If requested, this is might get set. It may be 0 if
|
||||
the time was unretrievable */
|
||||
|
||||
struct timeval start;
|
||||
struct timeval t_startsingle;
|
||||
#define CURR_TIME 5
|
||||
|
||||
double speeder[ CURR_TIME ];
|
||||
@@ -395,9 +397,144 @@ typedef enum {
|
||||
HTTPREQ_LAST /* last in list */
|
||||
} Curl_HttpReq;
|
||||
|
||||
/* This struct is for boolean settings that define how to behave during
|
||||
this session. */
|
||||
struct Configbits {
|
||||
/*
|
||||
* Values that are generated, temporary or calculated internally for a
|
||||
* "session handle" must be defined within the 'struct urlstate'. This struct
|
||||
* will be used within the SessionHandle struct. When the 'SessionHandle'
|
||||
* struct is cloned, this data MUST NOT be copied.
|
||||
*
|
||||
* Remember that any "state" information goes globally for the curl handle.
|
||||
* Session-data MUST be put in the connectdata struct and here. */
|
||||
#define MAX_CURL_USER_LENGTH 256
|
||||
#define MAX_CURL_PASSWORD_LENGTH 256
|
||||
|
||||
struct UrlState {
|
||||
/* buffers to store authentication data in, as parsed from input options */
|
||||
char user[MAX_CURL_USER_LENGTH];
|
||||
char passwd[MAX_CURL_PASSWORD_LENGTH];
|
||||
char proxyuser[MAX_CURL_USER_LENGTH];
|
||||
char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
|
||||
|
||||
struct timeval keeps_speed; /* for the progress meter really */
|
||||
|
||||
/* 'connects' will be an allocated array with pointers. If the pointer is
|
||||
set, it holds an allocated connection. */
|
||||
struct connectdata **connects;
|
||||
long numconnects; /* size of the 'connects' array */
|
||||
|
||||
char *headerbuff; /* allocated buffer to store headers in */
|
||||
int headersize; /* size of the allocation */
|
||||
|
||||
char buffer[BUFSIZE+1]; /* buffer with size BUFSIZE */
|
||||
|
||||
double current_speed; /* the ProgressShow() funcion sets this */
|
||||
|
||||
bool this_is_a_follow; /* this is a followed Location: request */
|
||||
|
||||
char *auth_host; /* if set, this should be the host name that we will
|
||||
sent authorization to, no else. Used to make Location:
|
||||
following not keep sending user+password... This is
|
||||
strdup() data.
|
||||
*/
|
||||
|
||||
struct curl_ssl_session *session; /* array of 'numsessions' size */
|
||||
long sessionage; /* number of the most recent session */
|
||||
|
||||
char scratch[BUFSIZE*2]; /* huge buffer when doing upload CRLF replacing */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* This 'DynamicStatic' struct defines dynamic states that actually change
|
||||
* values in the 'UserDefined' area, which MUST be taken into consideration
|
||||
* if the UserDefined struct is cloned or similar. You can probably just
|
||||
* copy these, but each one indicate a special action on other data.
|
||||
*/
|
||||
|
||||
struct DynamicStatic {
|
||||
char *url; /* work URL, copied from UserDefined */
|
||||
bool url_alloc; /* URL string is malloc()'ed */
|
||||
char *proxy; /* work proxy, copied from UserDefined */
|
||||
bool proxy_alloc; /* http proxy string is malloc()'ed */
|
||||
char *referer; /* referer string */
|
||||
bool referer_alloc; /* referer sting is malloc()ed */
|
||||
};
|
||||
|
||||
/*
|
||||
* This 'UserDefined' struct must only contain data that is set once to go
|
||||
* for many (perhaps) independent connections. Values that are generated or
|
||||
* calculated internally for the "session handle" MUST be defined within the
|
||||
* 'struct urlstate' instead. The only exceptions MUST note the changes in
|
||||
* the 'DynamicStatic' struct.
|
||||
*/
|
||||
|
||||
struct UserDefined {
|
||||
FILE *err; /* the stderr writes goes here */
|
||||
char *errorbuffer; /* store failure messages in here */
|
||||
char *proxyuserpwd; /* Proxy <user:password>, if used */
|
||||
long proxyport; /* If non-zero, use this port number by default. If the
|
||||
proxy string features a ":[port]" that one will override
|
||||
this. */
|
||||
void *out; /* the fetched file goes here */
|
||||
void *in; /* the uploaded file is read from here */
|
||||
void *writeheader; /* write the header to this is non-NULL */
|
||||
char *set_url; /* what original URL to work on */
|
||||
char *set_proxy; /* proxy to use */
|
||||
long use_port; /* which port to use (when not using default) */
|
||||
char *userpwd; /* <user:password>, if used */
|
||||
char *set_range; /* range, if used. See README for detailed specification
|
||||
on this syntax. */
|
||||
long followlocation; /* as in HTTP Location: */
|
||||
long maxredirs; /* maximum no. of http(s) redirects to follow */
|
||||
char *set_referer; /* custom string */
|
||||
bool free_referer; /* set TRUE if 'referer' points to a string we
|
||||
allocated */
|
||||
char *useragent; /* User-Agent string */
|
||||
char *postfields; /* if POST, set the fields' values here */
|
||||
size_t postfieldsize; /* if POST, this might have a size to use instead of
|
||||
strlen(), and then the data *may* be binary (contain
|
||||
zero bytes) */
|
||||
char *ftpport; /* port to send with the FTP PORT command */
|
||||
char *device; /* network interface to use */
|
||||
curl_write_callback fwrite; /* function that stores the output */
|
||||
curl_write_callback fwrite_header; /* function that stores headers */
|
||||
curl_read_callback fread; /* function that reads the input */
|
||||
curl_progress_callback fprogress; /* function for progress information */
|
||||
void *progress_client; /* pointer to pass to the progress callback */
|
||||
curl_passwd_callback fpasswd; /* call for password */
|
||||
void *passwd_client; /* pass to the passwd callback */
|
||||
long timeout; /* in seconds, 0 means no timeout */
|
||||
long connecttimeout; /* in seconds, 0 means no timeout */
|
||||
long infilesize; /* size of file to upload, -1 means unknown */
|
||||
long low_speed_limit; /* bytes/second */
|
||||
long low_speed_time; /* number of seconds */
|
||||
int set_resume_from; /* continue [ftp] transfer from here */
|
||||
char *cookie; /* HTTP cookie string to send */
|
||||
struct curl_slist *headers; /* linked list of extra headers */
|
||||
struct HttpPost *httppost; /* linked list of POST data */
|
||||
char *cert; /* PEM-formatted certificate */
|
||||
char *cert_passwd; /* plain text certificate password */
|
||||
char *cookiejar; /* dump all cookies to this file */
|
||||
bool crlf; /* convert crlf on ftp upload(?) */
|
||||
struct curl_slist *quote; /* before the transfer */
|
||||
struct curl_slist *postquote; /* after the transfer */
|
||||
struct curl_slist *telnet_options; /* linked list of telnet options */
|
||||
TimeCond timecondition; /* kind of time/date comparison */
|
||||
time_t timevalue; /* what time to compare with */
|
||||
curl_closepolicy closepolicy; /* connection cache close concept */
|
||||
Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
|
||||
char *customrequest; /* HTTP/FTP request to use */
|
||||
char *auth_host; /* if set, this is the allocated string to the host name
|
||||
* to which to send the authorization data to, and no other
|
||||
* host (which location-following otherwise could lead to)
|
||||
*/
|
||||
char *krb4_level; /* what security level */
|
||||
struct ssl_config_data ssl; /* user defined SSL stuff */
|
||||
|
||||
/* Here follows boolean settings that define how to behave during
|
||||
this session. They are STATIC, set by libcurl users or at least initially
|
||||
and they don't change during operations. */
|
||||
|
||||
bool get_filetime;
|
||||
bool tunnel_thru_httpproxy;
|
||||
bool ftp_append;
|
||||
@@ -410,186 +547,39 @@ struct Configbits {
|
||||
bool http_include_header;
|
||||
bool http_set_referer;
|
||||
bool http_auto_referer; /* set "correct" referer when following location: */
|
||||
bool httpproxy;
|
||||
bool no_body;
|
||||
bool set_port;
|
||||
bool set_range;
|
||||
bool upload;
|
||||
bool use_netrc;
|
||||
bool verbose;
|
||||
bool this_is_a_follow; /* this is a followed Location: request */
|
||||
bool krb4; /* kerberos4 connection requested */
|
||||
bool proxystringalloc; /* the http proxy string is malloc()'ed */
|
||||
bool urlstringalloc; /* the URL string is malloc()'ed */
|
||||
bool reuse_forbid; /* if this is forbidden to be reused, close
|
||||
after use */
|
||||
bool reuse_fresh; /* do not re-use an existing connection for this
|
||||
transfer */
|
||||
bool expect100header; /* TRUE if we added Expect: 100-continue to the
|
||||
HTTP header */
|
||||
bool reuse_forbid; /* forbidden to be reused, close after use */
|
||||
bool reuse_fresh; /* do not re-use an existing connection */
|
||||
bool expect100header; /* TRUE if we added Expect: 100-continue */
|
||||
};
|
||||
|
||||
/*
|
||||
* As of April 11, 2000 we're now trying to split up the urldata struct in
|
||||
* three different parts:
|
||||
* In August 2001, this struct was redesigned and is since stricter than
|
||||
* before. The 'connectdata' struct MUST have all the connection oriented
|
||||
* stuff as we may now have several simultaneous connections and connection
|
||||
* structs in memory.
|
||||
*
|
||||
* (Global)
|
||||
* 1 - No matter how many hosts and requests that are being performed, this
|
||||
* goes for all of them.
|
||||
*
|
||||
* (Session)
|
||||
* 2 - Host and protocol-specific. No matter if we do several transfers to and
|
||||
* from this host, these variables stay the same.
|
||||
*
|
||||
* (Request)
|
||||
* 3 - Request-specific. Variables that are of interest for this particular
|
||||
* transfer being made right now. THIS IS WRONG STRUCT FOR THOSE.
|
||||
*
|
||||
* In Febrary 2001, this is being done stricter. The 'connectdata' struct
|
||||
* MUST have all the connection oriented stuff as we may now have several
|
||||
* simultaneous connections and connection structs in memory.
|
||||
*
|
||||
* From now on, the 'UrlData' must only contain data that is set once to go
|
||||
* for many (perhaps) independent connections. Values that are generated or
|
||||
* calculated internally MUST NOT be a part of this struct.
|
||||
*/
|
||||
* From now on, the 'SessionHandle' must only contain data that is set once to
|
||||
* go for many (perhaps) independent connections. Values that are generated or
|
||||
* calculated internally for the "session handle" must be defined within the
|
||||
* 'struct urlstate' instead. */
|
||||
|
||||
struct UrlData {
|
||||
/*************** Global - specific items ************/
|
||||
FILE *err; /* the stderr writes goes here */
|
||||
char *errorbuffer; /* store failure messages in here */
|
||||
|
||||
/*************** Session - specific items ************/
|
||||
char *proxy; /* if proxy, set it here */
|
||||
char *proxyuserpwd; /* Proxy <user:password>, if used */
|
||||
long proxyport; /* If non-zero, use this port number by default. If the
|
||||
proxy string features a ":[port]" that one will override
|
||||
this. */
|
||||
|
||||
|
||||
long header_size; /* size of read header(s) in bytes */
|
||||
long request_size; /* the amount of bytes sent in the request(s) */
|
||||
|
||||
void *out; /* the fetched file goes here */
|
||||
void *in; /* the uploaded file is read from here */
|
||||
void *writeheader; /* write the header to this is non-NULL */
|
||||
|
||||
char *url; /* what to get */
|
||||
char *freethis; /* if non-NULL, an allocated string for the URL */
|
||||
long use_port; /* which port to use (when not using default) */
|
||||
struct Configbits bits; /* new-style (v7) flag data */
|
||||
struct ssl_config_data ssl; /* this is for ssl-stuff */
|
||||
|
||||
char *userpwd; /* <user:password>, if used */
|
||||
char *set_range; /* range, if used. See README for detailed specification on
|
||||
this syntax. */
|
||||
|
||||
/* stuff related to HTTP */
|
||||
|
||||
long followlocation;
|
||||
long maxredirs; /* maximum no. of http(s) redirects to follow */
|
||||
char *referer;
|
||||
bool free_referer; /* set TRUE if 'referer' points to a string we
|
||||
allocated */
|
||||
char *useragent; /* User-Agent string */
|
||||
char *postfields; /* if POST, set the fields' values here */
|
||||
size_t postfieldsize; /* if POST, this might have a size to use instead of
|
||||
strlen(), and then the data *may* be binary (contain
|
||||
zero bytes) */
|
||||
|
||||
/* stuff related to FTP */
|
||||
char *ftpport; /* port to send with the PORT command */
|
||||
|
||||
/* general things */
|
||||
char *device; /* Interface to use */
|
||||
|
||||
/* function that stores the output:*/
|
||||
curl_write_callback fwrite;
|
||||
|
||||
/* optional function that stores the header output:*/
|
||||
curl_write_callback fwrite_header;
|
||||
|
||||
/* function that reads the input:*/
|
||||
curl_read_callback fread;
|
||||
|
||||
/* function that wants progress information */
|
||||
curl_progress_callback fprogress;
|
||||
void *progress_client; /* pointer to pass to the progress callback */
|
||||
|
||||
/* function to call instead of the internal for password */
|
||||
curl_passwd_callback fpasswd;
|
||||
void *passwd_client; /* pointer to pass to the passwd callback */
|
||||
|
||||
long timeout; /* in seconds, 0 means no timeout */
|
||||
long connecttimeout; /* in seconds, 0 means no timeout */
|
||||
long infilesize; /* size of file to upload, -1 means unknown */
|
||||
|
||||
char buffer[BUFSIZE+1]; /* buffer with size BUFSIZE */
|
||||
|
||||
double current_speed; /* the ProgressShow() funcion sets this */
|
||||
|
||||
long low_speed_limit; /* bytes/second */
|
||||
long low_speed_time; /* number of seconds */
|
||||
|
||||
int set_resume_from; /* continue [ftp] transfer from here */
|
||||
|
||||
char *cookie; /* HTTP cookie string to send */
|
||||
|
||||
struct curl_slist *headers; /* linked list of extra headers */
|
||||
struct HttpPost *httppost; /* linked list of POST data */
|
||||
|
||||
char *cert; /* PEM-formatted certificate */
|
||||
char *cert_passwd; /* plain text certificate password */
|
||||
|
||||
struct CookieInfo *cookies;
|
||||
char *cookiejar; /* dump all cookies to this file */
|
||||
|
||||
long crlf;
|
||||
struct curl_slist *quote; /* before the transfer */
|
||||
struct curl_slist *postquote; /* after the transfer */
|
||||
|
||||
/* Telnet negotiation options */
|
||||
struct curl_slist *telnet_options; /* linked list of telnet options */
|
||||
|
||||
TimeCond timecondition; /* kind of comparison */
|
||||
time_t timevalue; /* what time to compare with */
|
||||
|
||||
Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
|
||||
|
||||
char *customrequest; /* http/ftp request to use */
|
||||
|
||||
char *headerbuff; /* allocated buffer to store headers in */
|
||||
int headersize; /* size of the allocation */
|
||||
struct SessionHandle {
|
||||
struct UserDefined set; /* values set by the libcurl user */
|
||||
struct DynamicStatic change; /* possibly modified userdefined data */
|
||||
|
||||
struct CookieInfo *cookies; /* the cookies, read from files and servers */
|
||||
struct Progress progress; /* for all the progress meter data */
|
||||
|
||||
#define MAX_CURL_USER_LENGTH 128
|
||||
#define MAX_CURL_PASSWORD_LENGTH 128
|
||||
|
||||
char *auth_host; /* if set, this is the allocated string to the host name
|
||||
* to which to send the authorization data to, and no other
|
||||
* host (which location-following otherwise could lead to)
|
||||
*/
|
||||
|
||||
/* buffers to store authentication data in */
|
||||
char user[MAX_CURL_USER_LENGTH];
|
||||
char passwd[MAX_CURL_PASSWORD_LENGTH];
|
||||
char proxyuser[MAX_CURL_USER_LENGTH];
|
||||
char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
|
||||
|
||||
char *krb4_level; /* what security level */
|
||||
struct timeval keeps_speed; /* this should be request-specific */
|
||||
|
||||
/* 'connects' will be an allocated array with pointers. If the pointer is
|
||||
set, it holds an allocated connection. */
|
||||
struct connectdata **connects;
|
||||
long numconnects; /* size of the 'connects' array */
|
||||
curl_closepolicy closepolicy;
|
||||
|
||||
struct UrlState state; /* struct for fields used for state info and
|
||||
other dynamic purposes */
|
||||
struct PureInfo info; /* stats, reports and info data */
|
||||
};
|
||||
|
||||
#define LIBCURL_NAME "libcurl"
|
||||
#define LIBCURL_ID LIBCURL_NAME " " LIBCURL_VERSION " " SSL_ID
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -103,3 +103,11 @@ char *curl_version(void)
|
||||
|
||||
return version;
|
||||
}
|
||||
|
||||
/*
|
||||
* local variables:
|
||||
* eval: (load-file "../curl-mode.el")
|
||||
* end:
|
||||
* vim600: et sw=2 ts=2 sts=2 tw=78 fdm=marker
|
||||
* vim<600: et sw=2 ts=2 sts=2 tw=78
|
||||
*/
|
||||
|
108
ltmain.sh
108
ltmain.sh
@@ -55,8 +55,8 @@ modename="$progname"
|
||||
# Constants.
|
||||
PROGRAM=ltmain.sh
|
||||
PACKAGE=libtool
|
||||
VERSION=1.4
|
||||
TIMESTAMP=" (1.920 2001/04/24 23:26:18)"
|
||||
VERSION=1.4.2
|
||||
TIMESTAMP=" (1.922.2.53 2001/09/11 03:18:52)"
|
||||
|
||||
default_mode=
|
||||
help="Try \`$progname --help' for more information."
|
||||
@@ -84,6 +84,9 @@ if test "${LANG+set}" = set; then
|
||||
save_LANG="$LANG"; LANG=C; export LANG
|
||||
fi
|
||||
|
||||
# Make sure IFS has a sensible default
|
||||
: ${IFS=" "}
|
||||
|
||||
if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
|
||||
echo "$modename: not configured to build any kind of library" 1>&2
|
||||
echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2
|
||||
@@ -202,6 +205,11 @@ if test -n "$prevopt"; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# If this variable is set in any of the actions, the command in it
|
||||
# will be execed at the end. This prevents here-documents from being
|
||||
# left over by shells.
|
||||
exec_cmd=
|
||||
|
||||
if test -z "$show_help"; then
|
||||
|
||||
# Infer the operation mode.
|
||||
@@ -329,7 +337,7 @@ if test -z "$show_help"; then
|
||||
-Wc,*)
|
||||
args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
|
||||
lastarg=
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=','
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for arg in $args; do
|
||||
IFS="$save_ifs"
|
||||
|
||||
@@ -615,6 +623,10 @@ compiler."
|
||||
# Now arrange that obj and lo_libobj become the same file
|
||||
$show "(cd $xdir && $LN_S $baseobj $libobj)"
|
||||
if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
|
||||
# Unlock the critical section if it was locked
|
||||
if test "$need_locks" != no; then
|
||||
$run $rm "$lockfile"
|
||||
fi
|
||||
exit 0
|
||||
else
|
||||
error=$?
|
||||
@@ -1031,6 +1043,17 @@ compiler."
|
||||
# These systems don't actually have a C library (as such)
|
||||
test "X$arg" = "X-lc" && continue
|
||||
;;
|
||||
*-*-openbsd*)
|
||||
# Do not include libc due to us having libc/libc_r.
|
||||
test "X$arg" = "X-lc" && continue
|
||||
;;
|
||||
esac
|
||||
elif test "X$arg" = "X-lc_r"; then
|
||||
case $host in
|
||||
*-*-openbsd*)
|
||||
# Do not include libc_r directly, use -pthread flag.
|
||||
continue
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
deplibs="$deplibs $arg"
|
||||
@@ -1122,7 +1145,7 @@ compiler."
|
||||
-Wc,*)
|
||||
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
|
||||
arg=
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=','
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $args; do
|
||||
IFS="$save_ifs"
|
||||
case $flag in
|
||||
@@ -1140,7 +1163,7 @@ compiler."
|
||||
-Wl,*)
|
||||
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
|
||||
arg=
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=','
|
||||
save_ifs="$IFS"; IFS=','
|
||||
for flag in $args; do
|
||||
IFS="$save_ifs"
|
||||
case $flag in
|
||||
@@ -1750,7 +1773,7 @@ compiler."
|
||||
if test -f "$output_objdir/$soname-def"; then :
|
||||
else
|
||||
$show "extracting exported symbol list from \`$soname'"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
eval cmds=\"$extract_expsyms_cmds\"
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
@@ -1763,7 +1786,7 @@ compiler."
|
||||
# Create $newlib
|
||||
if test -f "$output_objdir/$newlib"; then :; else
|
||||
$show "generating import library for \`$soname'"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
eval cmds=\"$old_archive_from_expsyms_cmds\"
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
@@ -2175,7 +2198,7 @@ compiler."
|
||||
else
|
||||
|
||||
# Parse the version information argument.
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=':'
|
||||
save_ifs="$IFS"; IFS=':'
|
||||
set dummy $vinfo 0 0 0
|
||||
IFS="$save_ifs"
|
||||
|
||||
@@ -2312,6 +2335,16 @@ compiler."
|
||||
if test -z "$vinfo" && test -n "$release"; then
|
||||
major=
|
||||
verstring="0.0"
|
||||
case $version_type in
|
||||
darwin)
|
||||
# we can't check for "0.0" in archive_cmds due to quoting
|
||||
# problems, so we reset it completely
|
||||
verstring=""
|
||||
;;
|
||||
*)
|
||||
verstring="0.0"
|
||||
;;
|
||||
esac
|
||||
if test "$need_version" = no; then
|
||||
versuffix=
|
||||
else
|
||||
@@ -2408,6 +2441,9 @@ compiler."
|
||||
*-*-netbsd*)
|
||||
# Don't link with libc until the a.out ld.so is fixed.
|
||||
;;
|
||||
*-*-openbsd*)
|
||||
# Do not include libc due to us having libc/libc_r.
|
||||
;;
|
||||
*)
|
||||
# Add libc to deplibs on all other systems if necessary.
|
||||
if test $build_libtool_need_lc = "yes"; then
|
||||
@@ -2784,7 +2820,7 @@ EOF
|
||||
export_symbols="$output_objdir/$libname.exp"
|
||||
$run $rm $export_symbols
|
||||
eval cmds=\"$export_symbols_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -2860,7 +2896,7 @@ EOF
|
||||
else
|
||||
eval cmds=\"$archive_cmds\"
|
||||
fi
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -2988,7 +3024,7 @@ EOF
|
||||
|
||||
output="$obj"
|
||||
eval cmds=\"$reload_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -3024,7 +3060,7 @@ EOF
|
||||
reload_objs="$libobjs $reload_conv_objs"
|
||||
output="$libobj"
|
||||
eval cmds=\"$reload_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -3287,27 +3323,25 @@ extern \"C\" {
|
||||
#undef lt_preloaded_symbols
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
# define lt_ptr_t void *
|
||||
# define lt_ptr void *
|
||||
#else
|
||||
# define lt_ptr_t char *
|
||||
# define lt_ptr char *
|
||||
# define const
|
||||
#endif
|
||||
|
||||
/* The mapping between symbol names and symbols. */
|
||||
const struct {
|
||||
const char *name;
|
||||
lt_ptr_t address;
|
||||
lt_ptr address;
|
||||
}
|
||||
lt_preloaded_symbols[] =
|
||||
{\
|
||||
"
|
||||
|
||||
sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \
|
||||
-e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \
|
||||
< "$nlist" >> "$output_objdir/$dlsyms"
|
||||
eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
|
||||
|
||||
$echo >> "$output_objdir/$dlsyms" "\
|
||||
{0, (lt_ptr_t) 0}
|
||||
{0, (lt_ptr) 0}
|
||||
};
|
||||
|
||||
/* This works around a problem in FreeBSD linker */
|
||||
@@ -3618,8 +3652,9 @@ else
|
||||
|
||||
# relink executable if necessary
|
||||
if test -n \"\$relink_command\"; then
|
||||
if (eval \$relink_command); then :
|
||||
if relink_command_output=\`eval \$relink_command 2>&1\`; then :
|
||||
else
|
||||
$echo \"\$relink_command_output\" >&2
|
||||
$rm \"\$progdir/\$file\"
|
||||
exit 1
|
||||
fi
|
||||
@@ -3790,7 +3825,7 @@ fi\
|
||||
|
||||
eval cmds=\"$old_archive_cmds\"
|
||||
fi
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -4165,7 +4200,7 @@ relink_command=\"$relink_command\""
|
||||
# Do each command in the postinstall commands.
|
||||
lib="$destdir/$realname"
|
||||
eval cmds=\"$postinstall_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -4352,7 +4387,7 @@ relink_command=\"$relink_command\""
|
||||
|
||||
# Do each command in the postinstall commands.
|
||||
eval cmds=\"$old_postinstall_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -4368,11 +4403,10 @@ relink_command=\"$relink_command\""
|
||||
if test -n "$current_libdirs"; then
|
||||
# Maybe just do a dry run.
|
||||
test -n "$run" && current_libdirs=" -n$current_libdirs"
|
||||
exec $SHELL $0 --finish$current_libdirs
|
||||
exit 1
|
||||
fi
|
||||
|
||||
exec_cmd='$SHELL $0 --finish$current_libdirs'
|
||||
else
|
||||
exit 0
|
||||
fi
|
||||
;;
|
||||
|
||||
# libtool finish mode
|
||||
@@ -4391,7 +4425,7 @@ relink_command=\"$relink_command\""
|
||||
if test -n "$finish_cmds"; then
|
||||
# Do each command in the finish commands.
|
||||
eval cmds=\"$finish_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -4575,11 +4609,8 @@ relink_command=\"$relink_command\""
|
||||
LANG="$save_LANG"; export LANG
|
||||
fi
|
||||
|
||||
# Now actually exec the command.
|
||||
eval "exec \$cmd$args"
|
||||
|
||||
$echo "$modename: cannot exec \$cmd$args"
|
||||
exit 1
|
||||
# Now prepare to actually exec the command.
|
||||
exec_cmd='"$cmd"$args'
|
||||
else
|
||||
# Display what would be done.
|
||||
if test -n "$shlibpath_var"; then
|
||||
@@ -4670,7 +4701,7 @@ relink_command=\"$relink_command\""
|
||||
if test -n "$library_names"; then
|
||||
# Do each command in the postuninstall commands.
|
||||
eval cmds=\"$postuninstall_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -4685,7 +4716,7 @@ relink_command=\"$relink_command\""
|
||||
if test -n "$old_library"; then
|
||||
# Do each command in the old_postuninstall commands.
|
||||
eval cmds=\"$old_postuninstall_cmds\"
|
||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
||||
save_ifs="$IFS"; IFS='~'
|
||||
for cmd in $cmds; do
|
||||
IFS="$save_ifs"
|
||||
$show "$cmd"
|
||||
@@ -4744,11 +4775,18 @@ relink_command=\"$relink_command\""
|
||||
;;
|
||||
esac
|
||||
|
||||
if test -z "$exec_cmd"; then
|
||||
$echo "$modename: invalid operation mode \`$mode'" 1>&2
|
||||
$echo "$generic_help" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
fi # test -z "$show_help"
|
||||
|
||||
if test -n "$exec_cmd"; then
|
||||
eval exec $exec_cmd
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# We need to display help for each of the modes.
|
||||
case $mode in
|
||||
"") $echo \
|
||||
|
@@ -1,6 +1,22 @@
|
||||
Revision history for Perl extension Curl::easy.
|
||||
Check out the file README for more info.
|
||||
|
||||
1.1.8 Thu Sep 20 2001: - Cris Bailiff <c.bailiff@devsecure.com>
|
||||
- Re-generate CURLOPT_ constants from curl.h and enhance makefile
|
||||
to allow this to be repeated in future or for older versions of
|
||||
libcurl. Constants up-to-date for libcurl-7.9(pre)
|
||||
- Split tests into t/*.t to simplify each case
|
||||
- Add test cases for new SSL switches. This needs ca-bundle.crt
|
||||
(from mod_ssl) for verifying test cases.
|
||||
|
||||
1.1.7 Thu Sep 13 2001: - Cris Bailiff <c.bailiff@devsecure.com>
|
||||
- Documentation Update only - Explicitly state that Curl_easy
|
||||
is released under the MIT-X/MPL dual licence. No code changes.
|
||||
|
||||
1.1.6 Mon Sep 10 2001: - Cris Bailiff <c.bailiff@devsecure.com>
|
||||
- Fix segfault due to changes in header callback behaviour
|
||||
since curl-7.8.1-pre3
|
||||
|
||||
1.1.5 Fri Apr 20 2001: - Cris Bailiff <c.bailiff@devsecure.com>
|
||||
- Add latest CURLOPT_ and CURLINFO_ constants to the constants list
|
||||
|
||||
|
@@ -4,4 +4,13 @@ Makefile.PL
|
||||
README
|
||||
easy.pm
|
||||
easy.xs
|
||||
test.pl
|
||||
curlopt-constants.c
|
||||
t/00constants.t
|
||||
t/01basic.t
|
||||
t/02header-callback.t
|
||||
t/03body-callback.t
|
||||
t/04abort-test.t
|
||||
t/05progress.t
|
||||
t/06http-post.t
|
||||
t/07ftp-upload.t
|
||||
t/08ssl.t
|
||||
|
@@ -12,3 +12,76 @@ WriteMakefile(
|
||||
'INC' => '', # e.g., '-I/usr/include/other'
|
||||
'clean' => {FILES => "head.out body.out"}
|
||||
);
|
||||
|
||||
#
|
||||
# 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'
|
||||
#
|
||||
|
||||
if (!open(CONSTANTS,"<curlopt-constants.c")) {
|
||||
print "Rebuilding curlopt-constants.c for your libcurl version\n";
|
||||
close(CONSTANTS);
|
||||
|
||||
#
|
||||
# You may need to specify where to find curl.h on your platform
|
||||
# These are guesses only
|
||||
#
|
||||
my $curl_h;
|
||||
HEADER: foreach my $try (qw(
|
||||
|
||||
curl.h
|
||||
../../include/curl.h
|
||||
/usr/include/curl/curl.h
|
||||
/usr/local/include/curl/curl.h
|
||||
C:\\INCLUDE\\CURL\\CURL.H
|
||||
|
||||
))
|
||||
{
|
||||
if (-e $try) {
|
||||
$curl_h=$try;
|
||||
last HEADER;
|
||||
}
|
||||
}
|
||||
|
||||
if (!defined($curl_h)) {
|
||||
die "Could not rebuild curlopt-constants.c - can't find curl.h\n";
|
||||
}
|
||||
|
||||
print "Found curl.h in $curl_h\n";
|
||||
open (CURL_H,"<".$curl_h) or die "Can't open curl.h\n";
|
||||
my %types;
|
||||
my %codes;
|
||||
while(<CURL_H>) {
|
||||
if ($_ =~ m/CINIT\(/ and $_ !~ m/#/) {
|
||||
my ($option,$type,$code)=m/.*CINIT\((\w*)\s*,\s*(\w+)\s*,\s*(\d+).*/;
|
||||
$types{$option}=$type;
|
||||
$codes{$option}=$code;
|
||||
}
|
||||
}
|
||||
close(CURL_H);
|
||||
|
||||
# some things are ifdefed out...
|
||||
foreach my $ifdef0 (qw(FLAGS PROGRESSMODE))
|
||||
{
|
||||
delete $types{$ifdef0}; delete $codes{$ifdef0};
|
||||
}
|
||||
|
||||
open(CURL_XS,">curlopt-constants.c") or die "Can't write curlopt-constants.c\n";
|
||||
foreach my $next_initial ('A'..'Z') {
|
||||
print CURL_XS " case '$next_initial':\n";
|
||||
my $count=0;
|
||||
foreach my $option (sort keys %types) {
|
||||
my $initial=substr($option,0,1);
|
||||
if ($next_initial eq $initial) {
|
||||
print CURL_XS " if (strEQ(name, \"$option\")) return CURLOPT_$option;\n";
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
if ($count) {
|
||||
print CURL_XS " break;\n";
|
||||
}
|
||||
}
|
||||
close(CURL_XS);
|
||||
}
|
||||
|
@@ -1 +1,3 @@
|
||||
EXTRA_DIST = Changes easy.pm easy.xs Makefile.PL MANIFEST README test.pl
|
||||
SUBDIRS = t
|
||||
|
||||
EXTRA_DIST = Changes easy.pm easy.xs curlopt-constants.c Makefile.PL MANIFEST README
|
||||
|
@@ -11,17 +11,30 @@ installed. You then may install this module via the usual way:
|
||||
make test
|
||||
make install
|
||||
|
||||
If you have an older version of libcurl, you can remove 'curlopt-constants.c'
|
||||
and have it rebuilt by 'perl Makefile.PL'.
|
||||
|
||||
You can also do this for a later version of libcurl, except currently
|
||||
you will have to update the module EXPORTS list manually.
|
||||
|
||||
The module provides the same functionality as libcurl provides to C programs,
|
||||
please refer to the documentation of libcurl. Some examples may be found in
|
||||
test.pl.
|
||||
t/*.t.
|
||||
|
||||
This software is distributed AS IS, WITHOUT WARRANTY OF ANY KIND, either
|
||||
express or implied. Send praise, patches, money, beer and pizza to the author.
|
||||
Send complaints to /dev/null. ;-)
|
||||
|
||||
The author of this software is Georg Horn <horn@koblenz-net.de>
|
||||
Parts of the callback support have been added by Cris Bailiff
|
||||
<c.bailiff@awayweb.com> and Forrest Cahoon <forrest.cahoon@merrillcorp.com>
|
||||
The original author of this software is Georg Horn <horn@koblenz-net.de>
|
||||
Parts of the callback support, tests and documentation have been added by
|
||||
Cris Bailiff <c.bailiff@devsecure.com> and Forrest Cahoon <forrest.cahoon@merrillcorp.com>
|
||||
|
||||
The latest version can be downloaded from http://koblenz-net.de/~horn/export/
|
||||
The current maintainer is Cris Bailiff <c.bailiff@devsecure.com>
|
||||
|
||||
The latest version can be downloaded from http://curl.haxx.se/libcurl/perl/
|
||||
|
||||
Copyright (C) 2000, Daniel Stenberg, , et al.
|
||||
You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
copies of the Software, and permit persons to whom the Software is
|
||||
furnished to do so, under the terms of the MPL or the MIT/X-derivate
|
||||
licenses. You may pick one of these licenses.
|
||||
|
125
perl/Curl_easy/curlopt-constants.c
Normal file
125
perl/Curl_easy/curlopt-constants.c
Normal file
@@ -0,0 +1,125 @@
|
||||
case 'A':
|
||||
if (strEQ(name, "AUTOREFERER")) return CURLOPT_AUTOREFERER;
|
||||
break;
|
||||
case 'B':
|
||||
case 'C':
|
||||
if (strEQ(name, "CAINFO")) return CURLOPT_CAINFO;
|
||||
if (strEQ(name, "CLOSEFUNCTION")) return CURLOPT_CLOSEFUNCTION;
|
||||
if (strEQ(name, "CLOSEPOLICY")) return CURLOPT_CLOSEPOLICY;
|
||||
if (strEQ(name, "CONNECTTIMEOUT")) return CURLOPT_CONNECTTIMEOUT;
|
||||
if (strEQ(name, "COOKIE")) return CURLOPT_COOKIE;
|
||||
if (strEQ(name, "COOKIEFILE")) return CURLOPT_COOKIEFILE;
|
||||
if (strEQ(name, "COOKIEJAR")) return CURLOPT_COOKIEJAR;
|
||||
if (strEQ(name, "CRLF")) return CURLOPT_CRLF;
|
||||
if (strEQ(name, "CUSTOMREQUEST")) return CURLOPT_CUSTOMREQUEST;
|
||||
break;
|
||||
case 'D':
|
||||
case 'E':
|
||||
if (strEQ(name, "EGDSOCKET")) return CURLOPT_EGDSOCKET;
|
||||
if (strEQ(name, "ERRORBUFFER")) return CURLOPT_ERRORBUFFER;
|
||||
break;
|
||||
case 'F':
|
||||
if (strEQ(name, "FAILONERROR")) return CURLOPT_FAILONERROR;
|
||||
if (strEQ(name, "FILE")) return CURLOPT_FILE;
|
||||
if (strEQ(name, "FILETIME")) return CURLOPT_FILETIME;
|
||||
if (strEQ(name, "FOLLOWLOCATION")) return CURLOPT_FOLLOWLOCATION;
|
||||
if (strEQ(name, "FORBID_REUSE")) return CURLOPT_FORBID_REUSE;
|
||||
if (strEQ(name, "FRESH_CONNECT")) return CURLOPT_FRESH_CONNECT;
|
||||
if (strEQ(name, "FTPAPPEND")) return CURLOPT_FTPAPPEND;
|
||||
if (strEQ(name, "FTPASCII")) return CURLOPT_FTPASCII;
|
||||
if (strEQ(name, "FTPLISTONLY")) return CURLOPT_FTPLISTONLY;
|
||||
if (strEQ(name, "FTPPORT")) return CURLOPT_FTPPORT;
|
||||
break;
|
||||
case 'G':
|
||||
case 'H':
|
||||
if (strEQ(name, "HEADER")) return CURLOPT_HEADER;
|
||||
if (strEQ(name, "HEADERFUNCTION")) return CURLOPT_HEADERFUNCTION;
|
||||
if (strEQ(name, "HTTPGET")) return CURLOPT_HTTPGET;
|
||||
if (strEQ(name, "HTTPHEADER")) return CURLOPT_HTTPHEADER;
|
||||
if (strEQ(name, "HTTPPOST")) return CURLOPT_HTTPPOST;
|
||||
if (strEQ(name, "HTTPPROXYTUNNEL")) return CURLOPT_HTTPPROXYTUNNEL;
|
||||
if (strEQ(name, "HTTPREQUEST")) return CURLOPT_HTTPREQUEST;
|
||||
break;
|
||||
case 'I':
|
||||
if (strEQ(name, "INFILE")) return CURLOPT_INFILE;
|
||||
if (strEQ(name, "INFILESIZE")) return CURLOPT_INFILESIZE;
|
||||
if (strEQ(name, "INTERFACE")) return CURLOPT_INTERFACE;
|
||||
break;
|
||||
case 'J':
|
||||
case 'K':
|
||||
if (strEQ(name, "KRB4LEVEL")) return CURLOPT_KRB4LEVEL;
|
||||
break;
|
||||
case 'L':
|
||||
if (strEQ(name, "LOW_SPEED_LIMIT")) return CURLOPT_LOW_SPEED_LIMIT;
|
||||
if (strEQ(name, "LOW_SPEED_TIME")) return CURLOPT_LOW_SPEED_TIME;
|
||||
break;
|
||||
case 'M':
|
||||
if (strEQ(name, "MAXCONNECTS")) return CURLOPT_MAXCONNECTS;
|
||||
if (strEQ(name, "MAXREDIRS")) return CURLOPT_MAXREDIRS;
|
||||
if (strEQ(name, "MUTE")) return CURLOPT_MUTE;
|
||||
break;
|
||||
case 'N':
|
||||
if (strEQ(name, "NETRC")) return CURLOPT_NETRC;
|
||||
if (strEQ(name, "NOBODY")) return CURLOPT_NOBODY;
|
||||
if (strEQ(name, "NOPROGRESS")) return CURLOPT_NOPROGRESS;
|
||||
if (strEQ(name, "NOTHING")) return CURLOPT_NOTHING;
|
||||
break;
|
||||
case 'O':
|
||||
case 'P':
|
||||
if (strEQ(name, "PASSWDDATA")) return CURLOPT_PASSWDDATA;
|
||||
if (strEQ(name, "PASSWDFUNCTION")) return CURLOPT_PASSWDFUNCTION;
|
||||
if (strEQ(name, "PORT")) return CURLOPT_PORT;
|
||||
if (strEQ(name, "POST")) return CURLOPT_POST;
|
||||
if (strEQ(name, "POSTFIELDS")) return CURLOPT_POSTFIELDS;
|
||||
if (strEQ(name, "POSTFIELDSIZE")) return CURLOPT_POSTFIELDSIZE;
|
||||
if (strEQ(name, "POSTQUOTE")) return CURLOPT_POSTQUOTE;
|
||||
if (strEQ(name, "PROGRESSDATA")) return CURLOPT_PROGRESSDATA;
|
||||
if (strEQ(name, "PROGRESSFUNCTION")) return CURLOPT_PROGRESSFUNCTION;
|
||||
if (strEQ(name, "PROXY")) return CURLOPT_PROXY;
|
||||
if (strEQ(name, "PROXYPORT")) return CURLOPT_PROXYPORT;
|
||||
if (strEQ(name, "PROXYUSERPWD")) return CURLOPT_PROXYUSERPWD;
|
||||
if (strEQ(name, "PUT")) return CURLOPT_PUT;
|
||||
break;
|
||||
case 'Q':
|
||||
if (strEQ(name, "QUOTE")) return CURLOPT_QUOTE;
|
||||
break;
|
||||
case 'R':
|
||||
if (strEQ(name, "RANDOM_FILE")) return CURLOPT_RANDOM_FILE;
|
||||
if (strEQ(name, "RANGE")) return CURLOPT_RANGE;
|
||||
if (strEQ(name, "READFUNCTION")) return CURLOPT_READFUNCTION;
|
||||
if (strEQ(name, "REFERER")) return CURLOPT_REFERER;
|
||||
if (strEQ(name, "RESUME_FROM")) return CURLOPT_RESUME_FROM;
|
||||
break;
|
||||
case 'S':
|
||||
if (strEQ(name, "SSLCERT")) return CURLOPT_SSLCERT;
|
||||
if (strEQ(name, "SSLCERTPASSWD")) return CURLOPT_SSLCERTPASSWD;
|
||||
if (strEQ(name, "SSLVERSION")) return CURLOPT_SSLVERSION;
|
||||
if (strEQ(name, "SSL_CIPHER_LIST")) return CURLOPT_SSL_CIPHER_LIST;
|
||||
if (strEQ(name, "SSL_VERIFYHOST")) return CURLOPT_SSL_VERIFYHOST;
|
||||
if (strEQ(name, "SSL_VERIFYPEER")) return CURLOPT_SSL_VERIFYPEER;
|
||||
if (strEQ(name, "STDERR")) return CURLOPT_STDERR;
|
||||
break;
|
||||
case 'T':
|
||||
if (strEQ(name, "TELNETOPTIONS")) return CURLOPT_TELNETOPTIONS;
|
||||
if (strEQ(name, "TIMECONDITION")) return CURLOPT_TIMECONDITION;
|
||||
if (strEQ(name, "TIMEOUT")) return CURLOPT_TIMEOUT;
|
||||
if (strEQ(name, "TIMEVALUE")) return CURLOPT_TIMEVALUE;
|
||||
if (strEQ(name, "TRANSFERTEXT")) return CURLOPT_TRANSFERTEXT;
|
||||
break;
|
||||
case 'U':
|
||||
if (strEQ(name, "UPLOAD")) return CURLOPT_UPLOAD;
|
||||
if (strEQ(name, "URL")) return CURLOPT_URL;
|
||||
if (strEQ(name, "USERAGENT")) return CURLOPT_USERAGENT;
|
||||
if (strEQ(name, "USERPWD")) return CURLOPT_USERPWD;
|
||||
break;
|
||||
case 'V':
|
||||
if (strEQ(name, "VERBOSE")) return CURLOPT_VERBOSE;
|
||||
break;
|
||||
case 'W':
|
||||
if (strEQ(name, "WRITEFUNCTION")) return CURLOPT_WRITEFUNCTION;
|
||||
if (strEQ(name, "WRITEHEADER")) return CURLOPT_WRITEHEADER;
|
||||
if (strEQ(name, "WRITEINFO")) return CURLOPT_WRITEINFO;
|
||||
break;
|
||||
case 'X':
|
||||
case 'Y':
|
||||
case 'Z':
|
@@ -16,20 +16,30 @@ require AutoLoader;
|
||||
# Do not simply export all your public functions/methods/constants.
|
||||
@EXPORT = qw(
|
||||
CURLOPT_AUTOREFERER
|
||||
CURLOPT_CAINFO
|
||||
CURLOPT_CLOSEFUNCTION
|
||||
CURLOPT_CLOSEPOLICY
|
||||
CURLOPT_CONNECTTIMEOUT
|
||||
CURLOPT_COOKIE
|
||||
CURLOPT_COOKIEFILE
|
||||
CURLOPT_COOKIEJAR
|
||||
CURLOPT_CRLF
|
||||
CURLOPT_CUSTOMREQUEST
|
||||
CURLOPT_EGDSOCKET
|
||||
CURLOPT_ERRORBUFFER
|
||||
CURLOPT_FAILONERROR
|
||||
CURLOPT_FILE
|
||||
CURLOPT_FILETIME
|
||||
CURLOPT_FOLLOWLOCATION
|
||||
CURLOPT_FORBID_REUSE
|
||||
CURLOPT_FRESH_CONNECT
|
||||
CURLOPT_FTPAPPEND
|
||||
CURLOPT_FTPASCII
|
||||
CURLOPT_FTPLISTONLY
|
||||
CURLOPT_FTPPORT
|
||||
CURLOPT_HEADER
|
||||
CURLOPT_HEADERFUNCTION
|
||||
CURLOPT_HTTPGET
|
||||
CURLOPT_HTTPHEADER
|
||||
CURLOPT_HTTPPOST
|
||||
CURLOPT_HTTPPROXYTUNNEL
|
||||
@@ -40,6 +50,8 @@ CURLOPT_INTERFACE
|
||||
CURLOPT_KRB4LEVEL
|
||||
CURLOPT_LOW_SPEED_LIMIT
|
||||
CURLOPT_LOW_SPEED_TIME
|
||||
CURLOPT_MAXCONNECTS
|
||||
CURLOPT_MAXREDIRS
|
||||
CURLOPT_MUTE
|
||||
CURLOPT_NETRC
|
||||
CURLOPT_NOBODY
|
||||
@@ -59,6 +71,7 @@ CURLOPT_PROXYPORT
|
||||
CURLOPT_PROXYUSERPWD
|
||||
CURLOPT_PUT
|
||||
CURLOPT_QUOTE
|
||||
CURLOPT_RANDOM_FILE
|
||||
CURLOPT_RANGE
|
||||
CURLOPT_READFUNCTION
|
||||
CURLOPT_REFERER
|
||||
@@ -66,7 +79,11 @@ CURLOPT_RESUME_FROM
|
||||
CURLOPT_SSLCERT
|
||||
CURLOPT_SSLCERTPASSWD
|
||||
CURLOPT_SSLVERSION
|
||||
CURLOPT_SSL_CIPHER_LIST
|
||||
CURLOPT_SSL_VERIFYHOST
|
||||
CURLOPT_SSL_VERIFYPEER
|
||||
CURLOPT_STDERR
|
||||
CURLOPT_TELNETOPTIONS
|
||||
CURLOPT_TIMECONDITION
|
||||
CURLOPT_TIMEOUT
|
||||
CURLOPT_TIMEVALUE
|
||||
@@ -78,17 +95,7 @@ CURLOPT_USERPWD
|
||||
CURLOPT_VERBOSE
|
||||
CURLOPT_WRITEFUNCTION
|
||||
CURLOPT_WRITEHEADER
|
||||
CURLOPT_MAXREDIRS
|
||||
CURLOPT_FILETIME
|
||||
CURLOPT_TELNETOPTIONS
|
||||
CURLOPT_MAXCONNECTS
|
||||
CURLOPT_CLOSEPOLICY
|
||||
CURLOPT_CLOSEFUNCTION
|
||||
CURLOPT_FRESH_CONNECT
|
||||
CURLOPT_FORBID_REUSE
|
||||
CURLOPT_RANDOM_FILE
|
||||
CURLOPT_EGD_SOCKET
|
||||
CURLOPT_CONNECTTIMEOUT
|
||||
CURLOPT_WRITEINFO
|
||||
|
||||
CURLINFO_EFFECTIVE_URL
|
||||
CURLINFO_HTTP_CODE
|
||||
@@ -110,7 +117,7 @@ CURLINFO_CONTENT_LENGTH_UPLOAD
|
||||
USE_INTERNAL_VARS
|
||||
);
|
||||
|
||||
$VERSION = '1.1.5';
|
||||
$VERSION = '1.1.8';
|
||||
|
||||
$Curl::easy::headers = "";
|
||||
$Curl::easy::content = "";
|
||||
@@ -133,6 +140,8 @@ bootstrap Curl::easy $VERSION;
|
||||
__END__
|
||||
# Below is the stub of documentation for your module. You better edit it!
|
||||
|
||||
=pod
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Curl::easy - Perl extension for libcurl
|
||||
@@ -146,12 +155,16 @@ Curl::easy - Perl extension for libcurl
|
||||
$CURLcode = Curl::easy::perform($curl);
|
||||
Curl::easy::cleanup($curl);
|
||||
|
||||
Read curl_easy_setopt for details of most CURLoption values
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This perl module provides an interface to the libcurl C library. See
|
||||
|
||||
|
||||
B<Curl::easy> provides an interface to the libcurl C library. See
|
||||
http://curl.haxx.se/ for more information on cURL and libcurl.
|
||||
|
||||
=head1 FILES and CALLBACKS
|
||||
=head2 FILES and CALLBACKS
|
||||
|
||||
Curl::easy supports the various options of curl_easy_setopt which require either a FILE * or
|
||||
a callback function.
|
||||
@@ -254,9 +267,20 @@ indicate an error.
|
||||
|
||||
Georg Horn <horn@koblenz-net.de>
|
||||
|
||||
Additional callback,pod and tes work by Cris Bailiff <c.bailiff@devsecure.com>
|
||||
Additional callback, pod and test work by Cris Bailiff <c.bailiff@devsecure.com>
|
||||
and Forrest Cahoon <forrest.cahoon@merrillcorp.com>
|
||||
|
||||
Currently maintained by Cris Bailiff <c.bailiff@devsecure.com>
|
||||
|
||||
=head1 Copyright
|
||||
|
||||
Copyright (C) 2000, Daniel Stenberg, , et al.
|
||||
|
||||
You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
copies of the Software, and permit persons to whom the Software is furnished
|
||||
to do so, under the terms of the MPL or the MIT/X-derivate licenses. You may
|
||||
pick one of these licenses.
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
http://curl.haxx.se/
|
||||
|
@@ -1,4 +1,12 @@
|
||||
/* Perl interface for libcurl. Check out the file README for more info. */
|
||||
/*
|
||||
|
||||
Copyright (C) 2000, Daniel Stenberg, , et al.
|
||||
You may opt to use, copy, modify, merge, publish, distribute and/or
|
||||
sell copies of the Software, and permit persons to whom the
|
||||
Software is furnished to do so, under the terms of the MPL or
|
||||
the MIT/X-derivate licenses. You may pick one of these licenses.
|
||||
*/
|
||||
|
||||
#include "EXTERN.h"
|
||||
#include "perl.h"
|
||||
@@ -101,12 +109,14 @@ fwrite_wrapper (const void *ptr,
|
||||
|
||||
if (stream == stdout) {
|
||||
sv = newSViv(0); /* FIXME: should cast stdout to GLOB somehow? */
|
||||
} else if (stream == NULL) {
|
||||
sv = &PL_sv_undef;
|
||||
} else { /* its already an SV */
|
||||
sv = stream;
|
||||
}
|
||||
|
||||
if (ptr != NULL) {
|
||||
XPUSHs(sv_2mortal(newSVpvn(ptr, size * nmemb)));
|
||||
XPUSHs(sv_2mortal(newSVpvn((char *)ptr, (STRLEN)(size * nmemb))));
|
||||
} else {
|
||||
XPUSHs(sv_2mortal(newSVpv("", 0)));
|
||||
}
|
||||
@@ -130,15 +140,20 @@ fwrite_wrapper (const void *ptr,
|
||||
} else {
|
||||
/* default to a normal 'fwrite' */
|
||||
/* stream could be a FILE * or an SV * */
|
||||
/* or NULL since libcurl-7.8.1pre3 */
|
||||
FILE *f;
|
||||
|
||||
if (stream == stdout) { /* the only possible FILE ? Think so */
|
||||
if (stream == stdout ||
|
||||
stream == NULL) { /* the only possible FILE ? Think so */
|
||||
f = stream;
|
||||
} else { /* its a GLOB */
|
||||
f = IoIFP(sv_2io(stream)); /* may barf if not a GLOB */
|
||||
}
|
||||
|
||||
if (f)
|
||||
return fwrite(ptr, size, nmemb, f);
|
||||
else
|
||||
return (size_t) size*nmemb;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -422,123 +437,7 @@ constant(char *name, int arg)
|
||||
if (strncmp(name, "CURLOPT_", 8) == 0) {
|
||||
name += 8;
|
||||
switch (*name) {
|
||||
case 'A':
|
||||
case 'B':
|
||||
if (strEQ(name, "AUTOREFERER")) return CURLOPT_AUTOREFERER;
|
||||
break;
|
||||
case 'C':
|
||||
if (strEQ(name, "CONNECTTIMEOUT")) return CURLOPT_CONNECTTIMEOUT;
|
||||
if (strEQ(name, "COOKIE")) return CURLOPT_COOKIE;
|
||||
if (strEQ(name, "COOKIEFILE")) return CURLOPT_COOKIEFILE;
|
||||
if (strEQ(name, "CLOSEFUNCTION")) return CURLOPT_CLOSEFUNCTION;
|
||||
if (strEQ(name, "CLOSEPOLICY")) return CURLOPT_CLOSEPOLICY;
|
||||
if (strEQ(name, "CRLF")) return CURLOPT_CRLF;
|
||||
if (strEQ(name, "CUSTOMREQUEST")) return CURLOPT_CUSTOMREQUEST;
|
||||
break;
|
||||
case 'D':
|
||||
case 'E':
|
||||
if (strEQ(name, "EGDSOCKET")) return CURLOPT_EGDSOCKET;
|
||||
if (strEQ(name, "ERRORBUFFER")) return CURLOPT_ERRORBUFFER;
|
||||
break;
|
||||
case 'F':
|
||||
if (strEQ(name, "FAILONERROR")) return CURLOPT_FAILONERROR;
|
||||
if (strEQ(name, "FILE")) return CURLOPT_FILE;
|
||||
if (strEQ(name, "FILETIME")) return CURLOPT_FILETIME;
|
||||
if (strEQ(name, "FOLLOWLOCATION")) return CURLOPT_FOLLOWLOCATION;
|
||||
if (strEQ(name, "FORBID_REUSE")) return CURLOPT_FORBID_REUSE;
|
||||
if (strEQ(name, "FTPAPPEND")) return CURLOPT_FTPAPPEND;
|
||||
if (strEQ(name, "FTPASCII")) return CURLOPT_FTPASCII;
|
||||
if (strEQ(name, "FTPLISTONLY")) return CURLOPT_FTPLISTONLY;
|
||||
if (strEQ(name, "FTPPORT")) return CURLOPT_FTPPORT;
|
||||
if (strEQ(name, "FRESH_CONNECT")) return CURLOPT_FRESH_CONNECT;
|
||||
break;
|
||||
case 'G':
|
||||
case 'H':
|
||||
if (strEQ(name, "HEADER")) return CURLOPT_HEADER;
|
||||
if (strEQ(name, "HEADERFUNCTION")) return CURLOPT_HEADERFUNCTION;
|
||||
if (strEQ(name, "HTTPHEADER")) return CURLOPT_HTTPHEADER;
|
||||
if (strEQ(name, "HTTPPOST")) return CURLOPT_HTTPPOST;
|
||||
if (strEQ(name, "HTTPPROXYTUNNEL")) return CURLOPT_HTTPPROXYTUNNEL;
|
||||
if (strEQ(name, "HTTPREQUEST")) return CURLOPT_HTTPREQUEST;
|
||||
break;
|
||||
case 'I':
|
||||
case 'J':
|
||||
if (strEQ(name, "INFILE")) return CURLOPT_INFILE;
|
||||
if (strEQ(name, "INFILESIZE")) return CURLOPT_INFILESIZE;
|
||||
if (strEQ(name, "INTERFACE")) return CURLOPT_INTERFACE;
|
||||
break;
|
||||
case 'K':
|
||||
case 'L':
|
||||
if (strEQ(name, "KRB4LEVEL")) return CURLOPT_KRB4LEVEL;
|
||||
if (strEQ(name, "LOW_SPEED_LIMIT")) return CURLOPT_LOW_SPEED_LIMIT;
|
||||
if (strEQ(name, "LOW_SPEED_TIME")) return CURLOPT_LOW_SPEED_TIME;
|
||||
break;
|
||||
case 'M':
|
||||
if (strEQ(name, "MAXCONNECTS")) return CURLOPT_MAXCONNECTS;
|
||||
if (strEQ(name, "MAXREDIRS")) return CURLOPT_MAXREDIRS;
|
||||
break;
|
||||
case 'N':
|
||||
if (strEQ(name, "MUTE")) return CURLOPT_MUTE;
|
||||
if (strEQ(name, "NETRC")) return CURLOPT_NETRC;
|
||||
if (strEQ(name, "NOBODY")) return CURLOPT_NOBODY;
|
||||
if (strEQ(name, "NOPROGRESS")) return CURLOPT_NOPROGRESS;
|
||||
if (strEQ(name, "NOTHING")) return CURLOPT_NOTHING;
|
||||
break;
|
||||
case 'O':
|
||||
case 'P':
|
||||
if (strEQ(name, "PASSWDDATA")) return CURLOPT_PASSWDDATA;
|
||||
if (strEQ(name, "PASSWDFUNCTION")) return CURLOPT_PASSWDFUNCTION;
|
||||
if (strEQ(name, "PORT")) return CURLOPT_PORT;
|
||||
if (strEQ(name, "POST")) return CURLOPT_POST;
|
||||
if (strEQ(name, "POSTFIELDS")) return CURLOPT_POSTFIELDS;
|
||||
if (strEQ(name, "POSTFIELDSIZE")) return CURLOPT_POSTFIELDSIZE;
|
||||
if (strEQ(name, "POSTQUOTE")) return CURLOPT_POSTQUOTE;
|
||||
if (strEQ(name, "PROGRESSDATA")) return CURLOPT_PROGRESSDATA;
|
||||
if (strEQ(name, "PROGRESSFUNCTION")) return CURLOPT_PROGRESSFUNCTION;
|
||||
if (strEQ(name, "PROXY")) return CURLOPT_PROXY;
|
||||
if (strEQ(name, "PROXYPORT")) return CURLOPT_PROXYPORT;
|
||||
if (strEQ(name, "PROXYUSERPWD")) return CURLOPT_PROXYUSERPWD;
|
||||
if (strEQ(name, "PUT")) return CURLOPT_PUT;
|
||||
break;
|
||||
case 'Q':
|
||||
if (strEQ(name, "QUOTE")) return CURLOPT_QUOTE;
|
||||
break;
|
||||
case 'R':
|
||||
if (strEQ(name, "RANDOM_FILE")) return CURLOPT_RANDOM_FILE;
|
||||
if (strEQ(name, "RANGE")) return CURLOPT_RANGE;
|
||||
if (strEQ(name, "READFUNCTION")) return CURLOPT_READFUNCTION;
|
||||
if (strEQ(name, "REFERER")) return CURLOPT_REFERER;
|
||||
if (strEQ(name, "RESUME_FROM")) return CURLOPT_RESUME_FROM;
|
||||
break;
|
||||
case 'S':
|
||||
if (strEQ(name, "SSLCERT")) return CURLOPT_SSLCERT;
|
||||
if (strEQ(name, "SSLCERTPASSWD")) return CURLOPT_SSLCERTPASSWD;
|
||||
if (strEQ(name, "SSLVERSION")) return CURLOPT_SSLVERSION;
|
||||
if (strEQ(name, "STDERR")) return CURLOPT_STDERR;
|
||||
break;
|
||||
case 'T':
|
||||
if (strEQ(name, "TELNETOPTIONS")) return CURLOPT_TELNETOPTIONS;
|
||||
if (strEQ(name, "TIMECONDITION")) return CURLOPT_TIMECONDITION;
|
||||
if (strEQ(name, "TIMEOUT")) return CURLOPT_TIMEOUT;
|
||||
if (strEQ(name, "TIMEVALUE")) return CURLOPT_TIMEVALUE;
|
||||
if (strEQ(name, "TRANSFERTEXT")) return CURLOPT_TRANSFERTEXT;
|
||||
break;
|
||||
case 'U':
|
||||
case 'V':
|
||||
if (strEQ(name, "UPLOAD")) return CURLOPT_UPLOAD;
|
||||
if (strEQ(name, "URL")) return CURLOPT_URL;
|
||||
if (strEQ(name, "USERAGENT")) return CURLOPT_USERAGENT;
|
||||
if (strEQ(name, "USERPWD")) return CURLOPT_USERPWD;
|
||||
if (strEQ(name, "VERBOSE")) return CURLOPT_VERBOSE;
|
||||
break;
|
||||
case 'W':
|
||||
case 'X':
|
||||
case 'Y':
|
||||
case 'Z':
|
||||
if (strEQ(name, "WRITEFUNCTION")) return CURLOPT_WRITEFUNCTION;
|
||||
if (strEQ(name, "WRITEHEADER")) return CURLOPT_WRITEHEADER;
|
||||
if (strEQ(name, "WRITEINFO")) return CURLOPT_WRITEINFO;
|
||||
break;
|
||||
#include "curlopt-constants.c"
|
||||
}
|
||||
}
|
||||
if (strEQ(name, "USE_INTERNAL_VARS")) return USE_INTERNAL_VARS;
|
||||
|
48
perl/Curl_easy/examples/basicfirst.pl
Normal file
48
perl/Curl_easy/examples/basicfirst.pl
Normal file
@@ -0,0 +1,48 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
use strict;
|
||||
use Curl::easy;
|
||||
|
||||
my $url = "http://curl.haxx.se/dev/";
|
||||
|
||||
print "Testing curl version ",&Curl::easy::version(),"\n";
|
||||
|
||||
# Init the curl session
|
||||
my $curl= Curl::easy::init();
|
||||
if(!$curl) {
|
||||
die "curl init failed!\n";
|
||||
}
|
||||
|
||||
# Follow location headers
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
|
||||
# Add some additional headers to the http-request:
|
||||
my @myheaders;
|
||||
$myheaders[0] = "I-am-a-silly-programmer: yes indeed you are";
|
||||
$myheaders[1] = "User-Agent: Perl interface for libcURL";
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_HTTPHEADER, \@myheaders);
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
sub body_callback {
|
||||
my ($chunk,$handle)=@_;
|
||||
push @$handle, $chunk;
|
||||
return length($chunk); # OK
|
||||
}
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEFUNCTION, \&body_callback);
|
||||
|
||||
my @body;
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE, \@body);
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "Failed :$errbuf\n";
|
||||
};
|
||||
|
||||
# Cleanup
|
||||
Curl::easy::cleanup($curl);
|
||||
|
||||
print @body;
|
38
perl/Curl_easy/t/00constants.t
Normal file
38
perl/Curl_easy/t/00constants.t
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make test'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
# (It may become useful if the test is moved to ./t subdirectory.)
|
||||
use Benchmark;
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..2\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################## End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
print STDERR "Testing curl version ",&Curl::easy::version(),"\n";
|
||||
|
||||
if (CURLOPT_URL != 10000+2) {
|
||||
print "not ";
|
||||
}
|
||||
|
||||
print "ok ".++$count;
|
||||
|
||||
exit;
|
93
perl/Curl_easy/t/01basic.t
Normal file
93
perl/Curl_easy/t/01basic.t
Normal file
@@ -0,0 +1,93 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..6\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL})) {
|
||||
$url=$ENV{CURL_TEST_URL};
|
||||
} else {
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
# Add some additional headers to the http-request:
|
||||
my @myheaders;
|
||||
$myheaders[0] = "Server: www";
|
||||
$myheaders[1] = "User-Agent: Perl interface for libcURL";
|
||||
Curl::easy::setopt($curl, CURLOPT_HTTPHEADER, \@myheaders);
|
||||
|
||||
my $bytes;
|
||||
my $realurl;
|
||||
my $httpcode;
|
||||
|
||||
# Go get it
|
||||
my $retcode=Curl::easy::perform($curl);
|
||||
if ($retcode == 0) {
|
||||
Curl::easy::getinfo($curl, CURLINFO_SIZE_DOWNLOAD, $bytes);
|
||||
print STDERR "$bytes bytes read ";
|
||||
Curl::easy::getinfo($curl, CURLINFO_EFFECTIVE_URL, $realurl);
|
||||
Curl::easy::getinfo($curl, CURLINFO_HTTP_CODE, $httpcode);
|
||||
print STDERR "effective fetched url (http code: $httpcode) was: $url ";
|
||||
} else {
|
||||
# We can acces the error message in $errbuf here
|
||||
print STDERR "$retcode / '$errbuf'\n";
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
exit;
|
89
perl/Curl_easy/t/02header-callback.t
Normal file
89
perl/Curl_easy/t/02header-callback.t
Normal file
@@ -0,0 +1,89 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..9\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL})) {
|
||||
$url=$ENV{CURL_TEST_URL};
|
||||
} else {
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
# The header callback will only be called if your libcurl has the
|
||||
# CURLOPT_HEADERFUNCTION supported, otherwise your headers
|
||||
# go to CURLOPT_WRITEFUNCTION instead...
|
||||
#
|
||||
|
||||
my $header_called=0;
|
||||
sub header_callback { print STDERR "header callback called\n"; $header_called=1; return length($_[0])};
|
||||
|
||||
# test for sub reference and head callback
|
||||
Curl::easy::setopt($curl, CURLOPT_HEADERFUNCTION, \&header_callback);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
print STDERR "next test will fail on libcurl < 7.7.2\n";
|
||||
print "not " if (!$header_called); # ok if you have a libcurl <7.7.2
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
exit;
|
105
perl/Curl_easy/t/03body-callback.t
Normal file
105
perl/Curl_easy/t/03body-callback.t
Normal file
@@ -0,0 +1,105 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..9\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL})) {
|
||||
$url=$ENV{CURL_TEST_URL};
|
||||
} else {
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
# The header callback will only be called if your libcurl has the
|
||||
# CURLOPT_HEADERFUNCTION supported, otherwise your headers
|
||||
# go to CURLOPT_WRITEFUNCTION instead...
|
||||
#
|
||||
|
||||
my $header_called=0;
|
||||
sub header_callback { print STDERR "header callback called\n"; $header_called=1; return length($_[0])};
|
||||
|
||||
# test for sub reference and head callback
|
||||
Curl::easy::setopt($curl, CURLOPT_HEADERFUNCTION, \&header_callback);
|
||||
|
||||
my $body_called=0;
|
||||
sub body_callback {
|
||||
my ($chunk,$handle)=@_;
|
||||
print STDERR "body callback called with ",length($chunk)," bytes\n";
|
||||
print STDERR "data=$chunk\n";
|
||||
$body_called++;
|
||||
return length($chunk); # OK
|
||||
}
|
||||
|
||||
|
||||
# test for ref to sub and body callback
|
||||
my $body_ref=\&body_callback;
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEFUNCTION, $body_ref);
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
|
||||
print STDERR "next test will fail on libcurl < 7.7.2\n";
|
||||
print STDERR "not " if (!$header_called); # ok if you have a libcurl <7.7.2
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
print "not " if (!$body_called);
|
||||
print "ok ".++$count."\n";
|
87
perl/Curl_easy/t/04abort-test.t
Normal file
87
perl/Curl_easy/t/04abort-test.t
Normal file
@@ -0,0 +1,87 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..8\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL})) {
|
||||
$url=$ENV{CURL_TEST_URL};
|
||||
} else {
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $body_abort_called=0;
|
||||
sub body_abort_callback {
|
||||
my ($chunk,$sv)=@_;
|
||||
print STDERR "body abort callback called with ",length($chunk)," bytes\n";
|
||||
$body_abort_called++;
|
||||
return -1; # signal a failure
|
||||
}
|
||||
|
||||
# test we can abort a request mid-way
|
||||
my $body_abort_ref=\&body_abort_callback;
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEFUNCTION, $body_abort_ref);
|
||||
|
||||
if (Curl::easy::perform($curl) == 0) { # reverse test - this should have failed
|
||||
print "not ";
|
||||
};
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
print "not " if (!$body_abort_called); # should have been called
|
||||
print "ok ".++$count."\n";
|
99
perl/Curl_easy/t/05progress.t
Normal file
99
perl/Curl_easy/t/05progress.t
Normal file
@@ -0,0 +1,99 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..9\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL})) {
|
||||
$url=$ENV{CURL_TEST_URL};
|
||||
} else {
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 0);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
# inline progress function
|
||||
# tests for inline subs and progress callback
|
||||
# - progress callback must return 'true' on each call.
|
||||
|
||||
my $progress_called=0;
|
||||
sub prog_callb
|
||||
{
|
||||
my ($clientp,$dltotal,$dlnow,$ultotal,$ulnow)=@_;
|
||||
print STDERR "\nperl progress_callback has been called!\n";
|
||||
print STDERR "clientp: $clientp, dltotal: $dltotal, dlnow: $dlnow, ultotal: $ultotal, ";
|
||||
print STDERR "ulnow: $ulnow\n";
|
||||
$progress_called++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_PROGRESSFUNCTION, \&prog_callb);
|
||||
|
||||
# Turn progress meter back on - this doesn't work in older libcurls - once its off, its off.
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 0);
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
print "not " if (!$progress_called);
|
||||
print "ok ".++$count."\n";
|
||||
|
99
perl/Curl_easy/t/06http-post.t
Normal file
99
perl/Curl_easy/t/06http-post.t
Normal file
@@ -0,0 +1,99 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..7\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL})) {
|
||||
$url=$ENV{CURL_TEST_URL};
|
||||
} else {
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $read_max=1000;
|
||||
|
||||
sub read_callb
|
||||
{
|
||||
my ($maxlen,$sv)=@_;
|
||||
print STDERR "\nperl read_callback has been called!\n";
|
||||
print STDERR "max data size: $maxlen - need $read_max bytes\n";
|
||||
if ($read_max > 0) {
|
||||
my $len=int($read_max/3)+1;
|
||||
my $data = chr(ord('A')+rand(26))x$len;
|
||||
print STDERR "generated max/3=", int($read_max/3)+1, " characters to be uploaded - $data.\n";
|
||||
$read_max=$read_max-length($data);
|
||||
return $data;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# test post/read callback functions - requires a url which accepts posts, or it fails!
|
||||
#
|
||||
|
||||
Curl::easy::setopt($curl,CURLOPT_READFUNCTION,\&read_callb);
|
||||
Curl::easy::setopt($curl,CURLOPT_INFILESIZE,$read_max );
|
||||
Curl::easy::setopt($curl,CURLOPT_UPLOAD,1 );
|
||||
Curl::easy::setopt($curl,CURLOPT_CUSTOMREQUEST,"POST" );
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok ".++$count."\n";
|
129
perl/Curl_easy/t/07ftp-upload.t
Normal file
129
perl/Curl_easy/t/07ftp-upload.t
Normal file
@@ -0,0 +1,129 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..10\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "ftp://user\@localhost//tmp/blah";
|
||||
my $url;
|
||||
if (defined ($ENV{CURL_TEST_URL_FTP})) {
|
||||
$url=$ENV{CURL_TEST_URL_FTP};
|
||||
};# else {
|
||||
#$url = "";
|
||||
#print "Please enter an URL to fetch [$defurl]: ";
|
||||
#$url = <STDIN>;
|
||||
#if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
#}
|
||||
#}
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
sub passwd_callb
|
||||
{
|
||||
my ($clientp,$prompt,$buflen)=@_;
|
||||
print STDERR "\nperl passwd_callback has been called!\n";
|
||||
print STDERR "clientp: $clientp, prompt: $prompt, buflen: $buflen\n";
|
||||
print STDERR "\nEnter max $buflen characters for $prompt ";
|
||||
my $data = <STDIN>;
|
||||
chomp($data);
|
||||
return (0,$data);
|
||||
}
|
||||
|
||||
# Now do an ftp upload:
|
||||
|
||||
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_UPLOAD, 1);
|
||||
|
||||
|
||||
my $read_max=1000;
|
||||
Curl::easy::setopt($curl,CURLOPT_INFILESIZE,$read_max );
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
sub read_callb
|
||||
{
|
||||
my ($maxlen,$sv)=@_;
|
||||
print STDERR "\nperl read_callback has been called!\n";
|
||||
print STDERR "max data size: $maxlen - $read_max bytes needed\n";
|
||||
|
||||
if ($read_max > 0) {
|
||||
my $len=int($read_max/3)+1;
|
||||
my $data = chr(ord('A')+rand(26))x$len;
|
||||
print STDERR "generated max/3=", int($read_max/3)+1, " characters to be uploaded - $data.\n";
|
||||
$read_max=$read_max-length($data);
|
||||
return $data;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
# Use perl read callback to read data to be uploaded
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_READFUNCTION, \&read_callb);
|
||||
|
||||
# Use perl passwd callback to read password for login to ftp server
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_PASSWDFUNCTION, \&passwd_callb);
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
my $bytes;
|
||||
|
||||
# Go get it
|
||||
if (Curl::easy::perform($curl) == 0) {
|
||||
Curl::easy::getinfo($curl, Curl::easy::CURLINFO_SIZE_UPLOAD, $bytes);
|
||||
print STDERR "$bytes bytes transferred\n";
|
||||
} else {
|
||||
# We can acces the error message in $errbuf here
|
||||
print STDERR "'$errbuf'\n";
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
# Cleanup
|
||||
Curl::easy::cleanup($curl);
|
||||
print "ok ".++$count."\n";
|
98
perl/Curl_easy/t/08ssl.t
Normal file
98
perl/Curl_easy/t/08ssl.t
Normal file
@@ -0,0 +1,98 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make t/thisfile.t'. After `make install' it should work as `perl thisfile.t'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..20\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
my $count=1;
|
||||
|
||||
# list of tests
|
||||
# site-url, verifypeer(0,1), verifyhost(0,2), result(0=ok, 1=fail)
|
||||
my $url_list=[
|
||||
[ 'https://216.168.252.86/', 0, 0, 0 ], # www.awayweb.com
|
||||
[ 'https://216.168.252.86/', 0, 2, 1 ], # www.awayweb.com
|
||||
[ 'https://www.verisign.com/', 0, 0, 0 ],
|
||||
[ 'https://www.verisign.com/', 0, 2, 0 ],
|
||||
[ 'https://www.verisign.com/', 1, 2, 0 ], # these fail on openssl0.9.5 - unknown sig
|
||||
[ 'https://www.verisign.com/', 1, 2, 0 ], # these fail on openssl0.9.5 - unknown sig
|
||||
[ 'https://lc2.law13.hotmail.passport.com/', 0, 0, 0 ],
|
||||
[ 'https://lc2.law13.hotmail.passport.com/', 0, 2, 0 ],
|
||||
[ 'https://lc2.law13.hotmail.passport.com/', 1, 2, 0 ], # fail on 0.9.5
|
||||
[ 'https://lc2.law13.hotmail.passport.com/', 1, 2, 0 ], # fail on 0.9.5
|
||||
[ 'https://www.modssl.org/', 0, 0, 0 ],
|
||||
[ 'https://www.modssl.org/', 0, 2, 0 ],
|
||||
[ 'https://www.modssl.org/', 1, 0, 1 ],
|
||||
[ 'https://www.modssl.org/', 1, 2, 1 ],
|
||||
];
|
||||
|
||||
# Init the curl session
|
||||
my $curl = Curl::easy::init();
|
||||
if ($curl == 0) {
|
||||
print "not ";
|
||||
}
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 0);
|
||||
#Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
my @myheaders;
|
||||
$myheaders[1] = "User-Agent: Verifying SSL functions in perl interface for libcURL";
|
||||
Curl::easy::setopt($curl, CURLOPT_HTTPHEADER, \@myheaders);
|
||||
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
my $errbuf;
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_FORBID_REUSE, 1);
|
||||
|
||||
|
||||
print "ok ".++$count."\n";
|
||||
Curl::easy::setopt($curl, CURLOPT_CAINFO,"ca-bundle.crt");
|
||||
|
||||
foreach my $test_list (@$url_list) {
|
||||
my ($url,$verifypeer,$verifyhost,$result)=@{$test_list};
|
||||
print STDERR "testing $url verify=$verifypeer at level $verifyhost expect ".($result?"fail":"pass")."\n";
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_SSL_VERIFYPEER,$verifypeer); # do verify
|
||||
Curl::easy::setopt($curl, CURLOPT_SSL_VERIFYHOST,$verifyhost); # check name
|
||||
my $retcode;
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
|
||||
$retcode=Curl::easy::perform($curl);
|
||||
if ( ($retcode != 0) != $result) {
|
||||
print STDERR "error $retcode $errbuf\n";
|
||||
print "not ";
|
||||
};
|
||||
print "ok ".++$count."\n";
|
||||
|
||||
}
|
2
perl/Curl_easy/t/Makefile.am
Normal file
2
perl/Curl_easy/t/Makefile.am
Normal file
@@ -0,0 +1,2 @@
|
||||
EXTRA_DIST = 00constants.t 01basic.t 02header-callback.t 03body-callback.t\
|
||||
04abort-test.t 05progress.t 06http-post.t 07ftp-upload.t 08ssl.t
|
@@ -1,315 +0,0 @@
|
||||
# Test script for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
# Before `make install' is performed this script should be runnable with
|
||||
# `make test'. After `make install' it should work as `perl test.pl'
|
||||
|
||||
######################### We start with some black magic to print on failure.
|
||||
|
||||
# Change 1..1 below to 1..last_test_to_print .
|
||||
# (It may become useful if the test is moved to ./t subdirectory.)
|
||||
use Benchmark;
|
||||
use strict;
|
||||
|
||||
BEGIN { $| = 1; print "1..13\n"; }
|
||||
END {print "not ok 1\n" unless $::loaded;}
|
||||
use Curl::easy;
|
||||
|
||||
$::loaded = 1;
|
||||
print "ok 1\n";
|
||||
|
||||
######################### End of black magic.
|
||||
|
||||
# Insert your test code below (better if it prints "ok 13"
|
||||
# (correspondingly "not ok 13") depending on the success of chunk 13
|
||||
# of the test code):
|
||||
|
||||
print "Testing curl version ",&Curl::easy::version(),"\n";
|
||||
|
||||
# Read URL to get
|
||||
my $defurl = "http://localhost/cgi-bin/printenv";
|
||||
my $url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
my $curl;
|
||||
if (($curl = Curl::easy::init()) != 0) {
|
||||
print "ok 2\n";
|
||||
} else {
|
||||
print "ko 2\n";
|
||||
}
|
||||
|
||||
|
||||
# No progress meter please
|
||||
# !! Need this on for all tests, as once disabled, can't re-enable it...
|
||||
#Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 1);
|
||||
|
||||
# Shut up completely
|
||||
Curl::easy::setopt($curl, CURLOPT_MUTE, 1);
|
||||
|
||||
# Follow location headers
|
||||
Curl::easy::setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
|
||||
|
||||
# Set timeout
|
||||
Curl::easy::setopt($curl, CURLOPT_TIMEOUT, 30);
|
||||
|
||||
# Set file where to read cookies from
|
||||
Curl::easy::setopt($curl, CURLOPT_COOKIEFILE, "cookies");
|
||||
|
||||
# Set file where to store the header
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEHEADER, *HEAD);
|
||||
print "ok 3\n";
|
||||
|
||||
# Set file where to store the body
|
||||
# Send body to stdout - test difference between FILE * and SV *
|
||||
#open BODY, ">body.out";
|
||||
#Curl::easy::setopt($curl, CURLOPT_FILE,*BODY);
|
||||
print "ok 4\n";
|
||||
|
||||
# Add some additional headers to the http-request:
|
||||
my @myheaders;
|
||||
$myheaders[0] = "Server: www";
|
||||
$myheaders[1] = "User-Agent: Perl interface for libcURL";
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_HTTPHEADER, \@myheaders);
|
||||
|
||||
# Store error messages in variable $errbuf
|
||||
# NOTE: The name of the variable is passed as a string!
|
||||
# setopt() creates a perl variable with that name, and
|
||||
# perform() stores the errormessage into it if an error occurs.
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_ERRORBUFFER, "errbuf");
|
||||
Curl::easy::setopt($curl, CURLOPT_URL, $url);
|
||||
print "ok 5\n";
|
||||
|
||||
my $bytes;
|
||||
my $realurl;
|
||||
my $httpcode;
|
||||
my $errbuf;
|
||||
|
||||
# Go get it
|
||||
if (Curl::easy::perform($curl) == 0) {
|
||||
Curl::easy::getinfo($curl, CURLINFO_SIZE_DOWNLOAD, $bytes);
|
||||
print "ok 6: $bytes bytes read\n";
|
||||
Curl::easy::getinfo($curl, CURLINFO_EFFECTIVE_URL, $realurl);
|
||||
Curl::easy::getinfo($curl, CURLINFO_HTTP_CODE, $httpcode);
|
||||
print "effective fetched url (http code: $httpcode) was: $url\n";
|
||||
} else {
|
||||
# We can acces the error message in $errbuf here
|
||||
print "not ok 6: '$errbuf'\n";
|
||||
die "basic url access failed";
|
||||
}
|
||||
|
||||
# cleanup
|
||||
#close HEAD;
|
||||
# test here - BODY is still expected to be the output
|
||||
# Curl-easy-1.0.2.pm core dumps if we 'perform' with a closed output FD...
|
||||
#close BODY;
|
||||
#exit;
|
||||
#
|
||||
# The header callback will only be called if your libcurl has the
|
||||
# CURLOPT_HEADERFUNCTION supported, otherwise your headers
|
||||
# go to CURLOPT_WRITEFUNCTION instead...
|
||||
#
|
||||
|
||||
my $header_called=0;
|
||||
sub header_callback { print "header callback called\n"; $header_called=1; return length($_[0])};
|
||||
|
||||
# test for sub reference and head callback
|
||||
Curl::easy::setopt($curl, CURLOPT_HEADERFUNCTION, \&header_callback);
|
||||
print "ok 7\n"; # so far so good
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok 8\n";
|
||||
|
||||
print "next test will fail on libcurl < 7.7.2\n";
|
||||
print "not " if (!$header_called); # ok if you have a libcurl <7.7.2
|
||||
print "ok 9\n";
|
||||
|
||||
my $body_called=0;
|
||||
sub body_callback {
|
||||
my ($chunk,$handle)=@_;
|
||||
print "body callback called with ",length($chunk)," bytes\n";
|
||||
print "data=$chunk\n";
|
||||
$body_called++;
|
||||
return length($chunk); # OK
|
||||
}
|
||||
|
||||
# test for ref to sub and body callback
|
||||
my $body_ref=\&body_callback;
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEFUNCTION, $body_ref);
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok 10\n";
|
||||
|
||||
print "not " if (!$body_called);
|
||||
print "ok 11\n";
|
||||
|
||||
my $body_abort_called=0;
|
||||
sub body_abort_callback {
|
||||
my ($chunk,$sv)=@_;
|
||||
print "body abort callback called with ",length($chunk)," bytes\n";
|
||||
$body_abort_called++;
|
||||
return -1; # signal a failure
|
||||
}
|
||||
|
||||
# test we can abort a request mid-way
|
||||
my $body_abort_ref=\&body_abort_callback;
|
||||
Curl::easy::setopt($curl, CURLOPT_WRITEFUNCTION, $body_abort_ref);
|
||||
|
||||
if (Curl::easy::perform($curl) == 0) { # reverse test - this should have failed
|
||||
print "not ";
|
||||
};
|
||||
print "ok 12\n";
|
||||
|
||||
print "not " if (!$body_abort_called); # should have been called
|
||||
print "ok 13\n";
|
||||
|
||||
# reset to a working 'write' function for next tests
|
||||
Curl::easy::setopt($curl,CURLOPT_WRITEFUNCTION, sub { return length($_[0])} );
|
||||
|
||||
# inline progress function
|
||||
# tests for inline subs and progress callback
|
||||
# - progress callback must return 'true' on each call.
|
||||
|
||||
my $progress_called=0;
|
||||
sub prog_callb
|
||||
{
|
||||
my ($clientp,$dltotal,$dlnow,$ultotal,$ulnow)=@_;
|
||||
print "\nperl progress_callback has been called!\n";
|
||||
print "clientp: $clientp, dltotal: $dltotal, dlnow: $dlnow, ultotal: $ultotal, ";
|
||||
print "ulnow: $ulnow\n";
|
||||
$progress_called++;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Curl::easy::setopt($curl, CURLOPT_PROGRESSFUNCTION, \&prog_callb);
|
||||
|
||||
# Turn progress meter back on - this doesn't work - once its off, its off.
|
||||
Curl::easy::setopt($curl, CURLOPT_NOPROGRESS, 0);
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok 14\n";
|
||||
|
||||
print "not " if (!$progress_called);
|
||||
print "ok 15\n";
|
||||
|
||||
my $read_max=10;
|
||||
|
||||
sub read_callb
|
||||
{
|
||||
my ($maxlen,$sv)=@_;
|
||||
print "\nperl read_callback has been called!\n";
|
||||
print "max data size: $maxlen\n";
|
||||
print "(upload needs $read_max bytes)\n";
|
||||
print "context: ".$sv."\n";
|
||||
if ($read_max > 0) {
|
||||
print "\nEnter max ", $read_max, " characters to be uploaded.\n";
|
||||
my $data = <STDIN>;
|
||||
chomp $data;
|
||||
$read_max=$read_max-length($data);
|
||||
return $data;
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
#
|
||||
# test post/read callback functions - requires a url which accepts posts, or it fails!
|
||||
#
|
||||
|
||||
Curl::easy::setopt($curl,CURLOPT_READFUNCTION,\&read_callb);
|
||||
Curl::easy::setopt($curl,CURLOPT_INFILESIZE,$read_max );
|
||||
Curl::easy::setopt($curl,CURLOPT_UPLOAD,1 );
|
||||
Curl::easy::setopt($curl,CURLOPT_CUSTOMREQUEST,"POST" );
|
||||
|
||||
if (Curl::easy::perform($curl) != 0) {
|
||||
print "not ";
|
||||
};
|
||||
print "ok 16\n";
|
||||
|
||||
sub passwd_callb
|
||||
{
|
||||
my ($clientp,$prompt,$buflen)=@_;
|
||||
print "\nperl passwd_callback has been called!\n";
|
||||
print "clientp: $clientp, prompt: $prompt, buflen: $buflen\n";
|
||||
print "\nEnter max $buflen characters for $prompt ";
|
||||
my $data = <STDIN>;
|
||||
chomp($data);
|
||||
return (0,$data);
|
||||
}
|
||||
|
||||
Curl::easy::cleanup($curl);
|
||||
|
||||
# Now do an ftp upload:
|
||||
|
||||
$defurl = "ftp://horn\@localhost//tmp/bla";
|
||||
print "\n\nPlease enter an URL for ftp upload [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
|
||||
# Init the curl session
|
||||
if (($curl = Curl::easy::init()) != 0) {
|
||||
print "ok 17\n";
|
||||
} else {
|
||||
print "not ok 17\n";
|
||||
}
|
||||
|
||||
# Set URL to get
|
||||
if (Curl::easy::setopt($curl, Curl::easy::CURLOPT_URL, $url) == 0) {
|
||||
print "ok 18\n";
|
||||
} else {
|
||||
print "not ok 18\n";
|
||||
|
||||
}
|
||||
|
||||
# Tell libcurl to to an upload
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_UPLOAD, 1);
|
||||
|
||||
# No progress meter please
|
||||
#Curl::easy::setopt($curl, Curl::easy::CURLOPT_NOPROGRESS, 1);
|
||||
|
||||
# Use our own progress callback
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_PROGRESSFUNCTION, \&prog_callb);
|
||||
|
||||
# Shut up completely
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_MUTE, 1);
|
||||
|
||||
# Store error messages in $errbuf
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_ERRORBUFFER, "errbuf");
|
||||
|
||||
$read_max=10;
|
||||
# Use perl read callback to read data to be uploaded
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_READFUNCTION,
|
||||
\&read_callb);
|
||||
|
||||
# Use perl passwd callback to read password for login to ftp server
|
||||
Curl::easy::setopt($curl, Curl::easy::CURLOPT_PASSWDFUNCTION, \&passwd_callb);
|
||||
|
||||
print "ok 19\n";
|
||||
|
||||
# Go get it
|
||||
if (Curl::easy::perform($curl) == 0) {
|
||||
Curl::easy::getinfo($curl, Curl::easy::CURLINFO_SIZE_UPLOAD, $bytes);
|
||||
print "ok 20: $bytes bytes transferred\n\n";
|
||||
} else {
|
||||
# We can acces the error message in $errbuf here
|
||||
print "not ok 20: '$errbuf'\n";
|
||||
}
|
||||
|
||||
# Cleanup
|
||||
Curl::easy::cleanup($curl);
|
||||
print "ok 21\n";
|
||||
|
@@ -21,8 +21,8 @@ LINKD = link.exe /incremental:yes /debug /libpath:"../lib"
|
||||
|
||||
CFLAGS = /I "../include" /nologo /W3 /GX /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||
LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:I386
|
||||
LINKLIBS = wsock32.lib libcurl.lib
|
||||
LINKLIBS_DEBUG = wsock32.lib libcurld.lib
|
||||
LINKLIBS = ws2_32.lib libcurl.lib
|
||||
LINKLIBS_DEBUG = ws2_32.lib libcurld.lib
|
||||
|
||||
RELEASE_OBJS= \
|
||||
hugehelpr.obj \
|
||||
|
@@ -14,6 +14,12 @@
|
||||
/* Define if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define if you have utime() */
|
||||
#define HAVE_UTIME 1
|
||||
|
||||
/* Define if you have the <sys/utime.h> header file */
|
||||
#define HAVE_SYS_UTIME_H 1
|
||||
|
||||
/*************************************************
|
||||
* This section is for compiler specific defines.*
|
||||
*************************************************/
|
||||
|
@@ -10,3 +10,12 @@
|
||||
|
||||
/* Define if you have strdup() */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define if you have utime() */
|
||||
#undef HAVE_UTIME
|
||||
|
||||
/* Define if you have the <utime.h> header file */
|
||||
#undef HAVE_UTIME_H
|
||||
|
||||
/* Define if you have thhe <sys/utime.h> header file */
|
||||
#undef HAVE_SYS_UTIME_H
|
||||
|
51
src/main.c
51
src/main.c
@@ -60,6 +60,14 @@
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_UTIME_H
|
||||
#include <utime.h>
|
||||
#else
|
||||
#ifdef HAVE_SYS_UTIME_H
|
||||
#include <sys/utime.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
/* this is low-level hard-hacking memory leak tracking shit */
|
||||
@@ -88,7 +96,6 @@ typedef enum {
|
||||
/* Just a set of bits */
|
||||
#define CONF_DEFAULT 0
|
||||
|
||||
#define CONF_USEREMOTETIME (1<<0) /* set the remote time on the local file */
|
||||
#define CONF_AUTO_REFERER (1<<4) /* the automatic referer-system please! */
|
||||
#define CONF_VERBOSE (1<<5) /* talk a lot */
|
||||
#define CONF_HEADER (1<<8) /* throw the header out too */
|
||||
@@ -310,7 +317,8 @@ static void help(void)
|
||||
" --egd-file <file> EGD socket path for random data (SSL)\n"
|
||||
" -e/--referer Referer page (H)");
|
||||
puts(" -E/--cert <cert[:passwd]> Specifies your certificate file and password (HTTPS)\n"
|
||||
" --cacert <file> CA certifciate to verify peer against (HTTPS)\n"
|
||||
" --cacert <file> CA certifciate to verify peer against (SSL)\n"
|
||||
" --ciphers <list> What SSL ciphers to use (SSL)\n"
|
||||
" --connect-timeout <seconds> Maximum time allowed for connection\n"
|
||||
" -f/--fail Fail silently (no output at all) on errors (H)\n"
|
||||
" -F/--form <name=content> Specify HTTP POST data (H)\n"
|
||||
@@ -336,6 +344,7 @@ static void help(void)
|
||||
" -q When used as the first parameter disables .curlrc\n"
|
||||
" -Q/--quote <cmd> Send QUOTE command to FTP before file transfer (F)");
|
||||
puts(" -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server\n"
|
||||
" -R/--remote-time Set the remote file's time on the local output\n"
|
||||
" -s/--silent Silent mode. Don't output anything\n"
|
||||
" -S/--show-error Show error. With -s, make curl show errors when they occur\n"
|
||||
" --stderr <file> Where to redirect stderr. - means stdout.\n"
|
||||
@@ -367,6 +376,7 @@ struct LongShort {
|
||||
};
|
||||
|
||||
struct Configurable {
|
||||
bool remote_time;
|
||||
char *random_file;
|
||||
char *egd_file;
|
||||
char *useragent;
|
||||
@@ -404,6 +414,7 @@ struct Configurable {
|
||||
struct getout *url_get; /* point to the node to fill in URL */
|
||||
struct getout *url_out; /* point to the node to fill in outfile */
|
||||
|
||||
char *cipher_list;
|
||||
char *cert;
|
||||
char *cacert;
|
||||
char *cert_passwd;
|
||||
@@ -595,6 +606,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
{"5a", "random-file", TRUE},
|
||||
{"5b", "egd-file", TRUE},
|
||||
{"5c", "connect-timeout", TRUE},
|
||||
{"5d", "ciphers", TRUE},
|
||||
|
||||
{"2", "sslv2", FALSE},
|
||||
{"3", "sslv3", FALSE},
|
||||
@@ -634,6 +646,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
{"q", "disable", FALSE},
|
||||
{"Q", "quote", TRUE},
|
||||
{"r", "range", TRUE},
|
||||
{"R", "remote-time", FALSE},
|
||||
{"s", "silent", FALSE},
|
||||
{"S", "show-error", FALSE},
|
||||
{"t", "telnet-options", TRUE},
|
||||
@@ -755,6 +768,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
case 'c': /* connect-timeout */
|
||||
config->connecttimeout=atoi(nextarg);
|
||||
break;
|
||||
case 'd': /* ciphers */
|
||||
GetStr(&config->cipher_list, nextarg);
|
||||
break;
|
||||
default: /* the URL! */
|
||||
{
|
||||
struct getout *url;
|
||||
@@ -1055,6 +1071,10 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
/* byte range requested */
|
||||
GetStr(&config->range, nextarg);
|
||||
break;
|
||||
case 'R':
|
||||
/* use remote file's time */
|
||||
config->remote_time ^= TRUE;
|
||||
break;
|
||||
case 's':
|
||||
/* don't show progress meter, don't show errors : */
|
||||
config->conf |= (CONF_MUTE|CONF_NOPROGRESS);
|
||||
@@ -1957,7 +1977,6 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, config->cert_passwd);
|
||||
|
||||
if(config->cacert) {
|
||||
/* available from libcurl 7.5: */
|
||||
curl_easy_setopt(curl, CURLOPT_CAINFO, config->cacert);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
|
||||
@@ -1965,13 +1984,12 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
else
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
|
||||
|
||||
if(config->conf&(CONF_NOBODY|CONF_USEREMOTETIME)) {
|
||||
if((config->conf&CONF_NOBODY) ||
|
||||
config->remote_time) {
|
||||
/* no body or use remote time */
|
||||
/* new in 7.5 */
|
||||
curl_easy_setopt(curl, CURLOPT_FILETIME, TRUE);
|
||||
}
|
||||
|
||||
/* 7.5 news: */
|
||||
if (config->maxredirs)
|
||||
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
|
||||
else
|
||||
@@ -2013,6 +2031,10 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
curl_easy_setopt(curl, CURLOPT_EGDSOCKET, config->egd_file);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout);
|
||||
|
||||
/* debug */
|
||||
if(config->cipher_list)
|
||||
curl_easy_setopt(curl, CURLOPT_SSL_CIPHER_LIST, config->cipher_list);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
if(config->writeout) {
|
||||
@@ -2035,6 +2057,23 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
free(urlbuffer);
|
||||
if (outfile && !strequal(outfile, "-") && outs.stream)
|
||||
fclose(outs.stream);
|
||||
|
||||
#ifdef HAVE_UTIME
|
||||
/* Important that we set the time _after_ the file has been
|
||||
closed, as is done above here */
|
||||
if(config->remote_time && outs.filename) {
|
||||
/* as libcurl if we got a time. Pretty please */
|
||||
long filetime;
|
||||
curl_easy_getinfo(curl, CURLINFO_FILETIME, &filetime);
|
||||
if(filetime >= 0) {
|
||||
struct utimbuf times;
|
||||
times.actime = filetime;
|
||||
times.modtime = filetime;
|
||||
utime(outs.filename, ×); /* set the time we got */
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (config->infile)
|
||||
fclose(infd);
|
||||
if(headerfilep)
|
||||
|
@@ -44,7 +44,7 @@
|
||||
#define OS "unknown"
|
||||
#endif
|
||||
|
||||
#ifndef fileno /* sunos 4 have this as a macro! */
|
||||
#if !defined(fileno) && !defined(WIN32) /* sunos 4 have this as a macro! */
|
||||
int fileno( FILE *stream);
|
||||
#endif
|
||||
|
||||
|
@@ -1,3 +1,3 @@
|
||||
#define CURL_NAME "curl"
|
||||
#define CURL_VERSION "7.8.2-pre1"
|
||||
#define CURL_VERSION "7.9"
|
||||
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "
|
||||
|
57
tests/FILEFORMAT
Normal file
57
tests/FILEFORMAT
Normal file
@@ -0,0 +1,57 @@
|
||||
The file format of the test suite is a very simple and extendable format. All
|
||||
data for a single test case resides in a single ASCII file. Labels mark the
|
||||
beginning and the end of all sections. Each label must be written in its own
|
||||
line and is resembling XML/HTML.
|
||||
|
||||
Each file is split up in three main sections: reply, client and verify. The
|
||||
reply section is used for the server to know what to send as a reply for the
|
||||
requests curl sends, the client section defines how the client should behave
|
||||
while the verify section defines how to verify that the data stored after a
|
||||
command has been run ended up correctly.
|
||||
|
||||
Each main section has a number of available subsections that can be
|
||||
specified, that will be checked/used if specified. This document includes all
|
||||
the subsections currently supported.
|
||||
|
||||
<reply>
|
||||
<data>
|
||||
data to sent to the client on its request
|
||||
</data>
|
||||
<datacheck>
|
||||
if the data is sent but this is what should be checked afterwards
|
||||
</datacheck>
|
||||
<size>
|
||||
number to return on a ftp SIZE command
|
||||
</size>
|
||||
</reply>
|
||||
|
||||
<client>
|
||||
<name>
|
||||
test case description
|
||||
</name>
|
||||
<command>
|
||||
command line to run, there's a bunch of %variables that get replaced
|
||||
accordingly. more about them elsewhere
|
||||
</command>
|
||||
<file name="log/filename">
|
||||
this creates the named file with this content before the test case is run
|
||||
which is useful if the test case needs a file to act on.
|
||||
</file>
|
||||
</client>
|
||||
|
||||
<verify>
|
||||
<errorcode>
|
||||
numerical error code curl is supposed to return
|
||||
</errorcode>
|
||||
<strip>
|
||||
One regex per line that is removed from the protocol dumps before the
|
||||
comparison is made. This is very useful to remove dependencies on dynamicly
|
||||
changing protocol data such as port numbers or user-agent strings.
|
||||
</strip>
|
||||
<protocol>
|
||||
the protocol dump curl should transmit
|
||||
</protocol>
|
||||
<upload>
|
||||
the contents of the upload data curl should have sent
|
||||
</upload>
|
||||
</verify>
|
@@ -1,5 +1,6 @@
|
||||
EXTRA_DIST = ftpserver.pl httpserver.pl httpsserver.pl runtests.pl \
|
||||
ftpsserver.pl stunnel.pm getpart.pm
|
||||
ftpsserver.pl stunnel.pm getpart.pm FILEFORMAT README \
|
||||
stunnel.pem
|
||||
|
||||
SUBDIRS = data
|
||||
|
||||
@@ -12,11 +13,11 @@ curl:
|
||||
@(cd ..; make)
|
||||
|
||||
test:
|
||||
$(MAKE) -C data test
|
||||
@cd data && exec $(MAKE) test
|
||||
srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl
|
||||
|
||||
quiet-test:
|
||||
$(MAKE) -C data test
|
||||
@cd data && exec $(MAKE) test
|
||||
srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl -s -a
|
||||
|
||||
clean:
|
||||
|
@@ -5,9 +5,11 @@ test:
|
||||
[ -f test1 ] || ln -s $(srcdir)/test* .
|
||||
|
||||
EXTRA_DIST = \
|
||||
test1 test104 test13 test19 test21 test3 test5 \
|
||||
test10 test105 test14 test2 test22 test300 test6 \
|
||||
test100 test106 test15 test20 test23 test33 test7 \
|
||||
test101 test107 test16 test200 test24 test4 test8 \
|
||||
test102 test11 test17 test201 test25 test400 test9 \
|
||||
test103 test12 test18 test202 test26 test43 test44
|
||||
test1 test106 test113 test120 test15 test201 test3 test44 \
|
||||
test10 test107 test114 test121 test16 test202 test300 test5 \
|
||||
test100 test108 test115 test122 test17 test21 test301 test6 \
|
||||
test101 test109 test116 test123 test18 test22 test302 test7 \
|
||||
test102 test11 test117 test124 test19 test23 test33 test8 \
|
||||
test103 test110 test118 test125 test2 test24 test4 test9 \
|
||||
test104 test111 test119 test13 test20 test25 test400 \
|
||||
test105 test112 test12 test14 test200 test26 test43
|
41
tests/data/test108
Normal file
41
tests/data/test108
Normal file
@@ -0,0 +1,41 @@
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
</data>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<name>
|
||||
FTP PORT upload with CWD
|
||||
</name>
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/CWD/STOR/RETR/108 -T log/upload108 -P -
|
||||
</command>
|
||||
<file name="log/upload108">
|
||||
Moooooooooooo
|
||||
upload this
|
||||
</file>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<strip>
|
||||
^PORT .*
|
||||
^EPRT .*
|
||||
^LPRT .*
|
||||
</strip>
|
||||
<protocol>
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
CWD CWD/STOR/RETR
|
||||
PORT 127,0,0,1,5,109
|
||||
TYPE I
|
||||
STOR 108
|
||||
</protocol>
|
||||
<upload>
|
||||
Moooooooooooo
|
||||
upload this
|
||||
</upload>
|
||||
</verify>
|
37
tests/data/test109
Normal file
37
tests/data/test109
Normal file
@@ -0,0 +1,37 @@
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
</data>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<name>
|
||||
FTP PASV upload append
|
||||
</name>
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/109 -T log/upload109 --append
|
||||
</command>
|
||||
<file name="log/upload109">
|
||||
Moooooooooooo
|
||||
upload this
|
||||
</file>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<strip>
|
||||
</strip>
|
||||
<protocol>
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
TYPE I
|
||||
APPE 109
|
||||
</protocol>
|
||||
<upload>
|
||||
Moooooooooooo
|
||||
upload this
|
||||
</upload>
|
||||
</verify>
|
36
tests/data/test110
Normal file
36
tests/data/test110
Normal file
@@ -0,0 +1,36 @@
|
||||
# Server-side
|
||||
<reply>
|
||||
<data>
|
||||
expected to be a file without the first part
|
||||
but we emulate that
|
||||
</data>
|
||||
<size>
|
||||
85
|
||||
</size>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<name>
|
||||
FTP download resume with set limit
|
||||
</name>
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/110 -C 20
|
||||
</command>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<strip>
|
||||
</strip>
|
||||
<protocol>
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
TYPE I
|
||||
SIZE 110
|
||||
REST 20
|
||||
RETR 110
|
||||
</protocol>
|
||||
</verify>
|
33
tests/data/test111
Normal file
33
tests/data/test111
Normal file
@@ -0,0 +1,33 @@
|
||||
# Server-side
|
||||
<reply>
|
||||
<size>
|
||||
85
|
||||
</size>
|
||||
</reply>
|
||||
|
||||
# Client-side
|
||||
<client>
|
||||
<name>
|
||||
FTP download resume beyond file size
|
||||
</name>
|
||||
<command>
|
||||
ftp://%HOSTIP:%FTPPORT/111 -C 2000
|
||||
</command>
|
||||
</test>
|
||||
|
||||
# Verify data after the test has been "shot"
|
||||
<verify>
|
||||
<errorcode>
|
||||
36
|
||||
</errorcode>
|
||||
<strip>
|
||||
</strip>
|
||||
<protocol>
|
||||
USER anonymous
|
||||
PASS curl_by_daniel@haxx.se
|
||||
PWD
|
||||
PASV
|
||||
TYPE I
|
||||
SIZE 111
|
||||
</protocol>
|
||||
</verify>
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user