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
|
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)
|
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
|
- Georg Huettenegger modified the curl_formadd() functionality slightly, and
|
||||||
added support for error code 417 when doing form post and using the Expect:
|
added support for error code 417 when doing form post and using the Expect:
|
||||||
header. Great work!
|
header. Great work!
|
||||||
|
|
||||||
- Made some tests with cached SSL session IDs, and they seem to work. There
|
- 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
|
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.
|
- Upgraded to automake 1.5 on my development/release machine.
|
||||||
|
|
||||||
@@ -1065,7 +1194,7 @@ Version 7.6.1-pre2
|
|||||||
Daniel (31 January 2001)
|
Daniel (31 January 2001)
|
||||||
- Curl_read() and curl_read() now return a ssize_t for the size, as it had to
|
- 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
|
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.
|
find this.
|
||||||
|
|
||||||
- Added a configure.in check for a working getaddrinfo() if IPv6 is requested.
|
- 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
|
information about other files and things that the CVS repository keeps in its
|
||||||
inner sanctum.
|
inner sanctum.
|
||||||
|
|
||||||
Use autoconf 2.50 and no earlier. Also, try having automake 1.4 and libtool
|
Use autoconf 2.50 and no earlier. Also, try having automake 1.5 and libtool
|
||||||
1.4 at least.
|
1.4.1 at least.
|
||||||
|
|
||||||
You will need perl to generate the src/hugehelp.c file. The file
|
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
|
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 \
|
CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt \
|
||||||
config-win32.h reconf Makefile.dist \
|
config-win32.h reconf Makefile.dist \
|
||||||
curl-config.in build_vms.com config-riscos.h \
|
curl-config.in build_vms.com config-riscos.h \
|
||||||
config-vms.h
|
config-vms.h curl-mode.el
|
||||||
|
|
||||||
bin_SCRIPTS = curl-config
|
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:
|
# create a root makefile in the distribution:
|
||||||
dist-hook:
|
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
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# 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
|
# 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
|
# under the terms of the GNU General Public License as published by
|
||||||
@@ -52,7 +52,7 @@ version="\
|
|||||||
GNU config.guess ($timestamp)
|
GNU config.guess ($timestamp)
|
||||||
|
|
||||||
Originally written by Per Bothner.
|
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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This is free software; see the source for copying conditions. There is NO
|
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
|
# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
|
||||||
# use `HOST_CC' if defined, but it is deprecated.
|
# use `HOST_CC' if defined, but it is deprecated.
|
||||||
|
|
||||||
case $CC_FOR_BUILD,$HOST_CC,$CC in
|
set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in
|
||||||
,,) echo "int dummy(){}" > $dummy.c
|
,,) echo "int dummy(){}" > $dummy.c ;
|
||||||
for c in cc gcc c89 ; do
|
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
|
if test $? = 0 ; then
|
||||||
CC_FOR_BUILD="$c"; break
|
CC_FOR_BUILD="$c"; break ;
|
||||||
fi
|
fi ;
|
||||||
done
|
done ;
|
||||||
rm -f $dummy.c $dummy.o $dummy.rel
|
rm -f $dummy.c $dummy.o $dummy.rel ;
|
||||||
if test x"$CC_FOR_BUILD" = x ; then
|
if test x"$CC_FOR_BUILD" = x ; then
|
||||||
CC_FOR_BUILD=no_compiler_found
|
CC_FOR_BUILD=no_compiler_found ;
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
,,*) CC_FOR_BUILD=$CC ;;
|
,,*) CC_FOR_BUILD=$CC ;;
|
||||||
,*,*) CC_FOR_BUILD=$HOST_CC ;;
|
,*,*) CC_FOR_BUILD=$HOST_CC ;;
|
||||||
esac
|
esac'
|
||||||
|
|
||||||
# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
|
# 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
|
if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
|
||||||
PATH=$PATH:/.attbin ; export PATH
|
PATH=$PATH:/.attbin ; export PATH
|
||||||
fi
|
fi
|
||||||
@@ -150,6 +150,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
# to ELF recently, or will in the future.
|
# to ELF recently, or will in the future.
|
||||||
case "${UNAME_MACHINE}" in
|
case "${UNAME_MACHINE}" in
|
||||||
i386|sparc|amiga|arm*|hp300|mvme68k|vax|atari|luna68k|mac68k|news68k|next68k|pc532|sun3*|x68k)
|
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 \
|
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||||
| grep __ELF__ >/dev/null
|
| grep __ELF__ >/dev/null
|
||||||
then
|
then
|
||||||
@@ -204,6 +205,7 @@ main:
|
|||||||
jsr \$26,exit
|
jsr \$26,exit
|
||||||
.end main
|
.end main
|
||||||
EOF
|
EOF
|
||||||
|
eval $set_cc_for_build
|
||||||
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
|
$CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null
|
||||||
if test "$?" = 0 ; then
|
if test "$?" = 0 ; then
|
||||||
case `./$dummy` in
|
case `./$dummy` in
|
||||||
@@ -225,6 +227,9 @@ EOF
|
|||||||
2-307)
|
2-307)
|
||||||
UNAME_MACHINE="alphaev67"
|
UNAME_MACHINE="alphaev67"
|
||||||
;;
|
;;
|
||||||
|
2-1307)
|
||||||
|
UNAME_MACHINE="alphaev68"
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
rm -f $dummy.s $dummy
|
rm -f $dummy.s $dummy
|
||||||
@@ -328,6 +333,9 @@ EOF
|
|||||||
aushp:SunOS:*:*)
|
aushp:SunOS:*:*)
|
||||||
echo sparc-auspex-sunos${UNAME_RELEASE}
|
echo sparc-auspex-sunos${UNAME_RELEASE}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
|
sparc*:NetBSD:*)
|
||||||
|
echo `uname -p`-unknown-netbsd${UNAME_RELEASE}
|
||||||
|
exit 0 ;;
|
||||||
atari*:OpenBSD:*:*)
|
atari*:OpenBSD:*:*)
|
||||||
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
echo m68k-unknown-openbsd${UNAME_RELEASE}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
@@ -385,6 +393,7 @@ EOF
|
|||||||
echo clipper-intergraph-clix${UNAME_RELEASE}
|
echo clipper-intergraph-clix${UNAME_RELEASE}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
mips:*:*:UMIPS | mips:*:*:RISCos)
|
mips:*:*:UMIPS | mips:*:*:RISCos)
|
||||||
|
eval $set_cc_for_build
|
||||||
sed 's/^ //' << EOF >$dummy.c
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
#include <stdio.h> /* for printf() prototype */
|
#include <stdio.h> /* for printf() prototype */
|
||||||
@@ -475,6 +484,7 @@ EOF
|
|||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
*:AIX:2:3)
|
*:AIX:2:3)
|
||||||
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
|
if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
|
||||||
|
eval $set_cc_for_build
|
||||||
sed 's/^ //' << EOF >$dummy.c
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
#include <sys/systemcfg.h>
|
#include <sys/systemcfg.h>
|
||||||
|
|
||||||
@@ -553,6 +563,7 @@ EOF
|
|||||||
fi ;;
|
fi ;;
|
||||||
esac
|
esac
|
||||||
if [ "${HP_ARCH}" = "" ]; then
|
if [ "${HP_ARCH}" = "" ]; then
|
||||||
|
eval $set_cc_for_build
|
||||||
sed 's/^ //' << EOF >$dummy.c
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
|
|
||||||
#define _HPUX_SOURCE
|
#define _HPUX_SOURCE
|
||||||
@@ -598,6 +609,7 @@ EOF
|
|||||||
echo ia64-hp-hpux${HPUX_REV}
|
echo ia64-hp-hpux${HPUX_REV}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
3050*:HI-UX:*:*)
|
3050*:HI-UX:*:*)
|
||||||
|
eval $set_cc_for_build
|
||||||
sed 's/^ //' << EOF >$dummy.c
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
int
|
int
|
||||||
@@ -633,7 +645,7 @@ EOF
|
|||||||
9000/8??:4.3bsd:*:*)
|
9000/8??:4.3bsd:*:*)
|
||||||
echo hppa1.0-hp-bsd
|
echo hppa1.0-hp-bsd
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
*9??*:MPE/iX:*:*)
|
*9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
|
||||||
echo hppa1.0-hp-mpeix
|
echo hppa1.0-hp-mpeix
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
|
hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
|
||||||
@@ -677,12 +689,13 @@ EOF
|
|||||||
echo xmp-cray-unicos
|
echo xmp-cray-unicos
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
CRAY*Y-MP:*:*:*)
|
CRAY*Y-MP:*:*:*)
|
||||||
echo ymp-cray-unicos${UNAME_RELEASE}
|
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
CRAY*[A-Z]90:*:*:*)
|
CRAY*[A-Z]90:*:*:*)
|
||||||
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
|
echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
|
||||||
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
|
| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
|
||||||
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
|
-e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
|
||||||
|
-e 's/\.[^.]*$/.X/'
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
CRAY*TS:*:*:*)
|
CRAY*TS:*:*:*)
|
||||||
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||||
@@ -763,97 +776,29 @@ EOF
|
|||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
mips:Linux:*:*)
|
mips:Linux:*:*)
|
||||||
cat >$dummy.c <<EOF
|
case `sed -n '/^byte/s/^.*: \(.*\) endian/\1/p' < /proc/cpuinfo` in
|
||||||
#ifdef __cplusplus
|
big) echo mips-unknown-linux-gnu && exit 0 ;;
|
||||||
#include <stdio.h> /* for printf() prototype */
|
little) echo mipsel-unknown-linux-gnu && exit 0 ;;
|
||||||
int main (int argc, char *argv[]) {
|
esac
|
||||||
#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
|
|
||||||
;;
|
;;
|
||||||
ppc:Linux:*:*)
|
ppc:Linux:*:*)
|
||||||
# Determine Lib Version
|
echo powerpc-unknown-linux-gnu
|
||||||
cat >$dummy.c <<EOF
|
exit 0 ;;
|
||||||
#include <features.h>
|
ppc64:Linux:*:*)
|
||||||
#if defined(__GLIBC__)
|
echo powerpc64-unknown-linux-gnu
|
||||||
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}
|
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
alpha:Linux:*:*)
|
alpha:Linux:*:*)
|
||||||
cat <<EOF >$dummy.s
|
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
||||||
.data
|
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||||
\$Lformat:
|
EV56) UNAME_MACHINE=alphaev56 ;;
|
||||||
.byte 37,100,45,37,120,10,0 # "%d-%x\n"
|
PCA56) UNAME_MACHINE=alphapca56 ;;
|
||||||
.text
|
PCA57) UNAME_MACHINE=alphapca56 ;;
|
||||||
.globl main
|
EV6) UNAME_MACHINE=alphaev6 ;;
|
||||||
.align 4
|
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||||
.ent main
|
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||||
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" ;;
|
|
||||||
esac
|
esac
|
||||||
objdump --private-headers $dummy | \
|
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
|
||||||
grep ld.so.1 > /dev/null
|
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||||
if test "$?" = 0 ; then
|
|
||||||
LIBC="libc1"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
rm -f $dummy.s $dummy
|
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
parisc:Linux:*:* | hppa:Linux:*:*)
|
parisc:Linux:*:* | hppa:Linux:*:*)
|
||||||
@@ -883,40 +828,30 @@ EOF
|
|||||||
# The BFD linker knows what the default object file format is, so
|
# 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
|
# 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.
|
# problems with other programs or directories called `ld' in the path.
|
||||||
ld_supported_emulations=`cd /; ld --help 2>&1 \
|
ld_supported_targets=`cd /; ld --help 2>&1 \
|
||||||
| sed -ne '/supported emulations:/!d
|
| sed -ne '/supported targets:/!d
|
||||||
s/[ ][ ]*/ /g
|
s/[ ][ ]*/ /g
|
||||||
s/.*supported emulations: *//
|
s/.*supported targets: *//
|
||||||
s/ .*//
|
s/ .*//
|
||||||
p'`
|
p'`
|
||||||
case "$ld_supported_emulations" in
|
case "$ld_supported_targets" in
|
||||||
i*86linux)
|
elf32-i386)
|
||||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
|
||||||
exit 0
|
|
||||||
;;
|
|
||||||
elf_i*86)
|
|
||||||
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
|
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"
|
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
|
||||||
exit 0
|
exit 0 ;;
|
||||||
;;
|
"")
|
||||||
esac
|
# Either a pre-BFD a.out linker (linux-gnuoldld) or
|
||||||
# Either a pre-BFD a.out linker (linux-gnuoldld)
|
# one that does not give us useful --help.
|
||||||
# or one that does not give us useful --help.
|
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
|
||||||
# GCC wants to distinguish between linux-gnuoldld and linux-gnuaout.
|
exit 0 ;;
|
||||||
# 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;
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
# Determine whether the default compiler is a.out or elf
|
# Determine whether the default compiler is a.out or elf
|
||||||
|
eval $set_cc_for_build
|
||||||
cat >$dummy.c <<EOF
|
cat >$dummy.c <<EOF
|
||||||
#include <features.h>
|
#include <features.h>
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -928,15 +863,15 @@ EOF
|
|||||||
#ifdef __ELF__
|
#ifdef __ELF__
|
||||||
# ifdef __GLIBC__
|
# ifdef __GLIBC__
|
||||||
# if __GLIBC__ >= 2
|
# if __GLIBC__ >= 2
|
||||||
printf ("%s-${VENDOR}-linux-gnu\n", argv[1]);
|
printf ("%s-pc-linux-gnu\n", argv[1]);
|
||||||
# else
|
# else
|
||||||
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
printf ("%s-pc-linux-gnulibc1\n", argv[1]);
|
||||||
# endif
|
# endif
|
||||||
# else
|
# else
|
||||||
printf ("%s-${VENDOR}-linux-gnulibc1\n", argv[1]);
|
printf ("%s-pc-linux-gnulibc1\n", argv[1]);
|
||||||
# endif
|
# endif
|
||||||
#else
|
#else
|
||||||
printf ("%s-${VENDOR}-linux-gnuaout\n", argv[1]);
|
printf ("%s-pc-linux-gnuaout\n", argv[1]);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -945,9 +880,10 @@ EOF
|
|||||||
rm -f $dummy.c $dummy
|
rm -f $dummy.c $dummy
|
||||||
test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0
|
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*:*)
|
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
|
echo i386-sequent-sysv4
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
i*86:UNIX_SV:4.2MP:2.*)
|
i*86:UNIX_SV:4.2MP:2.*)
|
||||||
@@ -966,14 +902,13 @@ EOF
|
|||||||
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
|
echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
|
||||||
fi
|
fi
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
i*86:*:5:7*)
|
i*86:*:5:[78]*)
|
||||||
# Fixed at (any) Pentium or better
|
case `/bin/uname -X | grep "^Machine"` in
|
||||||
UNAME_MACHINE=i586
|
*486*) UNAME_MACHINE=i486 ;;
|
||||||
if [ ${UNAME_SYSTEM} = "UnixWare" ] ; then
|
*Pentium) UNAME_MACHINE=i586 ;;
|
||||||
echo ${UNAME_MACHINE}-sco-sysv${UNAME_RELEASE}uw${UNAME_VERSION}
|
*Pent*|*Celeron) UNAME_MACHINE=i686 ;;
|
||||||
else
|
esac
|
||||||
echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
|
echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
|
||||||
fi
|
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
i*86:*:3.2:*)
|
i*86:*:3.2:*)
|
||||||
if test -f /usr/options/cb.name; then
|
if test -f /usr/options/cb.name; then
|
||||||
@@ -1067,7 +1002,7 @@ EOF
|
|||||||
echo ns32k-sni-sysv
|
echo ns32k-sni-sysv
|
||||||
fi
|
fi
|
||||||
exit 0 ;;
|
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>
|
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||||
echo i586-unisys-sysv4
|
echo i586-unisys-sysv4
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
@@ -1080,6 +1015,10 @@ EOF
|
|||||||
# From seanf@swdc.stratus.com.
|
# From seanf@swdc.stratus.com.
|
||||||
echo i860-stratus-sysv4
|
echo i860-stratus-sysv4
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
|
*:VOS:*:*)
|
||||||
|
# From Paul.Green@stratus.com.
|
||||||
|
echo hppa1.1-stratus-vos
|
||||||
|
exit 0 ;;
|
||||||
mc68*:A/UX:*:*)
|
mc68*:A/UX:*:*)
|
||||||
echo m68k-apple-aux${UNAME_RELEASE}
|
echo m68k-apple-aux${UNAME_RELEASE}
|
||||||
exit 0 ;;
|
exit 0 ;;
|
||||||
@@ -1172,11 +1111,18 @@ EOF
|
|||||||
*:ITS:*:*)
|
*:ITS:*:*)
|
||||||
echo pdp10-unknown-its
|
echo pdp10-unknown-its
|
||||||
exit 0 ;;
|
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
|
esac
|
||||||
|
|
||||||
#echo '(No uname command or uname output not recognized.)' 1>&2
|
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||||
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
||||||
|
|
||||||
|
eval $set_cc_for_build
|
||||||
cat >$dummy.c <<EOF
|
cat >$dummy.c <<EOF
|
||||||
#ifdef _SEQUENT_
|
#ifdef _SEQUENT_
|
||||||
# include <sys/types.h>
|
# 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
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
|
||||||
# Free Software Foundation, Inc.
|
# Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2001-04-20'
|
timestamp='2001-09-07'
|
||||||
|
|
||||||
# This file is (in principle) common to ALL GNU software.
|
# This file is (in principle) common to ALL GNU software.
|
||||||
# The presence of a machine in this file suggests that SOME 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.
|
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||||
case $maybe_os in
|
case $maybe_os in
|
||||||
nto-qnx* | linux-gnu* | storm-chaos* | os2-emx*)
|
nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-*)
|
||||||
os=-$maybe_os
|
os=-$maybe_os
|
||||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||||
;;
|
;;
|
||||||
@@ -157,6 +157,14 @@ case $os in
|
|||||||
os=-vxworks
|
os=-vxworks
|
||||||
basic_machine=$1
|
basic_machine=$1
|
||||||
;;
|
;;
|
||||||
|
-chorusos*)
|
||||||
|
os=-chorusos
|
||||||
|
basic_machine=$1
|
||||||
|
;;
|
||||||
|
-chorusrdb)
|
||||||
|
os=-chorusrdb
|
||||||
|
basic_machine=$1
|
||||||
|
;;
|
||||||
-hiux*)
|
-hiux*)
|
||||||
os=-hiuxwe2
|
os=-hiuxwe2
|
||||||
;;
|
;;
|
||||||
@@ -215,26 +223,36 @@ esac
|
|||||||
case $basic_machine in
|
case $basic_machine in
|
||||||
# Recognize the basic CPU types without company name.
|
# Recognize the basic CPU types without company name.
|
||||||
# Some are omitted here because they have special meanings below.
|
# Some are omitted here because they have special meanings below.
|
||||||
tahoe | i860 | ia64 | m32r | m68k | m68000 | m88k | ns32k | arc \
|
1750a | 580 \
|
||||||
| arm | arme[lb] | arm[bl]e | armv[2345] | armv[345][lb] | strongarm | xscale \
|
| a29k \
|
||||||
| pyramid | mn10200 | mn10300 | tron | a29k \
|
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||||
| 580 | i960 | h8300 \
|
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \
|
||||||
| x86 | ppcbe | mipsbe | mipsle | shbe | shle \
|
| c4x | clipper \
|
||||||
| hppa | hppa1.0 | hppa1.1 | hppa2.0 | hppa2.0w | hppa2.0n \
|
| d10v | d30v | dsp16xx \
|
||||||
| hppa64 \
|
| fr30 \
|
||||||
| alpha | alphaev[4-8] | alphaev56 | alphapca5[67] \
|
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||||
| alphaev6[78] \
|
| i370 | i860 | i960 | ia64 \
|
||||||
| we32k | ns16k | clipper | i370 | sh | sh[34] \
|
| m32r | m68000 | m68k | m88k | mcore \
|
||||||
| powerpc | powerpcle \
|
| mips16 | mips64 | mips64el | mips64orion | mips64orionel \
|
||||||
| 1750a | dsp16xx | pdp10 | pdp11 \
|
| mips64vr4100 | mips64vr4100el | mips64vr4300 \
|
||||||
| mips16 | mips64 | mipsel | mips64el \
|
| mips64vr4300el | mips64vr5000 | mips64vr5000el \
|
||||||
| mips64orion | mips64orionel | mipstx39 | mipstx39el \
|
| mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \
|
||||||
| mips64vr4300 | mips64vr4300el | mips64vr4100 | mips64vr4100el \
|
| mipsisa32 \
|
||||||
| mips64vr5000 | miprs64vr5000el | mcore | s390 | s390x \
|
| mn10200 | mn10300 \
|
||||||
| sparc | sparclet | sparclite | sparc64 | sparcv9 | sparcv9b \
|
| ns16k | ns32k \
|
||||||
| v850 | c4x \
|
| openrisc \
|
||||||
| thumb | d10v | d30v | fr30 | avr | openrisc | tic80 \
|
| pdp10 | pdp11 | pj | pjl \
|
||||||
| pj | pjl | h8500)
|
| 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
|
basic_machine=$basic_machine-unknown
|
||||||
;;
|
;;
|
||||||
m6811 | m68hc11 | m6812 | m68hc12)
|
m6811 | m68hc11 | m6812 | m68hc12)
|
||||||
@@ -242,7 +260,7 @@ case $basic_machine in
|
|||||||
basic_machine=$basic_machine-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
os=-none
|
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'
|
# We use `pc' rather than `unknown'
|
||||||
@@ -257,31 +275,43 @@ case $basic_machine in
|
|||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
# Recognize the basic CPU types with company name.
|
# Recognize the basic CPU types with company name.
|
||||||
# FIXME: clean up the formatting here.
|
580-* \
|
||||||
vax-* | tahoe-* | i*86-* | i860-* | ia64-* | m32r-* | m68k-* | m68000-* \
|
| a29k-* \
|
||||||
| m88k-* | sparc-* | ns32k-* | fx80-* | arc-* | c[123]* \
|
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||||
| arm-* | armbe-* | armle-* | armv*-* | strongarm-* | xscale-* \
|
| alphapca5[67]-* | arc-* \
|
||||||
| mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* \
|
| arm-* | armbe-* | armle-* | armv*-* \
|
||||||
| power-* | none-* | 580-* | cray2-* | h8300-* | h8500-* | i960-* \
|
| bs2000-* \
|
||||||
| xmp-* | ymp-* \
|
| c[123]* | c30-* | [cjt]90-* | c54x-* \
|
||||||
| x86-* | ppcbe-* | mipsbe-* | mipsle-* | shbe-* | shle-* \
|
| clipper-* | cray2-* | cydra-* \
|
||||||
| hppa-* | hppa1.0-* | hppa1.1-* | hppa2.0-* | hppa2.0w-* \
|
| d10v-* | d30v-* \
|
||||||
| hppa2.0n-* | hppa64-* \
|
| elxsi-* \
|
||||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphapca5[67]-* \
|
| f30[01]-* | f700-* | fr30-* | fx80-* \
|
||||||
| alphaev6[78]-* \
|
| h8300-* | h8500-* \
|
||||||
| we32k-* | cydra-* | ns16k-* | pn-* | np1-* | xps100-* \
|
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||||
| clipper-* | orion-* \
|
| i*86-* | i860-* | i960-* | ia64-* \
|
||||||
| sparclite-* | pdp10-* | pdp11-* | sh-* | powerpc-* | powerpcle-* \
|
| m32r-* \
|
||||||
| sparc64-* | sparcv9-* | sparcv9b-* | sparc86x-* \
|
| m68000-* | m680[01234]0-* | m68360-* | m683?2-* | m68k-* \
|
||||||
| mips16-* | mips64-* | mipsel-* \
|
| m88110-* | m88k-* | mcore-* \
|
||||||
| mips64el-* | mips64orion-* | mips64orionel-* \
|
| mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \
|
||||||
| mips64vr4100-* | mips64vr4100el-* | mips64vr4300-* | mips64vr4300el-* \
|
| mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \
|
||||||
| mipstx39-* | mipstx39el-* | mcore-* \
|
| mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \
|
||||||
| f30[01]-* | f700-* | s390-* | s390x-* | sv1-* | t3e-* \
|
| mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \
|
||||||
| [cjt]90-* \
|
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||||
| m88110-* | m680[01234]0-* | m683?2-* | m68360-* | z8k-* | d10v-* \
|
| orion-* \
|
||||||
| thumb-* | v850-* | d30v-* | tic30-* | tic80-* | c30-* | fr30-* \
|
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||||
| bs2000-* | tic54x-* | c54x-* | x86_64-* | pj-* | pjl-*)
|
| 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
|
# Recognize the various machine names and aliases which stand
|
||||||
# for a CPU type and a company and sometimes even an OS.
|
# for a CPU type and a company and sometimes even an OS.
|
||||||
@@ -727,6 +757,16 @@ case $basic_machine in
|
|||||||
ppcle-* | powerpclittle-*)
|
ppcle-* | powerpclittle-*)
|
||||||
basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
|
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)
|
ps2)
|
||||||
basic_machine=i386-ibm
|
basic_machine=i386-ibm
|
||||||
;;
|
;;
|
||||||
@@ -881,6 +921,10 @@ case $basic_machine in
|
|||||||
basic_machine=hppa1.1-winbond
|
basic_machine=hppa1.1-winbond
|
||||||
os=-proelf
|
os=-proelf
|
||||||
;;
|
;;
|
||||||
|
windows32)
|
||||||
|
basic_machine=i386-pc
|
||||||
|
os=-windows32-msvcrt
|
||||||
|
;;
|
||||||
xmp)
|
xmp)
|
||||||
basic_machine=xmp-cray
|
basic_machine=xmp-cray
|
||||||
os=-unicos
|
os=-unicos
|
||||||
@@ -934,7 +978,7 @@ case $basic_machine in
|
|||||||
we32k)
|
we32k)
|
||||||
basic_machine=we32k-att
|
basic_machine=we32k-att
|
||||||
;;
|
;;
|
||||||
sh3 | sh4)
|
sh3 | sh4 | sh3eb | sh4eb)
|
||||||
basic_machine=sh-unknown
|
basic_machine=sh-unknown
|
||||||
;;
|
;;
|
||||||
sparc | sparcv9 | sparcv9b)
|
sparc | sparcv9 | sparcv9b)
|
||||||
@@ -1018,11 +1062,13 @@ case $os in
|
|||||||
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
| -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||||
|
| -chorusos* | -chorusrdb* \
|
||||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||||
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
|
| -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
|
||||||
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
|
| -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \
|
||||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
| -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.
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
;;
|
;;
|
||||||
-qnx*)
|
-qnx*)
|
||||||
@@ -1346,6 +1392,9 @@ case $basic_machine in
|
|||||||
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
|
-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
|
||||||
vendor=atari
|
vendor=atari
|
||||||
;;
|
;;
|
||||||
|
-vos*)
|
||||||
|
vendor=stratus
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
|
||||||
;;
|
;;
|
||||||
|
|||||||
11
configure.in
11
configure.in
@@ -477,7 +477,9 @@ AC_CHECK_HEADERS( \
|
|||||||
winsock.h \
|
winsock.h \
|
||||||
time.h \
|
time.h \
|
||||||
io.h \
|
io.h \
|
||||||
pwd.h
|
pwd.h \
|
||||||
|
utime.h \
|
||||||
|
sys/utime.h
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl Check for libz header
|
dnl Check for libz header
|
||||||
@@ -531,7 +533,8 @@ AC_CHECK_FUNCS( socket \
|
|||||||
strlcat \
|
strlcat \
|
||||||
getpwuid \
|
getpwuid \
|
||||||
geteuid \
|
geteuid \
|
||||||
dlopen
|
dlopen \
|
||||||
|
utime
|
||||||
)
|
)
|
||||||
|
|
||||||
dnl removed 'getpass' check on October 26, 2000
|
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.spec \
|
||||||
packages/Linux/RPM/curl-ssl.spec \
|
packages/Linux/RPM/curl-ssl.spec \
|
||||||
packages/Solaris/Makefile \
|
packages/Solaris/Makefile \
|
||||||
perl/Makefile \
|
|
||||||
perl/Curl_easy/Makefile \
|
|
||||||
php/Makefile \
|
|
||||||
php/examples/Makefile \
|
|
||||||
curl-config
|
curl-config
|
||||||
])
|
])
|
||||||
AC_OUTPUT
|
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
|
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.
|
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
|
The License Issue
|
||||||
|
|
||||||
When contributing with code, you agree to put your changes and new code under
|
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
|
GPL (as we don't want the GPL virus to attack users of libcurl) but they must
|
||||||
use "GPL compatible" licenses.
|
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
|
Naming
|
||||||
|
|
||||||
Try using a non-confusing naming scheme for your new functions and variable
|
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
|
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
|
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
|
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
|
Test Cases
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ man_MANS = \
|
|||||||
curl_easy_init.3 \
|
curl_easy_init.3 \
|
||||||
curl_easy_perform.3 \
|
curl_easy_perform.3 \
|
||||||
curl_easy_setopt.3 \
|
curl_easy_setopt.3 \
|
||||||
|
curl_easy_duphandle.3 \
|
||||||
curl_formparse.3 \
|
curl_formparse.3 \
|
||||||
curl_formadd.3 \
|
curl_formadd.3 \
|
||||||
curl_formfree.3 \
|
curl_formfree.3 \
|
||||||
@@ -39,6 +40,7 @@ HTMLPAGES = \
|
|||||||
curl_easy_init.html \
|
curl_easy_init.html \
|
||||||
curl_easy_perform.html \
|
curl_easy_perform.html \
|
||||||
curl_easy_setopt.html \
|
curl_easy_setopt.html \
|
||||||
|
curl_easy_duphandle.html \
|
||||||
curl_formadd.html \
|
curl_formadd.html \
|
||||||
curl_formparse.html \
|
curl_formparse.html \
|
||||||
curl_formfree.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
|
* Make the connect non-blocking so that timeouts work for connect in
|
||||||
multi-threaded programs
|
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
|
* Consider an interface to libcurl that allows applications to easier get to
|
||||||
know what cookies that are sent back in the response headers.
|
know what cookies that are sent back in the response headers.
|
||||||
|
|
||||||
* Make SSL session ids get used if multiple HTTPS documents from the same
|
* HTTP PUT for files passed on stdin *OR* when the --crlf option is
|
||||||
host is requested. http://curl.haxx.se/dev/SSL_session_id.txt
|
used. 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. 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
|
* Introduce another callback interface for upload/download that makes one
|
||||||
less copy of data and thus a faster operation.
|
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!
|
* 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.
|
* Make curl's SSL layer option capable of using other free SSL libraries.
|
||||||
Such as the Mozilla Security Services
|
Such as the Mozilla Security Services
|
||||||
(http://www.mozilla.org/projects/security/pki/nss/) and GNUTLS
|
(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
|
.\" nroff -man curl.1
|
||||||
.\" Written by Daniel Stenberg
|
.\" 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
|
.SH NAME
|
||||||
curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
|
curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
|
||||||
HTTPS syntax.
|
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.
|
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.
|
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>"
|
.IP "--connect-timeout <seconds>"
|
||||||
Maximum time in seconds that you allow the connection to the server to take.
|
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
|
This only limits the connection phase, once curl has connected this option is
|
||||||
@@ -100,15 +106,16 @@ also the
|
|||||||
option.
|
option.
|
||||||
|
|
||||||
If this option is used several times, the last one will be used.
|
If this option is used several times, the last one will be used.
|
||||||
.IP "-c/--continue"
|
.IP "-c/--cookie-jar <file name>"
|
||||||
.B Deprecated. Use '-C -' instead.
|
Specify to which file you want curl to write all cookies after a completed
|
||||||
Continue/Resume a previous file transfer. This instructs curl to
|
operation. Curl writes all cookies previously read from a specified file as
|
||||||
continue appending data on the file where it was previously left,
|
well as all cookies received from remote server(s). If no cookies are known,
|
||||||
possibly because of a broken connection to the server. There must be
|
no file will be written. The file will be written using the Netscape cookie
|
||||||
a named physical file to append to for this to work.
|
file format. If you set the file name to a single dash, "-", the cookies will
|
||||||
Note: Upload resume is depening on a command named SIZE not always
|
be written to stdout. (Option added in curl 7.9)
|
||||||
present in all ftp servers! Upload resume is for FTP only.
|
|
||||||
HTTP resume is only possible with HTTP/1.1 or later servers.
|
If this option is used several times, the last specfied file name will be
|
||||||
|
used.
|
||||||
.IP "-C/--continue-at <offset>"
|
.IP "-C/--continue-at <offset>"
|
||||||
Continue/Resume a previous file transfer at the given offset. The
|
Continue/Resume a previous file transfer at the given offset. The
|
||||||
given offset is the exact number of bytes that will be skipped
|
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
|
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
|
--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 '?'
|
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"
|
.IP "-h/--help"
|
||||||
Usage help.
|
Usage help.
|
||||||
.IP "-H/--header <header>"
|
.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
|
typically used for ftp on unix. If used with http, curl will enable user
|
||||||
authentication. See
|
authentication. See
|
||||||
.BR netrc(4)
|
.BR netrc(4)
|
||||||
|
or
|
||||||
|
.BR ftp(1)
|
||||||
for details on the file format. Curl will not complain if that file
|
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
|
hasn't the right permissions (it should not be world nor group
|
||||||
readable). The environment variable "HOME" is used to find the home
|
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.
|
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.
|
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"
|
.IP "-s/--silent"
|
||||||
Silent mode. Don't show progress meter or error messages. Makes
|
Silent mode. Don't show progress meter or error messages. Makes
|
||||||
Curl mute.
|
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]
|
.\" nroff -man [file]
|
||||||
.\" $Id$
|
.\" $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
|
.SH NAME
|
||||||
curl_easy_setopt - Set curl easy-session options
|
curl_easy_setopt - Set curl easy-session options
|
||||||
.SH SYNOPSIS
|
.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
|
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
|
in the SSL handshake, set 1 to check existence, 2 to ensure that it matches
|
||||||
the provided hostname. (Added in 7.8.1)
|
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
|
.PP
|
||||||
.SH RETURN VALUE
|
.SH RETURN VALUE
|
||||||
0 means the option was set properly, non-zero means an error as
|
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 \
|
EXTRA_DIST = README curlgtk.c sepheaders.c simple.c postit.c postit2.c \
|
||||||
win32sockets.c persistant.c ftpget.c Makefile.example \
|
win32sockets.c persistant.c ftpget.c Makefile.example \
|
||||||
multithread.c getinmemory.c ftpupload.c
|
multithread.c getinmemory.c ftpupload.c httpput.c
|
||||||
|
|
||||||
all:
|
all:
|
||||||
@echo "done"
|
@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. */
|
operation. Set file name to "-" (dash) to make it go to stdout. */
|
||||||
CINIT(COOKIEJAR, OBJECTPOINT, 82),
|
CINIT(COOKIEJAR, OBJECTPOINT, 82),
|
||||||
|
|
||||||
|
/* Specify which SSL ciphers to use */
|
||||||
|
CINIT(SSL_CIPHER_LIST, OBJECTPOINT, 83),
|
||||||
|
|
||||||
CURLOPT_LASTENTRY /* the last unusued */
|
CURLOPT_LASTENTRY /* the last unusued */
|
||||||
} CURLoption;
|
} CURLoption;
|
||||||
|
|
||||||
@@ -545,8 +548,8 @@ CURLcode curl_global_init(long flags);
|
|||||||
void curl_global_cleanup(void);
|
void curl_global_cleanup(void);
|
||||||
|
|
||||||
/* This is the version number */
|
/* This is the version number */
|
||||||
#define LIBCURL_VERSION "7.8.2-pre1"
|
#define LIBCURL_VERSION "7.9"
|
||||||
#define LIBCURL_VERSION_NUM 0x070802
|
#define LIBCURL_VERSION_NUM 0x070900
|
||||||
|
|
||||||
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
||||||
struct curl_slist {
|
struct curl_slist {
|
||||||
|
|||||||
@@ -46,6 +46,21 @@ void curl_easy_cleanup(CURL *curl);
|
|||||||
*/
|
*/
|
||||||
CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...);
|
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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#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!
|
The interface is not set yet, bring your suggestions!
|
||||||
|
|
||||||
Feel free to grab the source files in here and help out!
|
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 <curl/curl.h> /* libcurl header */
|
||||||
#include "CurlGlue.h" /* the JNI-generated glue header file */
|
#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"
|
CFLAGS = /I "../include" /nologo /W3 /GX /D "WIN32" /D "VC6" /D "_MBCS" /D "_LIB" /YX /FD /c /D "MSDOS"
|
||||||
LFLAGS = /nologo
|
LFLAGS = /nologo
|
||||||
LINKLIBS = wsock32.lib
|
LINKLIBS = ws2_32.lib
|
||||||
LINKSLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
LINKSLIBS = libeay32.lib ssleay32.lib RSAglue.lib
|
||||||
|
|
||||||
RELEASE_OBJS= \
|
RELEASE_OBJS= \
|
||||||
|
|||||||
@@ -260,3 +260,11 @@ void *suck(int *lenptr) {
|
|||||||
}
|
}
|
||||||
#endif
|
#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;
|
FILE *out;
|
||||||
bool use_stdout=FALSE;
|
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
|
/* If there are no known cookies, we don't write or even create any
|
||||||
destination file */
|
destination file */
|
||||||
return 0;
|
return 0;
|
||||||
@@ -676,3 +676,11 @@ int main(int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#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
|
char *nthdef = NULL; /* This is not part of the protocol, but required
|
||||||
by RFC 2229 */
|
by RFC 2229 */
|
||||||
CURLcode result=CURLE_OK;
|
CURLcode result=CURLE_OK;
|
||||||
struct UrlData *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
|
|
||||||
char *path = conn->path;
|
char *path = conn->path;
|
||||||
long *bytecount = &conn->bytecount;
|
long *bytecount = &conn->bytecount;
|
||||||
@@ -232,3 +232,11 @@ CURLcode Curl_dict(struct connectdata *conn)
|
|||||||
|
|
||||||
return CURLE_OK;
|
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;
|
return TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#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;
|
WORD wVersionRequested;
|
||||||
WSADATA wsaData;
|
WSADATA wsaData;
|
||||||
int err;
|
int err;
|
||||||
wVersionRequested = MAKEWORD(1, 1);
|
wVersionRequested = MAKEWORD(2, 0);
|
||||||
|
|
||||||
err = WSAStartup(wVersionRequested, &wsaData);
|
err = WSAStartup(wVersionRequested, &wsaData);
|
||||||
|
|
||||||
@@ -103,14 +103,14 @@ static CURLcode win32_init(void)
|
|||||||
/* winsock.dll. */
|
/* winsock.dll. */
|
||||||
return CURLE_FAILED_INIT;
|
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 */
|
/* Note that if the DLL supports versions greater */
|
||||||
/* than 1.1 in addition to 1.1, it will still return */
|
/* than 2.0 in addition to 2.0, it will still return */
|
||||||
/* 1.1 in wVersion since that is the version we */
|
/* 2.0 in wVersion since that is the version we */
|
||||||
/* requested. */
|
/* requested. */
|
||||||
|
|
||||||
if ( LOBYTE( wsaData.wVersion ) != 1 ||
|
if ( LOBYTE( wsaData.wVersion ) != 2 ||
|
||||||
HIBYTE( wsaData.wVersion ) != 1 ) {
|
HIBYTE( wsaData.wVersion ) != 0 ) {
|
||||||
/* Tell the user that we couldn't find a useable */
|
/* Tell the user that we couldn't find a useable */
|
||||||
|
|
||||||
/* winsock.dll. */
|
/* winsock.dll. */
|
||||||
@@ -175,7 +175,7 @@ void curl_global_cleanup(void)
|
|||||||
CURL *curl_easy_init(void)
|
CURL *curl_easy_init(void)
|
||||||
{
|
{
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
struct UrlData *data;
|
struct SessionHandle *data;
|
||||||
|
|
||||||
/* Make sure we inited the global SSL stuff */
|
/* Make sure we inited the global SSL stuff */
|
||||||
if (!initialized)
|
if (!initialized)
|
||||||
@@ -186,9 +186,6 @@ CURL *curl_easy_init(void)
|
|||||||
if(res != CURLE_OK)
|
if(res != CURLE_OK)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* SAC */
|
|
||||||
data->device = NULL;
|
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -199,7 +196,7 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
func_T param_func = (func_T)0;
|
func_T param_func = (func_T)0;
|
||||||
long param_long = 0;
|
long param_long = 0;
|
||||||
void *param_obj = NULL;
|
void *param_obj = NULL;
|
||||||
struct UrlData *data = curl;
|
struct SessionHandle *data = curl;
|
||||||
|
|
||||||
va_start(arg, tag);
|
va_start(arg, tag);
|
||||||
|
|
||||||
@@ -231,14 +228,14 @@ CURLcode curl_easy_setopt(CURL *curl, CURLoption tag, ...)
|
|||||||
|
|
||||||
CURLcode curl_easy_perform(CURL *curl)
|
CURLcode curl_easy_perform(CURL *curl)
|
||||||
{
|
{
|
||||||
struct UrlData *data = (struct UrlData *)curl;
|
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||||
|
|
||||||
return Curl_perform(data);
|
return Curl_perform(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void curl_easy_cleanup(CURL *curl)
|
void curl_easy_cleanup(CURL *curl)
|
||||||
{
|
{
|
||||||
struct UrlData *data = (struct UrlData *)curl;
|
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||||
Curl_close(data);
|
Curl_close(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -246,10 +243,77 @@ CURLcode curl_easy_getinfo(CURL *curl, CURLINFO info, ...)
|
|||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
void *paramp;
|
void *paramp;
|
||||||
struct UrlData *data = (struct UrlData *)curl;
|
struct SessionHandle *data = (struct SessionHandle *)curl;
|
||||||
|
|
||||||
va_start(arg, info);
|
va_start(arg, info);
|
||||||
paramp = va_arg(arg, void *);
|
paramp = va_arg(arg, void *);
|
||||||
|
|
||||||
return Curl_getinfo(data, info, paramp);
|
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;
|
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;
|
struct stat statbuf;
|
||||||
ssize_t expected_size=-1;
|
ssize_t expected_size=-1;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
char *buf = data->buffer;
|
char *buf = data->state.buffer;
|
||||||
int bytecount = 0;
|
int bytecount = 0;
|
||||||
struct timeval start = Curl_tvnow();
|
struct timeval start = Curl_tvnow();
|
||||||
struct timeval now = start;
|
struct timeval now = start;
|
||||||
@@ -196,3 +196,11 @@ CURLcode Curl_file(struct connectdata *conn)
|
|||||||
|
|
||||||
return res;
|
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
|
#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: */
|
/* easy-to-use macro: */
|
||||||
#define ftpsendf Curl_ftpsendf
|
#define ftpsendf Curl_ftpsendf
|
||||||
|
|
||||||
static CURLcode AllowServerConnect(struct UrlData *data,
|
static CURLcode AllowServerConnect(struct SessionHandle *data,
|
||||||
struct connectdata *conn,
|
struct connectdata *conn,
|
||||||
int sock)
|
int sock)
|
||||||
{
|
{
|
||||||
@@ -178,7 +178,7 @@ int Curl_GetFTPResponse(int sockfd,
|
|||||||
struct timeval interval;
|
struct timeval interval;
|
||||||
fd_set rkeepfd;
|
fd_set rkeepfd;
|
||||||
fd_set readfd;
|
fd_set readfd;
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
char *line_start;
|
char *line_start;
|
||||||
int code=0; /* default "error code" to return */
|
int code=0; /* default "error code" to return */
|
||||||
|
|
||||||
@@ -190,9 +190,9 @@ int Curl_GetFTPResponse(int sockfd,
|
|||||||
if (ftpcode)
|
if (ftpcode)
|
||||||
*ftpcode = 0; /* 0 for errors */
|
*ftpcode = 0; /* 0 for errors */
|
||||||
|
|
||||||
if(data->timeout) {
|
if(data->set.timeout) {
|
||||||
/* if timeout is requested, find out how much remaining time we have */
|
/* 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 */
|
(Curl_tvlong(Curl_tvnow()) - Curl_tvlong(conn->now)); /* spent time */
|
||||||
if(timeout <=0 ) {
|
if(timeout <=0 ) {
|
||||||
failf(data, "Transfer aborted due to timeout");
|
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 */
|
the line isn't really terminated until the LF comes */
|
||||||
|
|
||||||
/* output debug output if that is requested */
|
/* output debug output if that is requested */
|
||||||
if(data->bits.verbose) {
|
if(data->set.verbose) {
|
||||||
fputs("< ", data->err);
|
fputs("< ", data->set.err);
|
||||||
fwrite(line_start, perline, 1, data->err);
|
fwrite(line_start, perline, 1, data->set.err);
|
||||||
/* no need to output LF here, it is part of the data */
|
/* 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 */
|
/* this is FTP and no proxy */
|
||||||
int nread;
|
int nread;
|
||||||
struct UrlData *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
char *buf = data->buffer; /* this is our buffer */
|
char *buf = data->state.buffer; /* this is our buffer */
|
||||||
struct FTP *ftp;
|
struct FTP *ftp;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
int ftpcode;
|
int ftpcode;
|
||||||
@@ -360,11 +360,11 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
|||||||
/* get some initial data into the ftp struct */
|
/* get some initial data into the ftp struct */
|
||||||
ftp->bytecountp = &conn->bytecount;
|
ftp->bytecountp = &conn->bytecount;
|
||||||
|
|
||||||
/* duplicate to keep them even when the data struct changes */
|
/* no need to duplicate them, the data struct won't change */
|
||||||
ftp->user = strdup(data->user);
|
ftp->user = data->state.user;
|
||||||
ftp->passwd = strdup(data->passwd);
|
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 */
|
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
||||||
conn->hostname, conn->remote_port);
|
conn->hostname, conn->remote_port);
|
||||||
@@ -393,14 +393,14 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
|||||||
|
|
||||||
#ifdef KRB4
|
#ifdef KRB4
|
||||||
/* if not anonymous login, try a secure login */
|
/* if not anonymous login, try a secure login */
|
||||||
if(data->bits.krb4) {
|
if(data->set.krb4) {
|
||||||
|
|
||||||
/* request data protection level (default is 'clear') */
|
/* request data protection level (default is 'clear') */
|
||||||
Curl_sec_request_prot(conn, "private");
|
Curl_sec_request_prot(conn, "private");
|
||||||
|
|
||||||
/* We set private first as default, in case the line below fails to
|
/* We set private first as default, in case the line below fails to
|
||||||
set a valid level */
|
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)
|
if(Curl_sec_login(conn) != 0)
|
||||||
infof(data, "Logging in with password in cleartext!\n");
|
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
|
/* we may need to issue a KAUTH here to have access to the files
|
||||||
* do it if user supplied a password
|
* 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);
|
Curl_krb_kauth(conn);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@@ -530,27 +530,27 @@ CURLcode Curl_ftp_connect(struct connectdata *conn)
|
|||||||
/* argument is already checked for validity */
|
/* argument is already checked for validity */
|
||||||
CURLcode Curl_ftp_done(struct connectdata *conn)
|
CURLcode Curl_ftp_done(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct FTP *ftp = conn->proto.ftp;
|
struct FTP *ftp = conn->proto.ftp;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
char *buf = data->buffer; /* this is our buffer */
|
char *buf = data->state.buffer; /* this is our buffer */
|
||||||
int ftpcode;
|
int ftpcode;
|
||||||
|
|
||||||
if(data->bits.upload) {
|
if(data->set.upload) {
|
||||||
if((-1 != data->infilesize) && (data->infilesize != *ftp->bytecountp)) {
|
if((-1 != data->set.infilesize) && (data->set.infilesize != *ftp->bytecountp)) {
|
||||||
failf(data, "Wrote only partial file (%d out of %d bytes)",
|
failf(data, "Wrote only partial file (%d out of %d bytes)",
|
||||||
*ftp->bytecountp, data->infilesize);
|
*ftp->bytecountp, data->set.infilesize);
|
||||||
return CURLE_PARTIAL_FILE;
|
return CURLE_PARTIAL_FILE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if((-1 != conn->size) && (conn->size != *ftp->bytecountp) &&
|
if((-1 != conn->size) && (conn->size != *ftp->bytecountp) &&
|
||||||
(conn->maxdownload != *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;
|
return CURLE_PARTIAL_FILE;
|
||||||
}
|
}
|
||||||
else if(!conn->bits.resume_done &&
|
else if(!conn->bits.resume_done &&
|
||||||
!data->bits.no_body &&
|
!data->set.no_body &&
|
||||||
(0 == *ftp->bytecountp)) {
|
(0 == *ftp->bytecountp)) {
|
||||||
failf(data, "No data was received!");
|
failf(data, "No data was received!");
|
||||||
return CURLE_FTP_COULDNT_RETR_FILE;
|
return CURLE_FTP_COULDNT_RETR_FILE;
|
||||||
@@ -564,7 +564,7 @@ CURLcode Curl_ftp_done(struct connectdata *conn)
|
|||||||
sclose(conn->secondarysocket);
|
sclose(conn->secondarysocket);
|
||||||
conn->secondarysocket = -1;
|
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
|
/* now let's see what the server says about the transfer we
|
||||||
just performed: */
|
just performed: */
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
|
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 */
|
conn->bits.resume_done = FALSE; /* clean this for next connection */
|
||||||
|
|
||||||
/* Send any post-transfer QUOTE strings? */
|
/* Send any post-transfer QUOTE strings? */
|
||||||
if(data->postquote) {
|
if(data->set.postquote) {
|
||||||
CURLcode result = _ftp_sendquote(conn, data->postquote);
|
CURLcode result = _ftp_sendquote(conn, data->set.postquote);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -603,7 +603,7 @@ CURLcode _ftp_sendquote(struct connectdata *conn, struct curl_slist *quote)
|
|||||||
ftpsendf(conn->firstsocket, conn, "%s", item->data);
|
ftpsendf(conn->firstsocket, conn, "%s", item->data);
|
||||||
|
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||||
conn->data->buffer, conn, &ftpcode);
|
conn->data->state.buffer, conn, &ftpcode);
|
||||||
if (nread < 0)
|
if (nread < 0)
|
||||||
return CURLE_OPERATION_TIMEOUTED;
|
return CURLE_OPERATION_TIMEOUTED;
|
||||||
|
|
||||||
@@ -627,12 +627,12 @@ CURLcode _ftp_cwd(struct connectdata *conn, char *path)
|
|||||||
|
|
||||||
ftpsendf(conn->firstsocket, conn, "CWD %s", path);
|
ftpsendf(conn->firstsocket, conn, "CWD %s", path);
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||||
conn->data->buffer, conn, &ftpcode);
|
conn->data->state.buffer, conn, &ftpcode);
|
||||||
if (nread < 0)
|
if (nread < 0)
|
||||||
return CURLE_OPERATION_TIMEOUTED;
|
return CURLE_OPERATION_TIMEOUTED;
|
||||||
|
|
||||||
if (ftpcode != 250) {
|
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;
|
return CURLE_FTP_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -645,7 +645,7 @@ CURLcode _ftp_getfiletime(struct connectdata *conn, char *file)
|
|||||||
CURLcode result=CURLE_OK;
|
CURLcode result=CURLE_OK;
|
||||||
int ftpcode; /* for ftp status */
|
int ftpcode; /* for ftp status */
|
||||||
ssize_t nread;
|
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
|
/* 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 */
|
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",
|
sprintf(buf, "%04d%02d%02d %02d:%02d:%02d",
|
||||||
year, month, day, hour, minute, second);
|
year, month, day, hour, minute, second);
|
||||||
/* now, convert this into a time() value: */
|
/* now, convert this into a time() value: */
|
||||||
conn->data->progress.filetime = curl_getdate(buf, &secs);
|
conn->data->info.filetime = curl_getdate(buf, &secs);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
infof(conn->data, "unsupported MDTM reply format\n");
|
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,
|
static CURLcode _ftp_transfertype(struct connectdata *conn,
|
||||||
bool ascii)
|
bool ascii)
|
||||||
{
|
{
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
int ftpcode;
|
int ftpcode;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
char *buf=data->buffer;
|
char *buf=data->state.buffer;
|
||||||
|
|
||||||
ftpsendf(conn->firstsocket, conn, "TYPE %s", ascii?"A":"I");
|
ftpsendf(conn->firstsocket, conn, "TYPE %s", ascii?"A":"I");
|
||||||
|
|
||||||
@@ -702,10 +702,10 @@ static
|
|||||||
CURLcode _ftp_getsize(struct connectdata *conn, char *file,
|
CURLcode _ftp_getsize(struct connectdata *conn, char *file,
|
||||||
ssize_t *size)
|
ssize_t *size)
|
||||||
{
|
{
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
int ftpcode;
|
int ftpcode;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
char *buf=data->buffer;
|
char *buf=data->state.buffer;
|
||||||
|
|
||||||
ftpsendf(conn->firstsocket, conn, "SIZE %s", file);
|
ftpsendf(conn->firstsocket, conn, "SIZE %s", file);
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
|
nread = Curl_GetFTPResponse(conn->firstsocket, buf, conn, &ftpcode);
|
||||||
@@ -729,8 +729,8 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
/* this is FTP and no proxy */
|
/* this is FTP and no proxy */
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
struct UrlData *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
char *buf = data->buffer; /* this is our buffer */
|
char *buf = data->state.buffer; /* this is our buffer */
|
||||||
/* for the ftp PORT mode */
|
/* for the ftp PORT mode */
|
||||||
int portsock=-1;
|
int portsock=-1;
|
||||||
#if defined (HAVE_INET_NTOA_R)
|
#if defined (HAVE_INET_NTOA_R)
|
||||||
@@ -750,8 +750,8 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
int ftpcode; /* for ftp status */
|
int ftpcode; /* for ftp status */
|
||||||
|
|
||||||
/* Send any QUOTE strings? */
|
/* Send any QUOTE strings? */
|
||||||
if(data->quote) {
|
if(data->set.quote) {
|
||||||
if ((result = _ftp_sendquote(conn, data->quote)) != CURLE_OK)
|
if ((result = _ftp_sendquote(conn, data->set.quote)) != CURLE_OK)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -770,7 +770,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Requested time of file? */
|
/* Requested time of file? */
|
||||||
if(data->bits.get_filetime && ftp->file) {
|
if(data->set.get_filetime && ftp->file) {
|
||||||
result = _ftp_getfiletime(conn, ftp->file);
|
result = _ftp_getfiletime(conn, ftp->file);
|
||||||
if(result)
|
if(result)
|
||||||
return 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.
|
/* 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! */
|
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
|
/* 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
|
may not support it! It is however the only way we have to get a file's
|
||||||
size! */
|
size! */
|
||||||
@@ -786,7 +786,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
|
|
||||||
/* Some servers return different sizes for different modes, and thus we
|
/* Some servers return different sizes for different modes, and thus we
|
||||||
must set the proper type before we check the size */
|
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)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -804,13 +804,13 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
well, we "emulate" a HTTP-style header in our output. */
|
well, we "emulate" a HTTP-style header in our output. */
|
||||||
|
|
||||||
#ifdef HAVE_STRFTIME
|
#ifdef HAVE_STRFTIME
|
||||||
if(data->bits.get_filetime && data->progress.filetime) {
|
if(data->set.get_filetime && data->info.filetime) {
|
||||||
struct tm *tm;
|
struct tm *tm;
|
||||||
#ifdef HAVE_LOCALTIME_R
|
#ifdef HAVE_LOCALTIME_R
|
||||||
struct tm buffer;
|
struct tm buffer;
|
||||||
tm = (struct tm *)localtime_r(&data->progress.filetime, &buffer);
|
tm = (struct tm *)localtime_r(&data->info.filetime, &buffer);
|
||||||
#else
|
#else
|
||||||
tm = localtime(&data->progress.filetime);
|
tm = localtime(&data->info.filetime);
|
||||||
#endif
|
#endif
|
||||||
/* format: "Tue, 15 Nov 1994 12:45:26 GMT" */
|
/* 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",
|
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 */
|
/* We have chosen to use the PORT command */
|
||||||
if(data->bits.ftp_use_port) {
|
if(data->set.ftp_use_port) {
|
||||||
#ifdef ENABLE_IPV6
|
#ifdef ENABLE_IPV6
|
||||||
struct addrinfo hints, *res, *ai;
|
struct addrinfo hints, *res, *ai;
|
||||||
struct sockaddr_storage ss;
|
struct sockaddr_storage ss;
|
||||||
@@ -933,12 +933,14 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
if (getnameinfo((struct sockaddr *)&ss, sslen,
|
if (getnameinfo((struct sockaddr *)&ss, sslen,
|
||||||
portmsgbuf, sizeof(portmsgbuf), tmp, sizeof(tmp), niflags))
|
portmsgbuf, sizeof(portmsgbuf), tmp, sizeof(tmp), niflags))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* do not transmit IPv6 scope identifier to the wire */
|
/* do not transmit IPv6 scope identifier to the wire */
|
||||||
if (sa->sa_family == AF_INET6) {
|
if (sa->sa_family == AF_INET6) {
|
||||||
char *q = strchr(portmsgbuf, '%');
|
char *q = strchr(portmsgbuf, '%');
|
||||||
if (q)
|
if (q)
|
||||||
*q = '\0';
|
*q = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
ftpsendf(conn->firstsocket, conn, "%s |%d|%s|%s|", *modep, eprtaf,
|
ftpsendf(conn->firstsocket, conn, "%s |%d|%s|%s|", *modep, eprtaf,
|
||||||
portmsgbuf, tmp);
|
portmsgbuf, tmp);
|
||||||
} else if (strcmp(*modep, "LPRT") == 0 ||
|
} else if (strcmp(*modep, "LPRT") == 0 ||
|
||||||
@@ -957,26 +959,33 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < alen; i++) {
|
for (i = 0; i < alen; i++) {
|
||||||
if (portmsgbuf[0])
|
if (portmsgbuf[0])
|
||||||
snprintf(tmp, sizeof(tmp), ",%u", ap[i]);
|
snprintf(tmp, sizeof(tmp), ",%u", ap[i]);
|
||||||
else
|
else
|
||||||
snprintf(tmp, sizeof(tmp), "%u", ap[i]);
|
snprintf(tmp, sizeof(tmp), "%u", ap[i]);
|
||||||
|
|
||||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
|
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(*modep, "LPRT") == 0) {
|
if (strcmp(*modep, "LPRT") == 0) {
|
||||||
snprintf(tmp, sizeof(tmp), ",%d", plen);
|
snprintf(tmp, sizeof(tmp), ",%d", plen);
|
||||||
|
|
||||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf))
|
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf))
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < plen; i++) {
|
for (i = 0; i < plen; i++) {
|
||||||
snprintf(tmp, sizeof(tmp), ",%u", pp[i]);
|
snprintf(tmp, sizeof(tmp), ",%u", pp[i]);
|
||||||
|
|
||||||
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
|
if (strlcat(portmsgbuf, tmp, sizeof(portmsgbuf)) >= sizeof(portmsgbuf)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ftpsendf(conn->firstsocket, conn, "%s %s", *modep, portmsgbuf);
|
ftpsendf(conn->firstsocket, conn, "%s %s", *modep, portmsgbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -996,6 +1005,10 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
freeaddrinfo(res);
|
freeaddrinfo(res);
|
||||||
return CURLE_FTP_PORT_FAILED;
|
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
|
#else
|
||||||
struct sockaddr_in sa;
|
struct sockaddr_in sa;
|
||||||
@@ -1005,15 +1018,15 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
unsigned short porttouse;
|
unsigned short porttouse;
|
||||||
char myhost[256] = "";
|
char myhost[256] = "";
|
||||||
|
|
||||||
if(data->ftpport) {
|
if(data->set.ftpport) {
|
||||||
if(Curl_if2ip(data->ftpport, myhost, sizeof(myhost))) {
|
if(Curl_if2ip(data->set.ftpport, myhost, sizeof(myhost))) {
|
||||||
h = Curl_gethost(data, myhost, &hostdataptr);
|
h = Curl_gethost(data, myhost, &hostdataptr);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(strlen(data->ftpport)>1)
|
if(strlen(data->set.ftpport)>1)
|
||||||
h = Curl_gethost(data, data->ftpport, &hostdataptr);
|
h = Curl_gethost(data, data->set.ftpport, &hostdataptr);
|
||||||
if(h)
|
if(h)
|
||||||
strcpy(myhost, data->ftpport); /* buffer overflow risk */
|
strcpy(myhost, data->set.ftpport); /* buffer overflow risk */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(! *myhost) {
|
if(! *myhost) {
|
||||||
@@ -1165,6 +1178,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
break;
|
break;
|
||||||
str++;
|
str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!*str) {
|
if(!*str) {
|
||||||
failf(data, "Couldn't interpret this 227-reply: %s", buf);
|
failf(data, "Couldn't interpret this 227-reply: %s", buf);
|
||||||
return CURLE_FTP_WEIRD_227_FORMAT;
|
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]);
|
sprintf(newhost, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]);
|
||||||
newport = (port[0]<<8) + port[1];
|
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
|
* 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
|
* 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)
|
if (conn->secondarysocket < 0)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if(data->bits.verbose) {
|
if(data->set.verbose) {
|
||||||
char hbuf[NI_MAXHOST];
|
char hbuf[NI_MAXHOST];
|
||||||
char nbuf[NI_MAXHOST];
|
char nbuf[NI_MAXHOST];
|
||||||
char sbuf[NI_MAXSERV];
|
char sbuf[NI_MAXSERV];
|
||||||
@@ -1228,6 +1242,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
snprintf(nbuf, sizeof(nbuf), "?");
|
snprintf(nbuf, sizeof(nbuf), "?");
|
||||||
snprintf(sbuf, sizeof(sbuf), "?");
|
snprintf(sbuf, sizeof(sbuf), "?");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
|
if (getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf),
|
||||||
NULL, 0, 0)) {
|
NULL, 0, 0)) {
|
||||||
infof(data, "Connecting to %s port %s\n", nbuf, sbuf);
|
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);
|
serv_addr.sin_port = htons(connectport);
|
||||||
|
|
||||||
if(data->bits.verbose) {
|
if(data->set.verbose) {
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
struct hostent * answer;
|
struct hostent * answer;
|
||||||
|
|
||||||
@@ -1346,7 +1361,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
#endif /*ENABLE_IPV6*/
|
#endif /*ENABLE_IPV6*/
|
||||||
|
|
||||||
if (data->bits.tunnel_thru_httpproxy) {
|
if (data->set.tunnel_thru_httpproxy) {
|
||||||
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
/* We want "seamless" FTP operations through HTTP proxy tunnel */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->secondarysocket,
|
result = Curl_ConnectHTTPProxyTunnel(conn, conn->secondarysocket,
|
||||||
newhost, newport);
|
newhost, newport);
|
||||||
@@ -1360,10 +1375,10 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
/* we have the (new) data connection ready */
|
/* we have the (new) data connection ready */
|
||||||
infof(data, "Connected the data stream!\n");
|
infof(data, "Connected the data stream!\n");
|
||||||
|
|
||||||
if(data->bits.upload) {
|
if(data->set.upload) {
|
||||||
|
|
||||||
/* Set type to binary (unless specified ASCII) */
|
/* 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)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -1395,7 +1410,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
/* do we still game? */
|
/* do we still game? */
|
||||||
int passed=0;
|
int passed=0;
|
||||||
/* enable append instead */
|
/* 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
|
/* 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
|
input. If we knew it was a proper file we could've just
|
||||||
@@ -1408,7 +1423,8 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
readthisamountnow = BUFSIZE;
|
readthisamountnow = BUFSIZE;
|
||||||
|
|
||||||
actuallyread =
|
actuallyread =
|
||||||
data->fread(data->buffer, 1, readthisamountnow, data->in);
|
data->set.fread(data->state.buffer, 1, readthisamountnow,
|
||||||
|
data->set.in);
|
||||||
|
|
||||||
passed += actuallyread;
|
passed += actuallyread;
|
||||||
if(actuallyread != readthisamountnow) {
|
if(actuallyread != readthisamountnow) {
|
||||||
@@ -1419,10 +1435,10 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
while(passed != conn->resume_from);
|
while(passed != conn->resume_from);
|
||||||
|
|
||||||
/* now, decrease the size of the read */
|
/* now, decrease the size of the read */
|
||||||
if(data->infilesize>0) {
|
if(data->set.infilesize>0) {
|
||||||
data->infilesize -= conn->resume_from;
|
data->set.infilesize -= conn->resume_from;
|
||||||
|
|
||||||
if(data->infilesize <= 0) {
|
if(data->set.infilesize <= 0) {
|
||||||
infof(data, "File already completely uploaded\n");
|
infof(data, "File already completely uploaded\n");
|
||||||
|
|
||||||
/* no data to transfer */
|
/* no data to transfer */
|
||||||
@@ -1440,8 +1456,8 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Send everything on data->in to the socket */
|
/* Send everything on data->set.in to the socket */
|
||||||
if(data->bits.ftp_append)
|
if(data->set.ftp_append)
|
||||||
/* we append onto the file instead of rewriting it */
|
/* we append onto the file instead of rewriting it */
|
||||||
ftpsendf(conn->firstsocket, conn, "APPE %s", ftp->file);
|
ftpsendf(conn->firstsocket, conn, "APPE %s", ftp->file);
|
||||||
else
|
else
|
||||||
@@ -1457,7 +1473,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
return CURLE_FTP_COULDNT_STOR_FILE;
|
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. */
|
/* PORT means we are now awaiting the server to connect to us. */
|
||||||
result = AllowServerConnect(data, conn, portsock);
|
result = AllowServerConnect(data, conn, portsock);
|
||||||
if( result )
|
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
|
/* When we know we're uploading a specified file, we can get the file
|
||||||
size prior to the actual upload. */
|
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 */
|
result = Curl_Transfer(conn, -1, -1, FALSE, NULL, /* no download */
|
||||||
conn->secondarysocket, bytecountp);
|
conn->secondarysocket, bytecountp);
|
||||||
@@ -1520,7 +1536,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
from, to, totalsize);
|
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
|
/* The specified path ends with a slash, and therefore we think this
|
||||||
is a directory that is requested, use LIST. But before that we
|
is a directory that is requested, use LIST. But before that we
|
||||||
need to set ASCII transfer mode. */
|
need to set ASCII transfer mode. */
|
||||||
@@ -1536,12 +1552,12 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
standard in any way */
|
standard in any way */
|
||||||
|
|
||||||
ftpsendf(conn->firstsocket, conn, "%s",
|
ftpsendf(conn->firstsocket, conn, "%s",
|
||||||
data->customrequest?data->customrequest:
|
data->set.customrequest?data->set.customrequest:
|
||||||
(data->bits.ftp_list_only?"NLST":"LIST"));
|
(data->set.ftp_list_only?"NLST":"LIST"));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Set type to binary (unless specified ASCII) */
|
/* 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)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
@@ -1557,7 +1573,7 @@ CURLcode _ftp(struct connectdata *conn)
|
|||||||
result = _ftp_getsize(conn, ftp->file, &foundsize);
|
result = _ftp_getsize(conn, ftp->file, &foundsize);
|
||||||
|
|
||||||
if(CURLE_OK != result) {
|
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
|
/* 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
|
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
|
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 */
|
int size=-1; /* default unknown size */
|
||||||
|
|
||||||
if(!dirlist &&
|
if(!dirlist &&
|
||||||
!data->bits.ftp_ascii &&
|
!data->set.ftp_ascii &&
|
||||||
(-1 == downloadsize)) {
|
(-1 == downloadsize)) {
|
||||||
/*
|
/*
|
||||||
* It seems directory listings either don't show the size or very
|
* 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)
|
else if(downloadsize > -1)
|
||||||
size = downloadsize;
|
size = downloadsize;
|
||||||
|
|
||||||
if(data->bits.ftp_use_port) {
|
if(data->set.ftp_use_port) {
|
||||||
result = AllowServerConnect(data, conn, portsock);
|
result = AllowServerConnect(data, conn, portsock);
|
||||||
if( result )
|
if( result )
|
||||||
return result;
|
return result;
|
||||||
@@ -1717,7 +1733,7 @@ CURLcode Curl_ftp(struct connectdata *conn)
|
|||||||
{
|
{
|
||||||
CURLcode retcode;
|
CURLcode retcode;
|
||||||
|
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct FTP *ftp;
|
struct FTP *ftp;
|
||||||
int dirlength=0; /* 0 forces strlen() */
|
int dirlength=0; /* 0 forces strlen() */
|
||||||
|
|
||||||
@@ -1793,8 +1809,8 @@ size_t Curl_ftpsendf(int fd, struct connectdata *conn,
|
|||||||
vsnprintf(s, 250, fmt, ap);
|
vsnprintf(s, 250, fmt, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
if(conn->data->bits.verbose)
|
if(conn->data->set.verbose)
|
||||||
fprintf(conn->data->err, "> %s\n", s);
|
fprintf(conn->data->set.err, "> %s\n", s);
|
||||||
|
|
||||||
strcat(s, "\r\n"); /* append a trailing CRLF */
|
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! */
|
/* The FTP session may or may not have been allocated/setup at this point! */
|
||||||
if(ftp) {
|
if(ftp) {
|
||||||
if(ftp->user)
|
|
||||||
free(ftp->user);
|
|
||||||
if(ftp->passwd)
|
|
||||||
free(ftp->passwd);
|
|
||||||
if(ftp->entrypath)
|
if(ftp->entrypath)
|
||||||
free(ftp->entrypath);
|
free(ftp->entrypath);
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
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 */
|
/* NOTREACHED */
|
||||||
}
|
}
|
||||||
#endif /* defined (TEST) */
|
#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);
|
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
|
* This is supposed to be called in the beginning of a permform() session
|
||||||
* and should reset all session-info variables
|
* 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 Progress *pro = &data->progress;
|
||||||
|
struct PureInfo *info =&data->info;
|
||||||
|
|
||||||
pro->t_nslookup = 0;
|
pro->t_nslookup = 0;
|
||||||
pro->t_connect = 0;
|
pro->t_connect = 0;
|
||||||
pro->t_pretransfer = 0;
|
pro->t_pretransfer = 0;
|
||||||
|
|
||||||
pro->httpcode = 0;
|
info->httpcode = 0;
|
||||||
pro->httpversion=0;
|
info->httpversion=0;
|
||||||
pro->filetime=0;
|
info->filetime=0;
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
|
||||||
{
|
{
|
||||||
va_list arg;
|
va_list arg;
|
||||||
long *param_longp;
|
long *param_longp;
|
||||||
@@ -80,19 +81,19 @@ CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
|||||||
|
|
||||||
switch(info) {
|
switch(info) {
|
||||||
case CURLINFO_EFFECTIVE_URL:
|
case CURLINFO_EFFECTIVE_URL:
|
||||||
*param_charp = data->url?data->url:(char *)"";
|
*param_charp = data->change.url?data->change.url:(char *)"";
|
||||||
break;
|
break;
|
||||||
case CURLINFO_HTTP_CODE:
|
case CURLINFO_HTTP_CODE:
|
||||||
*param_longp = data->progress.httpcode;
|
*param_longp = data->info.httpcode;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_FILETIME:
|
case CURLINFO_FILETIME:
|
||||||
*param_longp = data->progress.filetime;
|
*param_longp = data->info.filetime;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_HEADER_SIZE:
|
case CURLINFO_HEADER_SIZE:
|
||||||
*param_longp = data->header_size;
|
*param_longp = data->info.header_size;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_REQUEST_SIZE:
|
case CURLINFO_REQUEST_SIZE:
|
||||||
*param_longp = data->request_size;
|
*param_longp = data->info.request_size;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_TOTAL_TIME:
|
case CURLINFO_TOTAL_TIME:
|
||||||
*param_doublep = data->progress.timespent;
|
*param_doublep = data->progress.timespent;
|
||||||
@@ -119,7 +120,7 @@ CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
|||||||
*param_doublep = data->progress.ulspeed;
|
*param_doublep = data->progress.ulspeed;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_SSL_VERIFYRESULT:
|
case CURLINFO_SSL_VERIFYRESULT:
|
||||||
*param_longp = data->ssl.certverifyresult;
|
*param_longp = data->set.ssl.certverifyresult;
|
||||||
break;
|
break;
|
||||||
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
|
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
|
||||||
*param_doublep = data->progress.size_dl;
|
*param_doublep = data->progress.size_dl;
|
||||||
@@ -132,3 +133,11 @@ CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...)
|
|||||||
}
|
}
|
||||||
return CURLE_OK;
|
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$
|
* $Id$
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
CURLcode Curl_getinfo(struct UrlData *data, CURLINFO info, ...);
|
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...);
|
||||||
CURLcode Curl_initinfo(struct UrlData *data);
|
CURLcode Curl_initinfo(struct SessionHandle *data);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -244,3 +244,11 @@ char *getpass(const char *prompt)
|
|||||||
return getpass_r(prompt, buf, sizeof(buf));
|
return getpass_r(prompt, buf, sizeof(buf));
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
#ifdef ENABLE_IPV6
|
||||||
struct addrinfo *Curl_getaddrinfo(struct UrlData *data,
|
struct addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
int port)
|
int port)
|
||||||
{
|
{
|
||||||
@@ -119,7 +119,7 @@ struct addrinfo *Curl_getaddrinfo(struct UrlData *data,
|
|||||||
#define INADDR_NONE (unsigned long) ~0
|
#define INADDR_NONE (unsigned long) ~0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct hostent *Curl_gethost(struct UrlData *data,
|
struct hostent *Curl_gethost(struct SessionHandle *data,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
char **bufp)
|
char **bufp)
|
||||||
{
|
{
|
||||||
@@ -215,3 +215,11 @@ struct hostent *Curl_gethost(struct UrlData *data,
|
|||||||
}
|
}
|
||||||
return (h);
|
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;
|
||||||
struct addrinfo *Curl_getaddrinfo(struct UrlData *data,
|
struct addrinfo *Curl_getaddrinfo(struct SessionHandle *data,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
int port);
|
int port);
|
||||||
|
|
||||||
struct hostent *Curl_gethost(struct UrlData *data,
|
struct hostent *Curl_gethost(struct SessionHandle *data,
|
||||||
char *hostname,
|
char *hostname,
|
||||||
char **bufp);
|
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 add_buffer_send(int sockfd, struct connectdata *conn, send_buffer *in)
|
||||||
{
|
{
|
||||||
size_t amount;
|
size_t amount;
|
||||||
if(conn->data->bits.verbose) {
|
if(conn->data->set.verbose) {
|
||||||
fputs("> ", conn->data->err);
|
fputs("> ", conn->data->set.err);
|
||||||
/* this data _may_ contain binary stuff */
|
/* 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);
|
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
|
static
|
||||||
int GetLine(int sockfd, char *buf, struct connectdata *conn)
|
int GetLine(int sockfd, char *ptr, struct connectdata *conn)
|
||||||
{
|
{
|
||||||
ssize_t nread;
|
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 */
|
/* get us a full line, terminated with a newline */
|
||||||
for(nread=0;
|
for(nread=0; (nread<BUFSIZE); nread++, ptr++) {
|
||||||
(nread<BUFSIZE) && read_rc;
|
|
||||||
nread++, ptr++) {
|
|
||||||
if((CURLE_OK != Curl_read(conn, sockfd, ptr, 1, &nread)) ||
|
if((CURLE_OK != Curl_read(conn, sockfd, ptr, 1, &nread)) ||
|
||||||
(nread <= 0) ||
|
(nread <= 0) || (*ptr == '\n'))
|
||||||
(*ptr == '\n'))
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
*ptr=0; /* zero terminate */
|
*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;
|
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
|
* This function checks the linked list of custom HTTP headers for a particular
|
||||||
* header (prefix).
|
* header (prefix).
|
||||||
*/
|
*/
|
||||||
static bool checkheaders(struct UrlData *data, const char *thisheader)
|
static bool checkheaders(struct SessionHandle *data, const char *thisheader)
|
||||||
{
|
{
|
||||||
struct curl_slist *head;
|
struct curl_slist *head;
|
||||||
size_t thislen = strlen(thisheader);
|
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)) {
|
if(strnequal(head->data, thisheader, thislen)) {
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -263,7 +250,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
{
|
{
|
||||||
int httperror=0;
|
int httperror=0;
|
||||||
int subversion=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);
|
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",
|
"\r\n",
|
||||||
hostname, remote_port,
|
hostname, remote_port,
|
||||||
(conn->bits.proxy_user_passwd)?conn->allocptr.proxyuserpwd:"",
|
(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 */
|
/* wait for the proxy to send us a HTTP/1.0 200 OK header */
|
||||||
while(GetLine(tunnelsocket, data->buffer, conn)) {
|
while(GetLine(tunnelsocket, data->state.buffer, conn)) {
|
||||||
if('\r' == data->buffer[0])
|
if('\r' == data->state.buffer[0])
|
||||||
break; /* end of headers */
|
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,
|
&subversion,
|
||||||
&httperror)) {
|
&httperror)) {
|
||||||
;
|
;
|
||||||
@@ -306,7 +296,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
|||||||
*/
|
*/
|
||||||
CURLcode Curl_http_connect(struct connectdata *conn)
|
CURLcode Curl_http_connect(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct UrlData *data;
|
struct SessionHandle *data;
|
||||||
CURLcode result;
|
CURLcode result;
|
||||||
|
|
||||||
data=conn->data;
|
data=conn->data;
|
||||||
@@ -318,7 +308,7 @@ CURLcode Curl_http_connect(struct connectdata *conn)
|
|||||||
* has occured, can we start talking SSL
|
* has occured, can we start talking SSL
|
||||||
*/
|
*/
|
||||||
if (conn->protocol & PROT_HTTPS) {
|
if (conn->protocol & PROT_HTTPS) {
|
||||||
if (data->bits.httpproxy) {
|
if (data->change.proxy) {
|
||||||
/* HTTPS through a proxy can only be done with a tunnel */
|
/* HTTPS through a proxy can only be done with a tunnel */
|
||||||
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
result = Curl_ConnectHTTPProxyTunnel(conn, conn->firstsocket,
|
||||||
conn->hostname, conn->remote_port);
|
conn->hostname, conn->remote_port);
|
||||||
@@ -332,42 +322,33 @@ CURLcode Curl_http_connect(struct connectdata *conn)
|
|||||||
return result;
|
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
|
/* Authorization: is requested, this is not a followed location, get the
|
||||||
original host name */
|
original host name */
|
||||||
data->auth_host = strdup(conn->hostname);
|
data->state.auth_host = strdup(conn->hostname);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CURLE_OK;
|
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)
|
CURLcode Curl_http_done(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct UrlData *data;
|
struct SessionHandle *data;
|
||||||
long *bytecount = &conn->bytecount;
|
long *bytecount = &conn->bytecount;
|
||||||
struct HTTP *http;
|
struct HTTP *http;
|
||||||
|
|
||||||
data=conn->data;
|
data=conn->data;
|
||||||
http=conn->proto.http;
|
http=conn->proto.http;
|
||||||
|
|
||||||
if(HTTPREQ_POST_FORM == data->httpreq) {
|
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||||
*bytecount = http->readbytecount + http->writebytecount;
|
*bytecount = http->readbytecount + http->writebytecount;
|
||||||
|
|
||||||
Curl_formclean(http->sendit); /* Now free that whole lot */
|
Curl_formclean(http->sendit); /* Now free that whole lot */
|
||||||
|
|
||||||
data->fread = http->storefread; /* restore */
|
data->set.fread = http->storefread; /* restore */
|
||||||
data->in = http->in; /* 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;
|
*bytecount = http->readbytecount + http->writebytecount;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -377,8 +358,8 @@ CURLcode Curl_http_done(struct connectdata *conn)
|
|||||||
|
|
||||||
CURLcode Curl_http(struct connectdata *conn)
|
CURLcode Curl_http(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct UrlData *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
char *buf = data->buffer; /* this is a short cut to the buffer */
|
char *buf = data->state.buffer; /* this is a short cut to the buffer */
|
||||||
CURLcode result=CURLE_OK;
|
CURLcode result=CURLE_OK;
|
||||||
struct HTTP *http;
|
struct HTTP *http;
|
||||||
struct Cookie *co=NULL; /* no cookies from start */
|
struct Cookie *co=NULL; /* no cookies from start */
|
||||||
@@ -402,8 +383,8 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
conn->bits.close = FALSE;
|
conn->bits.close = FALSE;
|
||||||
|
|
||||||
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
if ( (conn->protocol&(PROT_HTTP|PROT_FTP)) &&
|
||||||
data->bits.upload) {
|
data->set.upload) {
|
||||||
data->httpreq = HTTPREQ_PUT;
|
data->set.httpreq = HTTPREQ_PUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The User-Agent string has been built in url.c already, because it might
|
/* 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
|
/* 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 */
|
host due to a location-follow, we do some weirdo checks here */
|
||||||
if(!data->bits.this_is_a_follow ||
|
if(!data->state.this_is_a_follow ||
|
||||||
!data->auth_host ||
|
!data->state.auth_host ||
|
||||||
strequal(data->auth_host, conn->hostname)) {
|
strequal(data->state.auth_host, conn->hostname)) {
|
||||||
sprintf(data->buffer, "%s:%s", data->user, data->passwd);
|
sprintf(data->state.buffer, "%s:%s",
|
||||||
if(Curl_base64_encode(data->buffer, strlen(data->buffer),
|
data->state.user, data->state.passwd);
|
||||||
|
if(Curl_base64_encode(data->state.buffer, strlen(data->state.buffer),
|
||||||
&authorization) >= 0) {
|
&authorization) >= 0) {
|
||||||
if(conn->allocptr.userpwd)
|
if(conn->allocptr.userpwd)
|
||||||
free(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)
|
if(conn->allocptr.ref)
|
||||||
free(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)
|
if(conn->allocptr.cookie)
|
||||||
free(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) {
|
if(data->cookies) {
|
||||||
co = Curl_cookie_getlist(data->cookies,
|
co = Curl_cookie_getlist(data->cookies,
|
||||||
host,
|
host, ppath,
|
||||||
ppath,
|
|
||||||
conn->protocol&PROT_HTTPS?TRUE:FALSE);
|
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 */
|
/* 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
|
/* 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 */
|
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:")) {
|
if(!checkheaders(data, "Host:")) {
|
||||||
@@ -486,9 +467,9 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
if(!checkheaders(data, "Accept:"))
|
if(!checkheaders(data, "Accept:"))
|
||||||
http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";
|
http->p_accept = "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*\r\n";
|
||||||
|
|
||||||
if(( (HTTPREQ_POST == data->httpreq) ||
|
if(( (HTTPREQ_POST == data->set.httpreq) ||
|
||||||
(HTTPREQ_POST_FORM == data->httpreq) ||
|
(HTTPREQ_POST_FORM == data->set.httpreq) ||
|
||||||
(HTTPREQ_PUT == data->httpreq) ) &&
|
(HTTPREQ_PUT == data->set.httpreq) ) &&
|
||||||
conn->resume_from) {
|
conn->resume_from) {
|
||||||
/**********************************************************************
|
/**********************************************************************
|
||||||
* Resuming upload in HTTP means that we PUT or POST and that we have
|
* 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;
|
readthisamountnow = BUFSIZE;
|
||||||
|
|
||||||
actuallyread =
|
actuallyread =
|
||||||
data->fread(data->buffer, 1, readthisamountnow, data->in);
|
data->set.fread(data->state.buffer, 1, readthisamountnow,
|
||||||
|
data->set.in);
|
||||||
|
|
||||||
passed += actuallyread;
|
passed += actuallyread;
|
||||||
if(actuallyread != readthisamountnow) {
|
if(actuallyread != readthisamountnow) {
|
||||||
@@ -532,10 +514,10 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
} while(passed != conn->resume_from); /* loop until done */
|
} while(passed != conn->resume_from); /* loop until done */
|
||||||
|
|
||||||
/* now, decrease the size of the read */
|
/* now, decrease the size of the read */
|
||||||
if(data->infilesize>0) {
|
if(data->set.infilesize>0) {
|
||||||
data->infilesize -= conn->resume_from;
|
data->set.infilesize -= conn->resume_from;
|
||||||
|
|
||||||
if(data->infilesize <= 0) {
|
if(data->set.infilesize <= 0) {
|
||||||
failf(data, "File already completely uploaded\n");
|
failf(data, "File already completely uploaded\n");
|
||||||
return CURLE_PARTIAL_FILE;
|
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
|
* or uploading and we always let customized headers override our internal
|
||||||
* ones if any such are specified.
|
* ones if any such are specified.
|
||||||
*/
|
*/
|
||||||
if((data->httpreq == HTTPREQ_GET) &&
|
if((data->set.httpreq == HTTPREQ_GET) &&
|
||||||
!checkheaders(data, "Range:")) {
|
!checkheaders(data, "Range:")) {
|
||||||
conn->allocptr.rangeline = aprintf("Range: bytes=%s\r\n", conn->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:")) {
|
!checkheaders(data, "Content-Range:")) {
|
||||||
|
|
||||||
if(conn->resume_from) {
|
if(conn->resume_from) {
|
||||||
/* This is because "resume" was selected */
|
/* 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->allocptr.rangeline = aprintf("Content-Range: bytes %s%ld/%ld\r\n",
|
||||||
conn->range, total_expected_size-1,
|
conn->range, total_expected_size-1,
|
||||||
total_expected_size);
|
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
|
/* Range was selected and then we just pass the incoming range and
|
||||||
append total size */
|
append total size */
|
||||||
conn->allocptr.rangeline = aprintf("Content-Range: bytes %s/%d\r\n",
|
conn->allocptr.rangeline = aprintf("Content-Range: bytes %s/%d\r\n",
|
||||||
conn->range, data->infilesize);
|
conn->range, data->set.infilesize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
send_buffer *req_buffer;
|
send_buffer *req_buffer;
|
||||||
struct curl_slist *headers=data->headers;
|
struct curl_slist *headers=data->set.headers;
|
||||||
|
|
||||||
/* initialize a dynamic send-buffer */
|
/* initialize a dynamic send-buffer */
|
||||||
req_buffer = add_buffer_init();
|
req_buffer = add_buffer_init();
|
||||||
@@ -593,11 +575,11 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
"%s" /* accept */
|
"%s" /* accept */
|
||||||
"%s", /* referer */
|
"%s", /* referer */
|
||||||
|
|
||||||
data->customrequest?data->customrequest:
|
data->set.customrequest?data->set.customrequest:
|
||||||
(data->bits.no_body?"HEAD":
|
(data->set.no_body?"HEAD":
|
||||||
((HTTPREQ_POST == data->httpreq) ||
|
((HTTPREQ_POST == data->set.httpreq) ||
|
||||||
(HTTPREQ_POST_FORM == data->httpreq))?"POST":
|
(HTTPREQ_POST_FORM == data->set.httpreq))?"POST":
|
||||||
(HTTPREQ_PUT == data->httpreq)?"PUT":"GET"),
|
(HTTPREQ_PUT == data->set.httpreq)?"PUT":"GET"),
|
||||||
ppath,
|
ppath,
|
||||||
(conn->bits.proxy_user_passwd &&
|
(conn->bits.proxy_user_passwd &&
|
||||||
conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"",
|
conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"",
|
||||||
@@ -605,13 +587,13 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
conn->allocptr.userpwd:"",
|
conn->allocptr.userpwd:"",
|
||||||
(conn->bits.use_range && conn->allocptr.rangeline)?
|
(conn->bits.use_range && conn->allocptr.rangeline)?
|
||||||
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.uagent:"",
|
||||||
(conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: <data> */
|
(conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: <data> */
|
||||||
(conn->allocptr.host?conn->allocptr.host:""), /* Host: host */
|
(conn->allocptr.host?conn->allocptr.host:""), /* Host: host */
|
||||||
http->p_pragma?http->p_pragma:"",
|
http->p_pragma?http->p_pragma:"",
|
||||||
http->p_accept?http->p_accept:"",
|
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) {
|
if(co) {
|
||||||
@@ -636,7 +618,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
co=NULL;
|
co=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->timecondition) {
|
if(data->set.timecondition) {
|
||||||
struct tm *thistime;
|
struct tm *thistime;
|
||||||
|
|
||||||
/* Phil Karn (Fri, 13 Apr 2001) pointed out that the If-Modified-Since
|
/* 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
|
/* We assume that the presense of localtime_r() proves the presense
|
||||||
of gmtime_r() which is a bit ugly but might work */
|
of gmtime_r() which is a bit ugly but might work */
|
||||||
struct tm keeptime;
|
struct tm keeptime;
|
||||||
thistime = (struct tm *)gmtime_r(&data->timevalue, &keeptime);
|
thistime = (struct tm *)gmtime_r(&data->set.timevalue, &keeptime);
|
||||||
#else
|
#else
|
||||||
thistime = gmtime(&data->timevalue);
|
thistime = gmtime(&data->set.timevalue);
|
||||||
#endif
|
#endif
|
||||||
if(NULL == thistime) {
|
if(NULL == thistime) {
|
||||||
failf(data, "localtime() failed!");
|
failf(data, "localtime() failed!");
|
||||||
@@ -667,7 +649,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
/* TODO: Right, we *could* write a replacement here */
|
/* TODO: Right, we *could* write a replacement here */
|
||||||
strcpy(buf, "no strftime() support");
|
strcpy(buf, "no strftime() support");
|
||||||
#endif
|
#endif
|
||||||
switch(data->timecondition) {
|
switch(data->set.timecondition) {
|
||||||
case TIMECOND_IFMODSINCE:
|
case TIMECOND_IFMODSINCE:
|
||||||
default:
|
default:
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
@@ -702,7 +684,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
headers = headers->next;
|
headers = headers->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(HTTPREQ_POST_FORM == data->httpreq) {
|
if(HTTPREQ_POST_FORM == data->set.httpreq) {
|
||||||
char contentType[256];
|
char contentType[256];
|
||||||
int linelength=0;
|
int linelength=0;
|
||||||
if(Curl_FormInit(&http->form, http->sendit)) {
|
if(Curl_FormInit(&http->form, http->sendit)) {
|
||||||
@@ -710,13 +692,13 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
return CURLE_HTTP_POST_ERROR;
|
return CURLE_HTTP_POST_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
http->storefread = data->fread; /* backup */
|
http->storefread = data->set.fread; /* backup */
|
||||||
http->in = data->in; /* 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
|
Curl_FormReader; /* set the read function to read from the
|
||||||
generated form data */
|
generated form data */
|
||||||
data->in = (FILE *)&http->form;
|
data->set.in = (FILE *)&http->form;
|
||||||
|
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
"Content-Length: %d\r\n", http->postsize-2);
|
"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) */
|
there is one packet coming back from the web server) */
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
"Expect: 100-continue\r\n");
|
"Expect: 100-continue\r\n");
|
||||||
data->bits.expect100header = TRUE;
|
data->set.expect100header = TRUE;
|
||||||
|
|
||||||
/* Get Content-Type: line from Curl_FormReadOneLine, which happens
|
/* Get Content-Type: line from Curl_FormReadOneLine, which happens
|
||||||
to always be the first line. We can know this for sure since
|
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);
|
Curl_pgrsSetUploadSize(data, http->postsize);
|
||||||
|
|
||||||
/* fire away the whole request to the server */
|
/* fire away the whole request to the server */
|
||||||
data->request_size =
|
data->info.request_size =
|
||||||
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
||||||
|
|
||||||
/* setup variables for the upcoming transfer */
|
/* setup variables for the upcoming transfer */
|
||||||
@@ -760,22 +742,22 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(HTTPREQ_PUT == data->httpreq) {
|
else if(HTTPREQ_PUT == data->set.httpreq) {
|
||||||
/* Let's PUT the data to the server! */
|
/* Let's PUT the data to the server! */
|
||||||
|
|
||||||
if(data->infilesize>0) {
|
if(data->set.infilesize>0) {
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
"Content-Length: %d\r\n\r\n", /* file size */
|
"Content-Length: %d\r\n\r\n", /* file size */
|
||||||
data->infilesize );
|
data->set.infilesize );
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
add_bufferf(req_buffer, "\015\012");
|
add_bufferf(req_buffer, "\015\012");
|
||||||
|
|
||||||
/* set the upload size to the progress meter */
|
/* 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 */
|
/* 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);
|
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
||||||
|
|
||||||
/* prepare for transfer */
|
/* prepare for transfer */
|
||||||
@@ -788,17 +770,17 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if(HTTPREQ_POST == data->httpreq) {
|
if(HTTPREQ_POST == data->set.httpreq) {
|
||||||
/* this is the simple POST, using x-www-form-urlencoded style */
|
/* 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
|
* This is an attempt to do a POST without having anything to
|
||||||
* actually send. Let's make a NULL pointer equal "" here. Good/bad
|
* actually send. Let's make a NULL pointer equal "" here. Good/bad
|
||||||
* ?
|
* ?
|
||||||
*/
|
*/
|
||||||
data->postfields = (char *)"";
|
data->set.postfields = (char *)"";
|
||||||
data->postfieldsize = 0; /* it might been set to something illegal,
|
data->set.postfieldsize = 0; /* it might been set to something illegal,
|
||||||
anything > 0 would be! */
|
anything > 0 would be! */
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,32 +789,32 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
actually set your own */
|
actually set your own */
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
"Content-Length: %d\r\n",
|
"Content-Length: %d\r\n",
|
||||||
(data->postfieldsize?data->postfieldsize:
|
(data->set.postfieldsize?data->set.postfieldsize:
|
||||||
strlen(data->postfields)) );
|
strlen(data->set.postfields)) );
|
||||||
|
|
||||||
if(!checkheaders(data, "Content-Type:"))
|
if(!checkheaders(data, "Content-Type:"))
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
"Content-Type: application/x-www-form-urlencoded\r\n");
|
"Content-Type: application/x-www-form-urlencoded\r\n");
|
||||||
|
|
||||||
/* and here comes the actual data */
|
/* and here comes the actual data */
|
||||||
if(data->postfieldsize) {
|
if(data->set.postfieldsize) {
|
||||||
add_buffer(req_buffer, "\r\n", 2);
|
add_buffer(req_buffer, "\r\n", 2);
|
||||||
add_buffer(req_buffer, data->postfields,
|
add_buffer(req_buffer, data->set.postfields,
|
||||||
data->postfieldsize);
|
data->set.postfieldsize);
|
||||||
add_buffer(req_buffer, "\r\n", 2);
|
add_buffer(req_buffer, "\r\n", 2);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
add_bufferf(req_buffer,
|
add_bufferf(req_buffer,
|
||||||
"\r\n"
|
"\r\n"
|
||||||
"%s\r\n",
|
"%s\r\n",
|
||||||
data->postfields );
|
data->set.postfields );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
add_buffer(req_buffer, "\r\n", 2);
|
add_buffer(req_buffer, "\r\n", 2);
|
||||||
|
|
||||||
/* issue the request */
|
/* issue the request */
|
||||||
data->request_size =
|
data->info.request_size =
|
||||||
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
add_buffer_send(conn->firstsocket, conn, req_buffer);
|
||||||
|
|
||||||
/* HTTP GET/HEAD download: */
|
/* HTTP GET/HEAD download: */
|
||||||
@@ -847,3 +829,11 @@ CURLcode Curl_http(struct connectdata *conn)
|
|||||||
return CURLE_OK;
|
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(struct connectdata *conn);
|
||||||
CURLcode Curl_http_done(struct connectdata *conn);
|
CURLcode Curl_http_done(struct connectdata *conn);
|
||||||
CURLcode Curl_http_connect(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 */
|
/* The following functions are defined in http_chunks.c */
|
||||||
void Curl_httpchunk_init(struct connectdata *conn);
|
void Curl_httpchunk_init(struct connectdata *conn);
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
* Chunk format (simplified):
|
* Chunk format (simplified):
|
||||||
*
|
*
|
||||||
* <HEX SIZE>[ chunk extension ] CRLF
|
* <HEX SIZE>[ chunk extension ] CRLF
|
||||||
* <DATA>
|
* <DATA> CRLF
|
||||||
*
|
*
|
||||||
* Highlights from RFC2616 section 3.6 say:
|
* Highlights from RFC2616 section 3.6 say:
|
||||||
|
|
||||||
@@ -220,3 +220,11 @@ CHUNKcode Curl_httpchunk_read(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
return CHUNKE_OK;
|
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
|
#else
|
||||||
#define if2ip(x) NULL
|
#define if2ip(x) NULL
|
||||||
#endif
|
#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);
|
Curl_ftpsendf(conn->firstsocket, conn, "ADAT %s", p);
|
||||||
|
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||||
conn->data->buffer, conn, NULL);
|
conn->data->state.buffer, conn, NULL);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
||||||
free(p);
|
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");
|
printf("Server didn't accept auth data.\n");
|
||||||
return AUTH_ERROR;
|
return AUTH_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = strstr(conn->data->buffer, "ADAT=");
|
p = strstr(conn->data->state.buffer, "ADAT=");
|
||||||
if(!p){
|
if(!p){
|
||||||
printf("Remote host didn't send adat reply.\n");
|
printf("Remote host didn't send adat reply.\n");
|
||||||
return AUTH_ERROR;
|
return AUTH_ERROR;
|
||||||
@@ -314,20 +314,20 @@ void Curl_krb_kauth(struct connectdata *conn)
|
|||||||
save = Curl_set_command_prot(conn, prot_private);
|
save = Curl_set_command_prot(conn, prot_private);
|
||||||
|
|
||||||
Curl_ftpsendf(conn->firstsocket, conn,
|
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);
|
conn, NULL);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
return /*CURLE_OPERATION_TIMEOUTED*/;
|
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);
|
Curl_set_command_prot(conn, save);
|
||||||
/*code = -1;***/
|
/*code = -1;***/
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
p = strstr(conn->data->buffer, "T=");
|
p = strstr(conn->data->state.buffer, "T=");
|
||||||
if(!p) {
|
if(!p) {
|
||||||
printf("Bad reply from server.\n");
|
printf("Bad reply from server.\n");
|
||||||
Curl_set_command_prot(conn, save);
|
Curl_set_command_prot(conn, save);
|
||||||
@@ -344,7 +344,7 @@ void Curl_krb_kauth(struct connectdata *conn)
|
|||||||
tkt.length = tmp;
|
tkt.length = tmp;
|
||||||
tktcopy.length = tkt.length;
|
tktcopy.length = tkt.length;
|
||||||
|
|
||||||
p = strstr(conn->data->buffer, "P=");
|
p = strstr(conn->data->state.buffer, "P=");
|
||||||
if(!p) {
|
if(!p) {
|
||||||
printf("Bad reply from server.\n");
|
printf("Bad reply from server.\n");
|
||||||
Curl_set_command_prot(conn, save);
|
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++);
|
for(; *p && *p != ' ' && *p != '\r' && *p != '\n'; p++);
|
||||||
*p = 0;
|
*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_key_sched(&key, schedule);
|
||||||
|
|
||||||
des_pcbc_encrypt((des_cblock*)tkt.dat, (des_cblock*)tktcopy.dat,
|
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,
|
Curl_ftpsendf(conn->firstsocket, conn,
|
||||||
"SITE KAUTH %s %s", name, p);
|
"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);
|
conn, NULL);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
return /*CURLE_OPERATION_TIMEOUTED*/;
|
return /*CURLE_OPERATION_TIMEOUTED*/;
|
||||||
@@ -392,3 +392,11 @@ void Curl_krb_kauth(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* KRB4 */
|
#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)
|
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 */
|
len = 0; /* prevent compiler warning */
|
||||||
Curl_client_write(data, CLIENTWRITE_BODY, text, 0);
|
Curl_client_write(data, CLIENTWRITE_BODY, text, 0);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -142,9 +142,9 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
|||||||
void *entryIterator;
|
void *entryIterator;
|
||||||
|
|
||||||
int ldaptext;
|
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();
|
DynaOpen();
|
||||||
if (libldap == NULL) {
|
if (libldap == NULL) {
|
||||||
@@ -152,7 +152,7 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
|||||||
return CURLE_LIBRARY_NOT_FOUND;
|
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
|
/* The types are needed because ANSI C distinguishes between
|
||||||
* pointer-to-object (data) and pointer-to-function.
|
* pointer-to-object (data) and pointer-to-function.
|
||||||
@@ -173,12 +173,12 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
|||||||
conn->hostname, conn->port);
|
conn->hostname, conn->port);
|
||||||
status = CURLE_COULDNT_CONNECT;
|
status = CURLE_COULDNT_CONNECT;
|
||||||
} else {
|
} 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) {
|
if (rc != 0) {
|
||||||
failf(data, "LDAP: %s", ldap_err2string(rc));
|
failf(data, "LDAP: %s", ldap_err2string(rc));
|
||||||
status = CURLE_LDAP_CANNOT_BIND;
|
status = CURLE_LDAP_CANNOT_BIND;
|
||||||
} else {
|
} 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) {
|
if (rc != 0) {
|
||||||
failf(data, "LDAP: %s", ldap_err2string(rc));
|
failf(data, "LDAP: %s", ldap_err2string(rc));
|
||||||
status = CURLE_LDAP_SEARCH_FAILED;
|
status = CURLE_LDAP_SEARCH_FAILED;
|
||||||
@@ -213,3 +213,11 @@ CURLcode Curl_ldap(struct connectdata *conn)
|
|||||||
|
|
||||||
return status;
|
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_mvfprintf @ 22 ;
|
||||||
curl_strequal @ 23 ;
|
curl_strequal @ 23 ;
|
||||||
curl_strnequal @ 24 ;
|
curl_strnequal @ 24 ;
|
||||||
|
curl_easy_duphandle @ 25 ;
|
||||||
|
|
||||||
|
|||||||
@@ -156,3 +156,11 @@ int curl_fclose(FILE *file, int line, const char *source)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* MALLOCDEBUG */
|
#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
|
#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
|
#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)
|
void Curl_pgrsDone(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
if(!(data->progress.flags & PGRS_HIDE)) {
|
if(!(data->progress.flags & PGRS_HIDE)) {
|
||||||
data->progress.lastshow=0;
|
data->progress.lastshow=0;
|
||||||
Curl_pgrsUpdate(conn); /* the final (forced) update */
|
Curl_pgrsUpdate(conn); /* the final (forced) update */
|
||||||
if(!data->progress.callback)
|
if(!data->progress.callback)
|
||||||
/* only output if we don't use 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) {
|
switch(timer) {
|
||||||
default:
|
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.speeder_c = 0; /* reset the progress meter display */
|
||||||
data->progress.start = Curl_tvnow();
|
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;
|
data->progress.downloaded = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Curl_pgrsSetUploadCounter(struct UrlData *data, double size)
|
void Curl_pgrsSetUploadCounter(struct SessionHandle *data, double size)
|
||||||
{
|
{
|
||||||
data->progress.uploaded = size;
|
data->progress.uploaded = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Curl_pgrsSetDownloadSize(struct UrlData *data, double size)
|
void Curl_pgrsSetDownloadSize(struct SessionHandle *data, double size)
|
||||||
{
|
{
|
||||||
if(size > 0) {
|
if(size > 0) {
|
||||||
data->progress.size_dl = size;
|
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) {
|
if(size > 0) {
|
||||||
data->progress.size_ul = size;
|
data->progress.size_ul = size;
|
||||||
@@ -188,7 +188,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
|||||||
double total_transfer;
|
double total_transfer;
|
||||||
double total_expected_transfer;
|
double total_expected_transfer;
|
||||||
|
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
|
|
||||||
int nowindex = data->progress.speeder_c% CURR_TIME;
|
int nowindex = data->progress.speeder_c% CURR_TIME;
|
||||||
int checkindex;
|
int checkindex;
|
||||||
@@ -211,9 +211,9 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
|||||||
else if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
|
else if(!(data->progress.flags & PGRS_HEADERS_OUT)) {
|
||||||
if (!data->progress.callback) {
|
if (!data->progress.callback) {
|
||||||
if(conn->resume_from)
|
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);
|
conn->resume_from);
|
||||||
fprintf(data->err,
|
fprintf(data->set.err,
|
||||||
" %% Total %% Received %% Xferd Average Speed Time Curr.\n"
|
" %% Total %% Received %% Xferd Average Speed Time Curr.\n"
|
||||||
" Dload Upload Total Current Left Speed\n");
|
" Dload Upload Total Current Left Speed\n");
|
||||||
}
|
}
|
||||||
@@ -254,8 +254,8 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
|||||||
|
|
||||||
if(data->progress.flags & PGRS_HIDE)
|
if(data->progress.flags & PGRS_HIDE)
|
||||||
return 0;
|
return 0;
|
||||||
else if(data->fprogress) {
|
else if(data->set.fprogress) {
|
||||||
result= data->fprogress(data->progress_client,
|
result= data->set.fprogress(data->set.progress_client,
|
||||||
data->progress.size_dl,
|
data->progress.size_dl,
|
||||||
data->progress.downloaded,
|
data->progress.downloaded,
|
||||||
data->progress.size_ul,
|
data->progress.size_ul,
|
||||||
@@ -310,7 +310,7 @@ int Curl_pgrsUpdate(struct connectdata *conn)
|
|||||||
if(total_expected_transfer)
|
if(total_expected_transfer)
|
||||||
total_percen=(double)(total_transfer/total_expected_transfer)*100;
|
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",
|
"\r%3d %s %3d %s %3d %s %s %s %s %s %s %s",
|
||||||
(int)total_percen, /* total % */
|
(int)total_percen, /* total % */
|
||||||
max5data(total_expected_transfer, max5[2]), /* total size */
|
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 */
|
/* we flush the output stream to make it appear as soon as possible */
|
||||||
fflush(data->err);
|
fflush(data->set.err);
|
||||||
|
|
||||||
return 0;
|
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;
|
} timerid;
|
||||||
|
|
||||||
void Curl_pgrsDone(struct connectdata *);
|
void Curl_pgrsDone(struct connectdata *);
|
||||||
void Curl_pgrsStartNow(struct UrlData *data);
|
void Curl_pgrsStartNow(struct SessionHandle *data);
|
||||||
void Curl_pgrsSetDownloadSize(struct UrlData *data, double size);
|
void Curl_pgrsSetDownloadSize(struct SessionHandle *data, double size);
|
||||||
void Curl_pgrsSetUploadSize(struct UrlData *data, double size);
|
void Curl_pgrsSetUploadSize(struct SessionHandle *data, double size);
|
||||||
void Curl_pgrsSetDownloadCounter(struct UrlData *data, double size);
|
void Curl_pgrsSetDownloadCounter(struct SessionHandle *data, double size);
|
||||||
void Curl_pgrsSetUploadCounter(struct UrlData *data, double size);
|
void Curl_pgrsSetUploadCounter(struct SessionHandle *data, double size);
|
||||||
int Curl_pgrsUpdate(struct connectdata *);
|
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: */
|
/* Don't show progress for sizes smaller than: */
|
||||||
|
|||||||
@@ -417,15 +417,15 @@ sec_prot_internal(struct connectdata *conn, int level)
|
|||||||
"PBSZ %u", s);
|
"PBSZ %u", s);
|
||||||
/* wait for feedback */
|
/* wait for feedback */
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||||
conn->data->buffer, conn, NULL);
|
conn->data->state.buffer, conn, NULL);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
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");
|
failf(conn->data, "Failed to set protection buffer size.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
conn->buffer_size = s;
|
conn->buffer_size = s;
|
||||||
p = strstr(/*reply_string*/conn->data->buffer, "PBSZ=");
|
p = strstr(/*reply_string*/conn->data->state.buffer, "PBSZ=");
|
||||||
if(p)
|
if(p)
|
||||||
sscanf(p, "PBSZ=%u", &s);
|
sscanf(p, "PBSZ=%u", &s);
|
||||||
if(s < conn->buffer_size)
|
if(s < conn->buffer_size)
|
||||||
@@ -436,10 +436,10 @@ sec_prot_internal(struct connectdata *conn, int level)
|
|||||||
"PROT %c", level["CSEP"]);
|
"PROT %c", level["CSEP"]);
|
||||||
/* wait for feedback */
|
/* wait for feedback */
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||||
conn->data->buffer, conn, NULL);
|
conn->data->state.buffer, conn, NULL);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
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");
|
failf(conn->data, "Failed to set protection level.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -472,7 +472,7 @@ Curl_sec_login(struct connectdata *conn)
|
|||||||
int ret;
|
int ret;
|
||||||
struct Curl_sec_client_mech **m;
|
struct Curl_sec_client_mech **m;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
struct UrlData *data=conn->data;
|
struct SessionHandle *data=conn->data;
|
||||||
|
|
||||||
for(m = mechs; *m && (*m)->name; m++) {
|
for(m = mechs; *m && (*m)->name; m++) {
|
||||||
void *tmp;
|
void *tmp;
|
||||||
@@ -494,18 +494,18 @@ Curl_sec_login(struct connectdata *conn)
|
|||||||
"AUTH %s", (*m)->name);
|
"AUTH %s", (*m)->name);
|
||||||
/* wait for feedback */
|
/* wait for feedback */
|
||||||
nread = Curl_GetFTPResponse(conn->firstsocket,
|
nread = Curl_GetFTPResponse(conn->firstsocket,
|
||||||
conn->data->buffer, conn, NULL);
|
conn->data->state.buffer, conn, NULL);
|
||||||
if(nread < 0)
|
if(nread < 0)
|
||||||
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
return /*CURLE_OPERATION_TIMEOUTED*/-1;
|
||||||
if(/*ret != CONTINUE*/conn->data->buffer[0] != '3'){
|
if(/*ret != CONTINUE*/conn->data->state.buffer[0] != '3'){
|
||||||
if(/*code == 504*/strncmp(conn->data->buffer,"504",3) == 0) {
|
if(/*code == 504*/strncmp(conn->data->state.buffer,"504",3) == 0) {
|
||||||
infof(data,
|
infof(data,
|
||||||
"%s is not supported by the server.\n", (*m)->name);
|
"%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);
|
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 "
|
infof(data, "The server doesn't support the FTP "
|
||||||
"security extensions.\n");
|
"security extensions.\n");
|
||||||
return -1;
|
return -1;
|
||||||
@@ -546,3 +546,11 @@ Curl_sec_end(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endif /* KRB4 */
|
#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 */
|
/* 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;
|
va_list ap;
|
||||||
if(data->bits.verbose) {
|
if(data->set.verbose) {
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
fputs("* ", data->err);
|
fputs("* ", data->set.err);
|
||||||
vfprintf(data->err, fmt, ap);
|
vfprintf(data->set.err, fmt, ap);
|
||||||
va_end(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
|
/* Curl_failf() is for messages stating why we failed, the LAST one will be
|
||||||
returned for the user (if requested) */
|
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_list ap;
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
if(data->errorbuffer)
|
if(data->set.errorbuffer)
|
||||||
vsnprintf(data->errorbuffer, CURL_ERROR_SIZE, fmt, ap);
|
vsnprintf(data->set.errorbuffer, CURL_ERROR_SIZE, fmt, ap);
|
||||||
va_end(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,
|
size_t Curl_sendf(int sockfd, struct connectdata *conn,
|
||||||
const char *fmt, ...)
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
size_t bytes_written;
|
size_t bytes_written;
|
||||||
char *s;
|
char *s;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@@ -158,8 +158,8 @@ size_t Curl_sendf(int sockfd, struct connectdata *conn,
|
|||||||
va_end(ap);
|
va_end(ap);
|
||||||
if(!s)
|
if(!s)
|
||||||
return 0; /* failure */
|
return 0; /* failure */
|
||||||
if(data->bits.verbose)
|
if(data->set.verbose)
|
||||||
fprintf(data->err, "> %s", s);
|
fprintf(data->set.err, "> %s", s);
|
||||||
|
|
||||||
/* Write the buffer to the socket */
|
/* Write the buffer to the socket */
|
||||||
Curl_write(conn, sockfd, s, strlen(s), &bytes_written);
|
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 bit pattern defines to what "streams" to write to. Body and/or header.
|
||||||
The defines are in sendf.h of course.
|
The defines are in sendf.h of course.
|
||||||
*/
|
*/
|
||||||
CURLcode Curl_client_write(struct UrlData *data,
|
CURLcode Curl_client_write(struct SessionHandle *data,
|
||||||
int type,
|
int type,
|
||||||
char *ptr,
|
char *ptr,
|
||||||
size_t len)
|
size_t len)
|
||||||
@@ -230,22 +230,22 @@ CURLcode Curl_client_write(struct UrlData *data,
|
|||||||
len = strlen(ptr);
|
len = strlen(ptr);
|
||||||
|
|
||||||
if(type & CLIENTWRITE_BODY) {
|
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) {
|
if(wrote != len) {
|
||||||
failf (data, "Failed writing body");
|
failf (data, "Failed writing body");
|
||||||
return CURLE_WRITE_ERROR;
|
return CURLE_WRITE_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if((type & CLIENTWRITE_HEADER) &&
|
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
|
* Write headers to the same callback or to the especially setup
|
||||||
* header callback function (added after version 7.7.1).
|
* header callback function (added after version 7.7.1).
|
||||||
*/
|
*/
|
||||||
curl_write_callback writeit=
|
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) {
|
if(wrote != len) {
|
||||||
failf (data, "Failed writing header");
|
failf (data, "Failed writing header");
|
||||||
return CURLE_WRITE_ERROR;
|
return CURLE_WRITE_ERROR;
|
||||||
@@ -291,3 +291,11 @@ CURLcode Curl_read(struct connectdata *conn, int sockfd,
|
|||||||
return CURLE_OK;
|
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, ...);
|
size_t Curl_sendf(int fd, struct connectdata *, const char *fmt, ...);
|
||||||
void Curl_infof(struct UrlData *, const char *fmt, ...);
|
void Curl_infof(struct SessionHandle *, const char *fmt, ...);
|
||||||
void Curl_failf(struct UrlData *, const char *fmt, ...);
|
void Curl_failf(struct SessionHandle *, const char *fmt, ...);
|
||||||
|
|
||||||
#define infof Curl_infof
|
#define infof Curl_infof
|
||||||
#define failf Curl_failf
|
#define failf Curl_failf
|
||||||
@@ -41,7 +41,7 @@ typedef struct send_buffer send_buffer;
|
|||||||
#define CLIENTWRITE_HEADER 2
|
#define CLIENTWRITE_HEADER 2
|
||||||
#define CLIENTWRITE_BOTH (CLIENTWRITE_BODY|CLIENTWRITE_HEADER)
|
#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);
|
size_t len);
|
||||||
|
|
||||||
/* internal read-function, does plain socket, SSL and krb4 */
|
/* internal read-function, does plain socket, SSL and krb4 */
|
||||||
|
|||||||
@@ -34,37 +34,44 @@
|
|||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
#include "speedcheck.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)
|
struct timeval now)
|
||||||
{
|
{
|
||||||
if((data->progress.current_speed >= 0) &&
|
if((data->progress.current_speed >= 0) &&
|
||||||
data->low_speed_time &&
|
data->set.low_speed_time &&
|
||||||
(Curl_tvlong(data->keeps_speed) != 0) &&
|
(Curl_tvlong(data->state.keeps_speed) != 0) &&
|
||||||
(data->progress.current_speed < data->low_speed_limit)) {
|
(data->progress.current_speed < data->set.low_speed_limit)) {
|
||||||
|
|
||||||
/* We are now below the "low speed limit". If we are below it
|
/* We are now below the "low speed limit". If we are below it
|
||||||
for "low speed time" seconds we consider that enough reason
|
for "low speed time" seconds we consider that enough reason
|
||||||
to abort the download. */
|
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 */
|
/* we have been this slow for long enough, now die */
|
||||||
failf(data,
|
failf(data,
|
||||||
"Operation too slow. "
|
"Operation too slow. "
|
||||||
"Less than %d bytes/sec transfered the last %d seconds",
|
"Less than %d bytes/sec transfered the last %d seconds",
|
||||||
data->low_speed_limit,
|
data->set.low_speed_limit,
|
||||||
data->low_speed_time);
|
data->set.low_speed_time);
|
||||||
return CURLE_OPERATION_TIMEOUTED;
|
return CURLE_OPERATION_TIMEOUTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* we keep up the required speed all right */
|
/* we keep up the required speed all right */
|
||||||
data->keeps_speed = now;
|
data->state.keeps_speed = now;
|
||||||
}
|
}
|
||||||
return CURLE_OK;
|
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"
|
#include "timeval.h"
|
||||||
|
|
||||||
void Curl_speedinit(struct UrlData *data);
|
void Curl_speedinit(struct SessionHandle *data);
|
||||||
CURLcode Curl_speedcheck(struct UrlData *data,
|
CURLcode Curl_speedcheck(struct SessionHandle *data,
|
||||||
struct timeval now);
|
struct timeval now);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
234
lib/ssluse.c
234
lib/ssluse.c
@@ -94,9 +94,9 @@ bool seed_enough(struct connectdata *conn, /* unused for now */
|
|||||||
static
|
static
|
||||||
int random_the_seed(struct connectdata *conn)
|
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;
|
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?
|
/* Q: should we add support for a random file name as a libcurl option?
|
||||||
A: Yes, it is here */
|
A: Yes, it is here */
|
||||||
@@ -104,13 +104,13 @@ int random_the_seed(struct connectdata *conn)
|
|||||||
#ifndef RANDOM_FILE
|
#ifndef RANDOM_FILE
|
||||||
/* if RANDOM_FILE isn't defined, we only perform this if an option tells
|
/* if RANDOM_FILE isn't defined, we only perform this if an option tells
|
||||||
us to! */
|
us to! */
|
||||||
if(data->ssl.random_file)
|
if(data->set.ssl.random_file)
|
||||||
#define RANDOM_FILE "" /* doesn't matter won't be used */
|
#define RANDOM_FILE "" /* doesn't matter won't be used */
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
/* let the option override the define */
|
/* let the option override the define */
|
||||||
nread += RAND_load_file((data->ssl.random_file?
|
nread += RAND_load_file((data->set.ssl.random_file?
|
||||||
data->ssl.random_file:RANDOM_FILE),
|
data->set.ssl.random_file:RANDOM_FILE),
|
||||||
16384);
|
16384);
|
||||||
if(seed_enough(conn, nread))
|
if(seed_enough(conn, nread))
|
||||||
return nread;
|
return nread;
|
||||||
@@ -122,13 +122,13 @@ int random_the_seed(struct connectdata *conn)
|
|||||||
#ifndef EGD_SOCKET
|
#ifndef EGD_SOCKET
|
||||||
/* If we don't have the define set, we only do this if the egd-option
|
/* If we don't have the define set, we only do this if the egd-option
|
||||||
is set */
|
is set */
|
||||||
if(data->ssl.egdsocket)
|
if(data->set.ssl.egdsocket)
|
||||||
#define EGD_SOCKET "" /* doesn't matter won't be used */
|
#define EGD_SOCKET "" /* doesn't matter won't be used */
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
/* If there's an option and a define, the option overrides the
|
/* If there's an option and a define, the option overrides the
|
||||||
define */
|
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) {
|
if(-1 != ret) {
|
||||||
nread += ret;
|
nread += ret;
|
||||||
if(seed_enough(conn, nread))
|
if(seed_enough(conn, nread))
|
||||||
@@ -176,23 +176,23 @@ int cert_stuff(struct connectdata *conn,
|
|||||||
char *cert_file,
|
char *cert_file,
|
||||||
char *key_file)
|
char *key_file)
|
||||||
{
|
{
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
if (cert_file != NULL) {
|
if (cert_file != NULL) {
|
||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
X509 *x509;
|
X509 *x509;
|
||||||
|
|
||||||
if(data->cert_passwd) {
|
if(data->set.cert_passwd) {
|
||||||
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
|
#ifndef HAVE_USERDATA_IN_PWD_CALLBACK
|
||||||
/*
|
/*
|
||||||
* If password has been given, we store that in the global
|
* If password has been given, we store that in the global
|
||||||
* area (*shudder*) for a while:
|
* area (*shudder*) for a while:
|
||||||
*/
|
*/
|
||||||
strcpy(global_passwd, data->cert_passwd);
|
strcpy(global_passwd, data->set.cert_passwd);
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* We set the password in the callback userdata
|
* 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
|
#endif
|
||||||
/* Set passwd callback: */
|
/* Set passwd callback: */
|
||||||
SSL_CTX_set_default_passwd_cb(conn->ssl.ctx, 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,
|
if (SSL_CTX_use_certificate_file(conn->ssl.ctx,
|
||||||
cert_file,
|
cert_file,
|
||||||
SSL_FILETYPE_PEM) <= 0) {
|
SSL_FILETYPE_PEM) != 1) {
|
||||||
failf(data, "unable to set certificate file (wrong password?)\n");
|
failf(data, "unable to set certificate file (wrong password?)\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@@ -209,7 +209,7 @@ int cert_stuff(struct connectdata *conn,
|
|||||||
|
|
||||||
if (SSL_CTX_use_PrivateKey_file(conn->ssl.ctx,
|
if (SSL_CTX_use_PrivateKey_file(conn->ssl.ctx,
|
||||||
key_file,
|
key_file,
|
||||||
SSL_FILETYPE_PEM) <= 0) {
|
SSL_FILETYPE_PEM) != 1) {
|
||||||
failf(data, "unable to set public key file\n");
|
failf(data, "unable to set public key file\n");
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@@ -263,7 +263,6 @@ static int init_ssl=0;
|
|||||||
void Curl_SSL_init(void)
|
void Curl_SSL_init(void)
|
||||||
{
|
{
|
||||||
#ifdef USE_SSLEAY
|
#ifdef USE_SSLEAY
|
||||||
|
|
||||||
/* make sure this is only done once */
|
/* make sure this is only done once */
|
||||||
if(0 != init_ssl)
|
if(0 != init_ssl)
|
||||||
return;
|
return;
|
||||||
@@ -275,9 +274,32 @@ void Curl_SSL_init(void)
|
|||||||
|
|
||||||
/* Setup all the global SSL stuff */
|
/* Setup all the global SSL stuff */
|
||||||
SSLeay_add_ssl_algorithms();
|
SSLeay_add_ssl_algorithms();
|
||||||
|
#else
|
||||||
|
/* SSL disabled, do nothing */
|
||||||
#endif
|
#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.
|
* 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.
|
* 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;
|
struct curl_ssl_session *session;
|
||||||
|
|
||||||
if(data->ssl.session)
|
if(data->state.session)
|
||||||
/* this is just a precaution to prevent multiple inits */
|
/* this is just a precaution to prevent multiple inits */
|
||||||
return CURLE_OK;
|
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));
|
memset(session, 0, amount * sizeof(struct curl_ssl_session));
|
||||||
|
|
||||||
/* store the info in the SSL section */
|
/* store the info in the SSL section */
|
||||||
data->ssl.numsessions = amount;
|
data->set.ssl.numsessions = amount;
|
||||||
data->ssl.session = session;
|
data->state.session = session;
|
||||||
data->ssl.sessionage = 1; /* this is brand new */
|
data->state.sessionage = 1; /* this is brand new */
|
||||||
|
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
@@ -363,19 +368,19 @@ static int Get_SSL_Session(struct connectdata *conn,
|
|||||||
SSL_SESSION **ssl_sessionid)
|
SSL_SESSION **ssl_sessionid)
|
||||||
{
|
{
|
||||||
struct curl_ssl_session *check;
|
struct curl_ssl_session *check;
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
long i;
|
long i;
|
||||||
|
|
||||||
for(i=0; i< data->ssl.numsessions; i++) {
|
for(i=0; i< data->set.ssl.numsessions; i++) {
|
||||||
check = &data->ssl.session[i];
|
check = &data->state.session[i];
|
||||||
if(!check->sessionid)
|
if(!check->sessionid)
|
||||||
/* not session ID means blank entry */
|
/* not session ID means blank entry */
|
||||||
continue;
|
continue;
|
||||||
if(strequal(conn->name, check->name) &&
|
if(strequal(conn->name, check->name) &&
|
||||||
(conn->remote_port == check->remote_port) ) {
|
(conn->remote_port == check->remote_port) ) {
|
||||||
/* yes, we have a session ID! */
|
/* yes, we have a session ID! */
|
||||||
data->ssl.sessionage++; /* increase general age */
|
data->state.sessionage++; /* increase general age */
|
||||||
check->age = data->ssl.sessionage; /* set this as used in this age */
|
check->age = data->state.sessionage; /* set this as used in this age */
|
||||||
*ssl_sessionid = check->sessionid;
|
*ssl_sessionid = check->sessionid;
|
||||||
return FALSE;
|
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
|
* This function is called when the 'data' struct is going away. Close
|
||||||
* down everything and free all resources!
|
* down everything and free all resources!
|
||||||
*/
|
*/
|
||||||
int Curl_SSL_Close_All(struct UrlData *data)
|
int Curl_SSL_Close_All(struct SessionHandle *data)
|
||||||
{
|
{
|
||||||
int i;
|
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 */
|
/* 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 the cache data */
|
||||||
free(data->ssl.session);
|
free(data->state.session);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,8 +437,8 @@ static int Store_SSL_Session(struct connectdata *conn)
|
|||||||
SSL_SESSION *ssl_sessionid;
|
SSL_SESSION *ssl_sessionid;
|
||||||
struct curl_ssl_session *store;
|
struct curl_ssl_session *store;
|
||||||
int i;
|
int i;
|
||||||
struct UrlData *data=conn->data; /* the mother of all structs */
|
struct SessionHandle *data=conn->data; /* the mother of all structs */
|
||||||
int oldest_age=data->ssl.session[0].age; /* zero if unused */
|
int oldest_age=data->state.session[0].age; /* zero if unused */
|
||||||
|
|
||||||
/* ask OpenSSL, say please */
|
/* ask OpenSSL, say please */
|
||||||
ssl_sessionid = SSL_get1_session(conn->ssl.handle);
|
ssl_sessionid = SSL_get1_session(conn->ssl.handle);
|
||||||
@@ -444,27 +451,76 @@ static int Store_SSL_Session(struct connectdata *conn)
|
|||||||
the oldest if necessary) */
|
the oldest if necessary) */
|
||||||
|
|
||||||
/* find an empty slot for us, or find the oldest */
|
/* find an empty slot for us, or find the oldest */
|
||||||
for(i=0; (i<data->ssl.numsessions) && data->ssl.session[i].sessionid; i++) {
|
for(i=0; (i<data->set.ssl.numsessions) && data->state.session[i].sessionid; i++) {
|
||||||
if(data->ssl.session[i].age < oldest_age) {
|
if(data->state.session[i].age < oldest_age) {
|
||||||
oldest_age = data->ssl.session[i].age;
|
oldest_age = data->state.session[i].age;
|
||||||
store = &data->ssl.session[i];
|
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! */
|
/* cache is full, we must "kill" the oldest entry! */
|
||||||
Kill_Single_Session(store);
|
Kill_Single_Session(store);
|
||||||
else
|
else
|
||||||
store = &data->ssl.session[i]; /* use this slot */
|
store = &data->state.session[i]; /* use this slot */
|
||||||
|
|
||||||
/* now init the session struct wisely */
|
/* now init the session struct wisely */
|
||||||
store->sessionid = ssl_sessionid;
|
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->name = strdup(conn->name); /* clone host name */
|
||||||
store->remote_port = conn->remote_port; /* port number */
|
store->remote_port = conn->remote_port; /* port number */
|
||||||
|
|
||||||
return 0;
|
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
|
CURLcode
|
||||||
Curl_SSLConnect(struct connectdata *conn)
|
Curl_SSLConnect(struct connectdata *conn)
|
||||||
@@ -472,11 +528,12 @@ Curl_SSLConnect(struct connectdata *conn)
|
|||||||
CURLcode retcode = CURLE_OK;
|
CURLcode retcode = CURLE_OK;
|
||||||
|
|
||||||
#ifdef USE_SSLEAY
|
#ifdef USE_SSLEAY
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
int err;
|
int err;
|
||||||
char * str;
|
char * str;
|
||||||
SSL_METHOD *req_method;
|
SSL_METHOD *req_method;
|
||||||
SSL_SESSION *ssl_sessionid=NULL;
|
SSL_SESSION *ssl_sessionid=NULL;
|
||||||
|
ASN1_TIME *certdate;
|
||||||
|
|
||||||
/* mark this is being ssl enabled from here on out. */
|
/* mark this is being ssl enabled from here on out. */
|
||||||
conn->ssl.use = TRUE;
|
conn->ssl.use = TRUE;
|
||||||
@@ -484,7 +541,7 @@ Curl_SSLConnect(struct connectdata *conn)
|
|||||||
/* Make funny stuff to get random input */
|
/* Make funny stuff to get random input */
|
||||||
random_the_seed(conn);
|
random_the_seed(conn);
|
||||||
|
|
||||||
switch(data->ssl.version) {
|
switch(data->set.ssl.version) {
|
||||||
default:
|
default:
|
||||||
req_method = SSLv23_client_method();
|
req_method = SSLv23_client_method();
|
||||||
break;
|
break;
|
||||||
@@ -503,21 +560,29 @@ Curl_SSLConnect(struct connectdata *conn)
|
|||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->cert) {
|
if(data->set.cert) {
|
||||||
if (!cert_stuff(conn, data->cert, data->cert)) {
|
if (!cert_stuff(conn, data->set.cert, data->set.cert)) {
|
||||||
/* failf() is already done in cert_stuff() */
|
/* failf() is already done in cert_stuff() */
|
||||||
return CURLE_SSL_CONNECT_ERROR;
|
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_CTX_set_verify(conn->ssl.ctx,
|
||||||
SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
|
SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
|
||||||
SSL_VERIFY_CLIENT_ONCE,
|
SSL_VERIFY_CLIENT_ONCE,
|
||||||
cert_verify_callback);
|
cert_verify_callback);
|
||||||
if (!SSL_CTX_load_verify_locations(conn->ssl.ctx,
|
if (!SSL_CTX_load_verify_locations(conn->ssl.ctx,
|
||||||
data->ssl.CAfile,
|
data->set.ssl.CAfile,
|
||||||
data->ssl.CApath)) {
|
data->set.ssl.CApath)) {
|
||||||
failf(data,"error setting cerficate verify locations\n");
|
failf(data,"error setting cerficate verify locations\n");
|
||||||
return CURLE_SSL_CONNECT_ERROR;
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
@@ -547,7 +612,10 @@ Curl_SSLConnect(struct connectdata *conn)
|
|||||||
SSL_set_fd (conn->ssl.handle, conn->firstsocket);
|
SSL_set_fd (conn->ssl.handle, conn->firstsocket);
|
||||||
err = SSL_connect (conn->ssl.handle);
|
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();
|
err = ERR_get_error();
|
||||||
failf(data, "SSL: %s", ERR_error_string(err, NULL));
|
failf(data, "SSL: %s", ERR_error_string(err, NULL));
|
||||||
return CURLE_SSL_CONNECT_ERROR;
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
@@ -587,23 +655,35 @@ Curl_SSLConnect(struct connectdata *conn)
|
|||||||
infof(data, "\t subject: %s\n", str);
|
infof(data, "\t subject: %s\n", str);
|
||||||
CRYPTO_free(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];
|
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");
|
failf(data, "SSL: unable to obtain common name from peer certificate");
|
||||||
X509_free(conn->ssl.server_cert);
|
X509_free(conn->ssl.server_cert);
|
||||||
return CURLE_SSL_PEER_CERTIFICATE;
|
return CURLE_SSL_PEER_CERTIFICATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!strequal(peer_CN, conn->hostname)) {
|
if (!strequal(peer_CN, conn->hostname)) {
|
||||||
if (data->ssl.verifyhost > 1) {
|
if (data->set.ssl.verifyhost > 1) {
|
||||||
failf(data, "SSL: certificate subject name '%s' does not match target host name '%s'",
|
failf(data, "SSL: certificate subject name '%s' does not match "
|
||||||
|
"target host name '%s'",
|
||||||
peer_CN, conn->hostname);
|
peer_CN, conn->hostname);
|
||||||
X509_free(conn->ssl.server_cert);
|
X509_free(conn->ssl.server_cert);
|
||||||
return CURLE_SSL_PEER_CERTIFICATE;
|
return CURLE_SSL_PEER_CERTIFICATE;
|
||||||
}
|
}
|
||||||
else
|
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
|
else
|
||||||
infof(data, "\t common name: %s (matched)\n", peer_CN);
|
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
|
/* We could do all sorts of certificate verification stuff here before
|
||||||
deallocating the certificate. */
|
deallocating the certificate. */
|
||||||
|
|
||||||
if(data->ssl.verifypeer) {
|
if(data->set.ssl.verifypeer) {
|
||||||
data->ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle);
|
data->set.ssl.certverifyresult=SSL_get_verify_result(conn->ssl.handle);
|
||||||
if (data->ssl.certverifyresult != X509_V_OK) {
|
if (data->set.ssl.certverifyresult != X509_V_OK) {
|
||||||
failf(data, "SSL certificate verify result: %d\n",
|
failf(data, "SSL certificate verify result: %d\n",
|
||||||
data->ssl.certverifyresult);
|
data->set.ssl.certverifyresult);
|
||||||
retcode = CURLE_SSL_PEER_CERTIFICATE;
|
retcode = CURLE_SSL_PEER_CERTIFICATE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
data->ssl.certverifyresult=0;
|
data->set.ssl.certverifyresult=0;
|
||||||
|
|
||||||
X509_free(conn->ssl.server_cert);
|
X509_free(conn->ssl.server_cert);
|
||||||
#else /* USE_SSLEAY */
|
#else /* USE_SSLEAY */
|
||||||
@@ -640,3 +720,11 @@ Curl_SSLConnect(struct connectdata *conn)
|
|||||||
#endif
|
#endif
|
||||||
return retcode;
|
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"
|
#include "urldata.h"
|
||||||
CURLcode Curl_SSLConnect(struct connectdata *conn);
|
CURLcode Curl_SSLConnect(struct connectdata *conn);
|
||||||
|
|
||||||
void Curl_SSL_init(void); /* Global SSL init */
|
void Curl_SSL_init(void); /* Global SSL init */
|
||||||
void Curl_SSL_cleanup(void); /* Global SSL cleanup */
|
void Curl_SSL_cleanup(void); /* Global SSL cleanup */
|
||||||
|
|
||||||
/* init the SSL session ID cache */
|
/* 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 */
|
void Curl_SSL_Close(struct connectdata *conn); /* close a SSL connection */
|
||||||
|
|
||||||
/* tell the SSL stuff to close down all open information regarding
|
/* tell the SSL stuff to close down all open information regarding
|
||||||
connections (and thus session ID caching etc) */
|
connections (and thus session ID caching etc) */
|
||||||
int Curl_SSL_Close_All(struct UrlData *data);
|
int Curl_SSL_Close_All(struct SessionHandle *data);
|
||||||
#endif
|
#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 */
|
return(dlen + (s - src)); /* count does not include NUL */
|
||||||
}
|
}
|
||||||
#endif
|
#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 */
|
#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>
|
#include <errno.h>
|
||||||
|
|
||||||
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
#if defined(WIN32) && !defined(__GNUC__) || defined(__MINGW32__)
|
||||||
#include <winsock.h>
|
#include <winsock2.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#else
|
#else
|
||||||
@@ -105,7 +105,7 @@ void telrcv(struct connectdata *,
|
|||||||
unsigned char *inbuf, /* Data received from socket */
|
unsigned char *inbuf, /* Data received from socket */
|
||||||
int count); /* Number of bytes received */
|
int count); /* Number of bytes received */
|
||||||
|
|
||||||
static void printoption(struct UrlData *data,
|
static void printoption(struct SessionHandle *data,
|
||||||
const char *direction,
|
const char *direction,
|
||||||
int cmd, int option);
|
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_local_option(struct connectdata *, int cmd, int option);
|
||||||
static void set_remote_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);
|
int direction, unsigned char *pointer, int length);
|
||||||
static void suboption(struct connectdata *);
|
static void suboption(struct connectdata *);
|
||||||
|
|
||||||
@@ -152,8 +152,8 @@ struct TELNET {
|
|||||||
int him[256];
|
int him[256];
|
||||||
int himq[256];
|
int himq[256];
|
||||||
int him_preferred[256];
|
int him_preferred[256];
|
||||||
char *subopt_ttype; /* Set with suboption TTYPE */
|
char subopt_ttype[32]; /* Set with suboption TTYPE */
|
||||||
char *subopt_xdisploc; /* Set with suboption XDISPLOC */
|
char subopt_xdisploc[128]; /* Set with suboption XDISPLOC */
|
||||||
struct curl_slist *telnet_vars; /* Environment variables */
|
struct curl_slist *telnet_vars; /* Environment variables */
|
||||||
|
|
||||||
/* suboptions */
|
/* 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 *direction, int cmd, int option)
|
||||||
{
|
{
|
||||||
const char *fmt;
|
const char *fmt;
|
||||||
const char *opt;
|
const char *opt;
|
||||||
|
|
||||||
if (data->bits.verbose)
|
if (data->set.verbose)
|
||||||
{
|
{
|
||||||
if (cmd == IAC)
|
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 '>' */
|
int direction, /* '<' or '>' */
|
||||||
unsigned char *pointer, /* where suboption data is */
|
unsigned char *pointer, /* where suboption data is */
|
||||||
int length) /* length of suboption data */
|
int length) /* length of suboption data */
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
if (data->bits.verbose)
|
if (data->set.verbose)
|
||||||
{
|
{
|
||||||
if (direction)
|
if (direction)
|
||||||
{
|
{
|
||||||
@@ -745,7 +745,7 @@ static int check_telnet_options(struct connectdata *conn)
|
|||||||
char option_keyword[128];
|
char option_keyword[128];
|
||||||
char option_arg[256];
|
char option_arg[256];
|
||||||
char *buf;
|
char *buf;
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
||||||
|
|
||||||
/* Add the user name as an environment variable if it
|
/* 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)
|
if(conn->bits.user_passwd)
|
||||||
{
|
{
|
||||||
char *buf = malloc(256);
|
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->telnet_vars = curl_slist_append(tn->telnet_vars, buf);
|
||||||
|
|
||||||
tn->us_preferred[TELOPT_NEW_ENVIRON] = YES;
|
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",
|
if(sscanf(head->data, "%127[^= ]%*[ =]%255s",
|
||||||
option_keyword, option_arg) == 2) {
|
option_keyword, option_arg) == 2) {
|
||||||
|
|
||||||
/* Terminal type */
|
/* Terminal type */
|
||||||
if(strequal(option_keyword, "TTYPE")) {
|
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;
|
tn->us_preferred[TELOPT_TTYPE] = YES;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Display variable */
|
/* Display variable */
|
||||||
if(strequal(option_keyword, "XDISPLOC")) {
|
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;
|
tn->us_preferred[TELOPT_XDISPLOC] = YES;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -814,7 +816,7 @@ static void suboption(struct connectdata *conn)
|
|||||||
int tmplen;
|
int tmplen;
|
||||||
char varname[128];
|
char varname[128];
|
||||||
char varval[128];
|
char varval[128];
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
||||||
|
|
||||||
printsub(data, '<', (unsigned char *)tn->subbuffer, SB_LEN(tn)+2);
|
printsub(data, '<', (unsigned char *)tn->subbuffer, SB_LEN(tn)+2);
|
||||||
@@ -868,7 +870,7 @@ void telrcv(struct connectdata *conn,
|
|||||||
{
|
{
|
||||||
unsigned char c;
|
unsigned char c;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
struct TELNET *tn = (struct TELNET *)conn->proto.telnet;
|
||||||
|
|
||||||
while(count--)
|
while(count--)
|
||||||
@@ -1031,13 +1033,20 @@ CURLcode Curl_telnet_done(struct connectdata *conn)
|
|||||||
CURLcode Curl_telnet(struct connectdata *conn)
|
CURLcode Curl_telnet(struct connectdata *conn)
|
||||||
{
|
{
|
||||||
CURLcode code;
|
CURLcode code;
|
||||||
struct UrlData *data = conn->data;
|
struct SessionHandle *data = conn->data;
|
||||||
int sockfd = conn->firstsocket;
|
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 readfd;
|
||||||
fd_set keepfd;
|
fd_set keepfd;
|
||||||
|
#endif
|
||||||
bool keepon = TRUE;
|
bool keepon = TRUE;
|
||||||
char *buf = data->buffer;
|
char *buf = data->state.buffer;
|
||||||
ssize_t nread;
|
ssize_t nread;
|
||||||
struct TELNET *tn;
|
struct TELNET *tn;
|
||||||
|
|
||||||
@@ -1051,6 +1060,86 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
|||||||
if(code)
|
if(code)
|
||||||
return 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_ZERO (&readfd); /* clear it */
|
||||||
FD_SET (sockfd, &readfd);
|
FD_SET (sockfd, &readfd);
|
||||||
FD_SET (1, &readfd);
|
FD_SET (1, &readfd);
|
||||||
@@ -1108,6 +1197,15 @@ CURLcode Curl_telnet(struct connectdata *conn)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
/* mark this as "no further transfer wanted" */
|
/* mark this as "no further transfer wanted" */
|
||||||
return Curl_Transfer(conn, -1, -1, FALSE, NULL, -1, NULL);
|
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;
|
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;
|
int writetype;
|
||||||
|
|
||||||
/* the highest fd we use + 1 */
|
/* the highest fd we use + 1 */
|
||||||
struct UrlData *data;
|
struct SessionHandle *data;
|
||||||
struct connectdata *conn = (struct connectdata *)c_conn;
|
struct connectdata *conn = (struct connectdata *)c_conn;
|
||||||
char *buf;
|
char *buf;
|
||||||
int maxfd;
|
int maxfd;
|
||||||
|
|
||||||
data = conn->data; /* there's the root struct */
|
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;
|
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 */
|
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! */
|
/* we want header and/or body, if neither then don't do this! */
|
||||||
if(conn->getheader ||
|
if(conn->getheader ||
|
||||||
!data->bits.no_body) {
|
!data->set.no_body) {
|
||||||
fd_set readfd;
|
fd_set readfd;
|
||||||
fd_set writefd;
|
fd_set writefd;
|
||||||
fd_set rkeepfd;
|
fd_set rkeepfd;
|
||||||
@@ -267,7 +267,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
|
|
||||||
FD_ZERO (&writefd); /* clear it */
|
FD_ZERO (&writefd); /* clear it */
|
||||||
if(conn->writesockfd != -1) {
|
if(conn->writesockfd != -1) {
|
||||||
if (data->bits.expect100header)
|
if (data->set.expect100header)
|
||||||
/* wait with write until we either got 100-continue or a timeout */
|
/* wait with write until we either got 100-continue or a timeout */
|
||||||
write_after_100_header = TRUE;
|
write_after_100_header = TRUE;
|
||||||
else {
|
else {
|
||||||
@@ -350,19 +350,19 @@ Transfer(struct connectdata *c_conn)
|
|||||||
* We enlarge the header buffer if it seems to be too
|
* We enlarge the header buffer if it seems to be too
|
||||||
* smallish
|
* smallish
|
||||||
*/
|
*/
|
||||||
if (hbuflen + (int)str_length >= data->headersize) {
|
if (hbuflen + (int)str_length >= data->state.headersize) {
|
||||||
char *newbuff;
|
char *newbuff;
|
||||||
long newsize=MAX((hbuflen+str_length)*3/2,
|
long newsize=MAX((hbuflen+str_length)*3/2,
|
||||||
data->headersize*2);
|
data->state.headersize*2);
|
||||||
hbufp_index = hbufp - data->headerbuff;
|
hbufp_index = hbufp - data->state.headerbuff;
|
||||||
newbuff = (char *)realloc(data->headerbuff, newsize);
|
newbuff = (char *)realloc(data->state.headerbuff, newsize);
|
||||||
if(!newbuff) {
|
if(!newbuff) {
|
||||||
failf (data, "Failed to alloc memory for big header!");
|
failf (data, "Failed to alloc memory for big header!");
|
||||||
return CURLE_READ_ERROR;
|
return CURLE_READ_ERROR;
|
||||||
}
|
}
|
||||||
data->headersize=newsize;
|
data->state.headersize=newsize;
|
||||||
data->headerbuff = newbuff;
|
data->state.headerbuff = newbuff;
|
||||||
hbufp = data->headerbuff + hbufp_index;
|
hbufp = data->state.headerbuff + hbufp_index;
|
||||||
}
|
}
|
||||||
strcpy (hbufp, str);
|
strcpy (hbufp, str);
|
||||||
hbufp += strlen (str);
|
hbufp += strlen (str);
|
||||||
@@ -378,19 +378,19 @@ Transfer(struct connectdata *c_conn)
|
|||||||
* fit in the allocated header buffer, or else we enlarge
|
* fit in the allocated header buffer, or else we enlarge
|
||||||
* it.
|
* it.
|
||||||
*/
|
*/
|
||||||
if (hbuflen + (str - str_start) >= data->headersize) {
|
if (hbuflen + (str - str_start) >= data->state.headersize) {
|
||||||
char *newbuff;
|
char *newbuff;
|
||||||
long newsize=MAX((hbuflen+(str-str_start))*3/2,
|
long newsize=MAX((hbuflen+(str-str_start))*3/2,
|
||||||
data->headersize*2);
|
data->state.headersize*2);
|
||||||
hbufp_index = hbufp - data->headerbuff;
|
hbufp_index = hbufp - data->state.headerbuff;
|
||||||
newbuff = (char *)realloc(data->headerbuff, newsize);
|
newbuff = (char *)realloc(data->state.headerbuff, newsize);
|
||||||
if(!newbuff) {
|
if(!newbuff) {
|
||||||
failf (data, "Failed to alloc memory for big header!");
|
failf (data, "Failed to alloc memory for big header!");
|
||||||
return CURLE_READ_ERROR;
|
return CURLE_READ_ERROR;
|
||||||
}
|
}
|
||||||
data->headersize= newsize;
|
data->state.headersize= newsize;
|
||||||
data->headerbuff = newbuff;
|
data->state.headerbuff = newbuff;
|
||||||
hbufp = data->headerbuff + hbufp_index;
|
hbufp = data->state.headerbuff + hbufp_index;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* copy to end of line */
|
/* copy to end of line */
|
||||||
@@ -399,7 +399,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
hbuflen += str - str_start;
|
hbuflen += str - str_start;
|
||||||
*hbufp = 0;
|
*hbufp = 0;
|
||||||
|
|
||||||
p = data->headerbuff;
|
p = data->state.headerbuff;
|
||||||
|
|
||||||
/****
|
/****
|
||||||
* We now have a FULL header line that p points to
|
* 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:
|
/* now, only output this if the header AND body are requested:
|
||||||
*/
|
*/
|
||||||
writetype = CLIENTWRITE_HEADER;
|
writetype = CLIENTWRITE_HEADER;
|
||||||
if (data->bits.http_include_header)
|
if (data->set.http_include_header)
|
||||||
writetype |= CLIENTWRITE_BODY;
|
writetype |= CLIENTWRITE_BODY;
|
||||||
|
|
||||||
urg = Curl_client_write(data, writetype, data->headerbuff,
|
urg = Curl_client_write(data, writetype, data->state.headerbuff,
|
||||||
p - data->headerbuff);
|
p - data->state.headerbuff);
|
||||||
if(urg)
|
if(urg)
|
||||||
return urg;
|
return urg;
|
||||||
|
|
||||||
data->header_size += p - data->headerbuff;
|
data->info.header_size += p - data->state.headerbuff;
|
||||||
|
|
||||||
if(!header) {
|
if(!header) {
|
||||||
/*
|
/*
|
||||||
@@ -466,7 +466,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
* If we requested a "no body", this is a good time to get
|
* If we requested a "no body", this is a good time to get
|
||||||
* out and return home.
|
* out and return home.
|
||||||
*/
|
*/
|
||||||
if(data->bits.no_body)
|
if(data->set.no_body)
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
|
|
||||||
if(!conn->bits.close) {
|
if(!conn->bits.close) {
|
||||||
@@ -489,7 +489,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
|
|
||||||
/* We continue reading headers, so reset the line-based
|
/* We continue reading headers, so reset the line-based
|
||||||
header parsing variables hbufp && hbuflen */
|
header parsing variables hbufp && hbuflen */
|
||||||
hbufp = data->headerbuff;
|
hbufp = data->state.headerbuff;
|
||||||
hbuflen = 0;
|
hbuflen = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -516,17 +516,17 @@ Transfer(struct connectdata *c_conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (nc) {
|
if (nc) {
|
||||||
data->progress.httpcode = httpcode;
|
data->info.httpcode = httpcode;
|
||||||
data->progress.httpversion = httpversion;
|
data->info.httpversion = httpversion;
|
||||||
|
|
||||||
/* 404 -> URL not found! */
|
/* 404 -> URL not found! */
|
||||||
if (
|
if (
|
||||||
( ((data->bits.http_follow_location) &&
|
( ((data->set.http_follow_location) &&
|
||||||
(httpcode >= 400))
|
(httpcode >= 400))
|
||||||
||
|
||
|
||||||
(!data->bits.http_follow_location &&
|
(!data->set.http_follow_location &&
|
||||||
(httpcode >= 300)))
|
(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,
|
/* If we have been told to fail hard on HTTP-errors,
|
||||||
here is the check for that: */
|
here is the check for that: */
|
||||||
/* serious error, go home! */
|
/* serious error, go home! */
|
||||||
@@ -624,14 +624,14 @@ Transfer(struct connectdata *c_conn)
|
|||||||
}
|
}
|
||||||
else if(strnequal("Last-Modified:", p,
|
else if(strnequal("Last-Modified:", p,
|
||||||
strlen("Last-Modified:")) &&
|
strlen("Last-Modified:")) &&
|
||||||
(data->timecondition || data->bits.get_filetime) ) {
|
(data->set.timecondition || data->set.get_filetime) ) {
|
||||||
time_t secs=time(NULL);
|
time_t secs=time(NULL);
|
||||||
timeofdoc = curl_getdate(p+strlen("Last-Modified:"), &secs);
|
timeofdoc = curl_getdate(p+strlen("Last-Modified:"), &secs);
|
||||||
if(data->bits.get_filetime)
|
if(data->set.get_filetime)
|
||||||
data->progress.filetime = timeofdoc;
|
data->info.filetime = timeofdoc;
|
||||||
}
|
}
|
||||||
else if ((httpcode >= 300 && httpcode < 400) &&
|
else if ((httpcode >= 300 && httpcode < 400) &&
|
||||||
(data->bits.http_follow_location) &&
|
(data->set.http_follow_location) &&
|
||||||
strnequal("Location:", p, 9)) {
|
strnequal("Location:", p, 9)) {
|
||||||
/* this is the URL that the server advices us to get instead */
|
/* this is the URL that the server advices us to get instead */
|
||||||
char *ptr;
|
char *ptr;
|
||||||
@@ -660,17 +660,17 @@ Transfer(struct connectdata *c_conn)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
writetype = CLIENTWRITE_HEADER;
|
writetype = CLIENTWRITE_HEADER;
|
||||||
if (data->bits.http_include_header)
|
if (data->set.http_include_header)
|
||||||
writetype |= CLIENTWRITE_BODY;
|
writetype |= CLIENTWRITE_BODY;
|
||||||
|
|
||||||
urg = Curl_client_write(data, writetype, p, hbuflen);
|
urg = Curl_client_write(data, writetype, p, hbuflen);
|
||||||
if(urg)
|
if(urg)
|
||||||
return urg;
|
return urg;
|
||||||
|
|
||||||
data->header_size += hbuflen;
|
data->info.header_size += hbuflen;
|
||||||
|
|
||||||
/* reset hbufp pointer && hbuflen */
|
/* reset hbufp pointer && hbuflen */
|
||||||
hbufp = data->headerbuff;
|
hbufp = data->state.headerbuff;
|
||||||
hbuflen = 0;
|
hbuflen = 0;
|
||||||
}
|
}
|
||||||
while (*str); /* header line within buffer */
|
while (*str); /* header line within buffer */
|
||||||
@@ -706,7 +706,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
}
|
}
|
||||||
else if (conn->resume_from &&
|
else if (conn->resume_from &&
|
||||||
!content_range &&
|
!content_range &&
|
||||||
(data->httpreq==HTTPREQ_GET)) {
|
(data->set.httpreq==HTTPREQ_GET)) {
|
||||||
/* we wanted to resume a download, although the server
|
/* we wanted to resume a download, although the server
|
||||||
doesn't seem to support this and we did this with a GET
|
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) */
|
(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.");
|
"byte ranges. Cannot resume.");
|
||||||
return CURLE_HTTP_RANGE_ERROR;
|
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
|
/* A time condition has been set AND no ranges have been
|
||||||
requested. This seems to be what chapter 13.3.4 of
|
requested. This seems to be what chapter 13.3.4 of
|
||||||
RFC 2616 defines to be the correct action for a
|
RFC 2616 defines to be the correct action for a
|
||||||
HTTP/1.1 client */
|
HTTP/1.1 client */
|
||||||
if((timeofdoc > 0) && (data->timevalue > 0)) {
|
if((timeofdoc > 0) && (data->set.timevalue > 0)) {
|
||||||
switch(data->timecondition) {
|
switch(data->set.timecondition) {
|
||||||
case TIMECOND_IFMODSINCE:
|
case TIMECOND_IFMODSINCE:
|
||||||
default:
|
default:
|
||||||
if(timeofdoc < data->timevalue) {
|
if(timeofdoc < data->set.timevalue) {
|
||||||
infof(data,
|
infof(data,
|
||||||
"The requested document is not new enough\n");
|
"The requested document is not new enough\n");
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TIMECOND_IFUNMODSINCE:
|
case TIMECOND_IFUNMODSINCE:
|
||||||
if(timeofdoc > data->timevalue) {
|
if(timeofdoc > data->set.timevalue) {
|
||||||
infof(data,
|
infof(data,
|
||||||
"The requested document is not old enough\n");
|
"The requested document is not old enough\n");
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
@@ -797,14 +797,10 @@ Transfer(struct connectdata *c_conn)
|
|||||||
if((keepon & KEEP_WRITE) && FD_ISSET(conn->writesockfd, &writefd)) {
|
if((keepon & KEEP_WRITE) && FD_ISSET(conn->writesockfd, &writefd)) {
|
||||||
/* write */
|
/* write */
|
||||||
|
|
||||||
char scratch[BUFSIZE * 2];
|
|
||||||
int i, si;
|
int i, si;
|
||||||
size_t bytes_written;
|
size_t bytes_written;
|
||||||
|
|
||||||
if(data->crlf)
|
nread = data->set.fread(buf, 1, conn->upload_bufsize, data->set.in);
|
||||||
buf = data->buffer; /* put it back on the buffer */
|
|
||||||
|
|
||||||
nread = data->fread(buf, 1, conn->upload_bufsize, data->in);
|
|
||||||
|
|
||||||
/* the signed int typecase of nread of for systems that has
|
/* the signed int typecase of nread of for systems that has
|
||||||
unsigned size_t */
|
unsigned size_t */
|
||||||
@@ -818,18 +814,18 @@ Transfer(struct connectdata *c_conn)
|
|||||||
Curl_pgrsSetUploadCounter(data, (double)writebytecount);
|
Curl_pgrsSetUploadCounter(data, (double)writebytecount);
|
||||||
|
|
||||||
/* convert LF to CRLF if so asked */
|
/* convert LF to CRLF if so asked */
|
||||||
if (data->crlf) {
|
if (data->set.crlf) {
|
||||||
for(i = 0, si = 0; i < (int)nread; i++, si++) {
|
for(i = 0, si = 0; i < (int)nread; i++, si++) {
|
||||||
if (buf[i] == 0x0a) {
|
if (buf[i] == 0x0a) {
|
||||||
scratch[si++] = 0x0d;
|
data->state.scratch[si++] = 0x0d;
|
||||||
scratch[si] = 0x0a;
|
data->state.scratch[si] = 0x0a;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
scratch[si] = buf[i];
|
data->state.scratch[si] = buf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nread = si;
|
nread = si;
|
||||||
buf = scratch; /* point to the new buffer */
|
buf = data->state.scratch; /* point to the new buffer */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* write to socket */
|
/* write to socket */
|
||||||
@@ -840,6 +836,8 @@ Transfer(struct connectdata *c_conn)
|
|||||||
failf(data, "Failed uploading data");
|
failf(data, "Failed uploading data");
|
||||||
return CURLE_WRITE_ERROR;
|
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);
|
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",
|
failf (data, "Operation timed out with %d out of %d bytes received",
|
||||||
bytecount, conn->size);
|
bytecount, conn->size);
|
||||||
return CURLE_OPERATION_TIMEOUTED;
|
return CURLE_OPERATION_TIMEOUTED;
|
||||||
@@ -876,7 +874,7 @@ Transfer(struct connectdata *c_conn)
|
|||||||
* returning.
|
* returning.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if(!(data->bits.no_body) && contentlength &&
|
if(!(data->set.no_body) && contentlength &&
|
||||||
(bytecount != contentlength)) {
|
(bytecount != contentlength)) {
|
||||||
failf(data, "transfer closed with %d bytes remaining to read",
|
failf(data, "transfer closed with %d bytes remaining to read",
|
||||||
contentlength-bytecount);
|
contentlength-bytecount);
|
||||||
@@ -898,14 +896,14 @@ Transfer(struct connectdata *c_conn)
|
|||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
CURLcode Curl_perform(struct UrlData *data)
|
CURLcode Curl_perform(struct SessionHandle *data)
|
||||||
{
|
{
|
||||||
CURLcode res;
|
CURLcode res;
|
||||||
struct connectdata *conn=NULL;
|
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! */
|
char *newurl = NULL; /* possibly a new URL to follow to! */
|
||||||
|
|
||||||
if(!data->url)
|
if(!data->change.url)
|
||||||
/* we can't do anything wihout URL */
|
/* we can't do anything wihout URL */
|
||||||
return CURLE_URL_MALFORMAT;
|
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
|
/* 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
|
do it after the *_setopt() calls (that could change the size) but
|
||||||
before any transfer. */
|
before any transfer. */
|
||||||
Curl_SSL_InitSessions(data, data->ssl.numsessions);
|
Curl_SSL_InitSessions(data, data->set.ssl.numsessions);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
data->followlocation=0; /* reset the location-follow counter */
|
data->set.followlocation=0; /* reset the location-follow counter */
|
||||||
data->bits.this_is_a_follow = FALSE; /* reset this */
|
data->state.this_is_a_follow = FALSE; /* reset this */
|
||||||
|
|
||||||
Curl_initinfo(data); /* reset session-specific information "variables" */
|
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
|
port=TRUE; /* by default we use the user set port number even after
|
||||||
a Location: */
|
a Location: */
|
||||||
|
|
||||||
if (data->maxredirs && (data->followlocation >= data->maxredirs)) {
|
if (data->set.maxredirs && (data->set.followlocation >= data->set.maxredirs)) {
|
||||||
failf(data,"Maximum (%d) redirects followed", data->maxredirs);
|
failf(data,"Maximum (%d) redirects followed", data->set.maxredirs);
|
||||||
res=CURLE_TOO_MANY_REDIRECTS;
|
res=CURLE_TOO_MANY_REDIRECTS;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* mark the next request as a followed location: */
|
/* 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
|
/* We are asked to automatically set the previous URL as the
|
||||||
referer when we get the next URL. We pick the ->url field,
|
referer when we get the next URL. We pick the ->url field,
|
||||||
which may or may not be 100% correct */
|
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 */
|
/* If we already have an allocated referer, free this first */
|
||||||
free(data->referer);
|
free(data->change.referer);
|
||||||
}
|
|
||||||
|
|
||||||
data->referer = strdup(data->url);
|
data->change.referer = strdup(data->change.url);
|
||||||
data->free_referer = TRUE; /* yes, free this later */
|
data->change.referer_alloc = TRUE; /* yes, free this later */
|
||||||
data->bits.http_set_referer = TRUE; /* might have been false */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(2 != sscanf(newurl, "%15[^:]://%c", prot, &letter)) {
|
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
|
/* we must make our own copy of the URL to play with, as it may
|
||||||
point to read-only data */
|
point to read-only data */
|
||||||
char *url_clone=strdup(data->url);
|
char *url_clone=strdup(data->change.url);
|
||||||
|
|
||||||
if(!url_clone)
|
if(!url_clone)
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
@@ -1055,16 +1051,16 @@ CURLcode Curl_perform(struct UrlData *data)
|
|||||||
port = FALSE;
|
port = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(data->bits.urlstringalloc)
|
if(data->change.url_alloc)
|
||||||
free(data->url);
|
free(data->change.url);
|
||||||
|
else
|
||||||
|
data->change.url_alloc = TRUE; /* the URL is allocated */
|
||||||
|
|
||||||
/* TBD: set the URL with curl_setopt() */
|
/* TBD: set the URL with curl_setopt() */
|
||||||
data->url = newurl;
|
data->change.url = newurl;
|
||||||
newurl = NULL; /* don't free! */
|
newurl = NULL; /* don't free! */
|
||||||
|
|
||||||
data->bits.urlstringalloc = TRUE; /* the URL is allocated */
|
infof(data, "Follows Location: to new URL: '%s'\n", data->change.url);
|
||||||
|
|
||||||
infof(data, "Follows Location: to new URL: '%s'\n", data->url);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We get here when the HTTP code is 300-399. We need to perform
|
* 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
|
* Discussed on the curl mailing list and posted about on the 26th
|
||||||
* of January 2001.
|
* of January 2001.
|
||||||
*/
|
*/
|
||||||
switch(data->progress.httpcode) {
|
switch(data->info.httpcode) {
|
||||||
case 300: /* Multiple Choices */
|
case 300: /* Multiple Choices */
|
||||||
case 301: /* Moved Permanently */
|
case 301: /* Moved Permanently */
|
||||||
case 306: /* Not used */
|
case 306: /* Not used */
|
||||||
@@ -1103,7 +1099,7 @@ CURLcode Curl_perform(struct UrlData *data)
|
|||||||
case 303: /* See Other */
|
case 303: /* See Other */
|
||||||
/* Disable both types of POSTs, since doing a second POST when
|
/* Disable both types of POSTs, since doing a second POST when
|
||||||
* following isn't what anyone would want! */
|
* 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");
|
infof(data, "Disables POST, goes with GET\n");
|
||||||
break;
|
break;
|
||||||
case 304: /* Not Modified */
|
case 304: /* Not Modified */
|
||||||
@@ -1132,7 +1128,7 @@ CURLcode Curl_perform(struct UrlData *data)
|
|||||||
free(newurl);
|
free(newurl);
|
||||||
|
|
||||||
/* make sure the alarm is switched off! */
|
/* make sure the alarm is switched off! */
|
||||||
if(data->timeout || data->connecttimeout)
|
if(data->set.timeout || data->set.connecttimeout)
|
||||||
myalarm(0);
|
myalarm(0);
|
||||||
|
|
||||||
return res;
|
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$
|
* $Id$
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
CURLcode Curl_perform(struct UrlData *data);
|
CURLcode Curl_perform(struct SessionHandle *data);
|
||||||
|
|
||||||
/* This sets up a forthcoming transfer */
|
/* This sets up a forthcoming transfer */
|
||||||
CURLcode
|
CURLcode
|
||||||
|
|||||||
@@ -27,10 +27,10 @@
|
|||||||
* Prototypes for library-wide functions provided by url.c
|
* Prototypes for library-wide functions provided by url.c
|
||||||
*/
|
*/
|
||||||
|
|
||||||
CURLcode Curl_open(struct UrlData **curl);
|
CURLcode Curl_open(struct SessionHandle **curl);
|
||||||
CURLcode Curl_setopt(struct UrlData *data, CURLoption option, ...);
|
CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option, ...);
|
||||||
CURLcode Curl_close(struct UrlData *data); /* the opposite of curl_open() */
|
CURLcode Curl_close(struct SessionHandle *data); /* the opposite of curl_open() */
|
||||||
CURLcode Curl_connect(struct UrlData *,
|
CURLcode Curl_connect(struct SessionHandle *,
|
||||||
struct connectdata **,
|
struct connectdata **,
|
||||||
bool allow_port);
|
bool allow_port);
|
||||||
CURLcode Curl_do(struct connectdata *);
|
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
|
* In order to be useful for every potential user, curl and libcurl are
|
||||||
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
* dual-licensed under the MPL and the MIT/X-derivate licenses.
|
||||||
@@ -27,10 +27,6 @@
|
|||||||
|
|
||||||
#include "setup.h"
|
#include "setup.h"
|
||||||
|
|
||||||
#ifndef MAXHOSTNAMELEN
|
|
||||||
#define MAXHOSTNAMELEN 256
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PORT_FTP 21
|
#define PORT_FTP 21
|
||||||
#define PORT_TELNET 23
|
#define PORT_TELNET 23
|
||||||
#define PORT_GOPHER 70
|
#define PORT_GOPHER 70
|
||||||
@@ -142,10 +138,9 @@ struct ssl_config_data {
|
|||||||
char *CAfile; /* cerficate to verify peer against */
|
char *CAfile; /* cerficate to verify peer against */
|
||||||
char *random_file; /* path to file containing "random" data */
|
char *random_file; /* path to file containing "random" data */
|
||||||
char *egdsocket; /* path to file containing the EGD daemon socket */
|
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 numsessions; /* SSL session id cache size */
|
||||||
long sessionage; /* number of the most recent session */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@@ -212,7 +207,7 @@ struct ConnectBits {
|
|||||||
*/
|
*/
|
||||||
struct connectdata {
|
struct connectdata {
|
||||||
/**** Fields set when inited and not modified again */
|
/**** 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
|
int connectindex; /* what index in the connects index this particular
|
||||||
struct has */
|
struct has */
|
||||||
|
|
||||||
@@ -348,9 +343,21 @@ struct connectdata {
|
|||||||
void *generic;
|
void *generic;
|
||||||
} proto;
|
} 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 {
|
struct Progress {
|
||||||
long lastshow; /* time() of the last displayed progress meter or NULL to
|
long lastshow; /* time() of the last displayed progress meter or NULL to
|
||||||
force redraw at next call */
|
force redraw at next call */
|
||||||
@@ -368,17 +375,12 @@ struct Progress {
|
|||||||
double dlspeed;
|
double dlspeed;
|
||||||
double ulspeed;
|
double ulspeed;
|
||||||
|
|
||||||
struct timeval start;
|
|
||||||
struct timeval t_startsingle;
|
|
||||||
/* various data stored for possible later report */
|
|
||||||
double t_nslookup;
|
double t_nslookup;
|
||||||
double t_connect;
|
double t_connect;
|
||||||
double t_pretransfer;
|
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
|
#define CURR_TIME 5
|
||||||
|
|
||||||
double speeder[ CURR_TIME ];
|
double speeder[ CURR_TIME ];
|
||||||
@@ -395,9 +397,144 @@ typedef enum {
|
|||||||
HTTPREQ_LAST /* last in list */
|
HTTPREQ_LAST /* last in list */
|
||||||
} Curl_HttpReq;
|
} Curl_HttpReq;
|
||||||
|
|
||||||
/* This struct is for boolean settings that define how to behave during
|
/*
|
||||||
this session. */
|
* Values that are generated, temporary or calculated internally for a
|
||||||
struct Configbits {
|
* "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 get_filetime;
|
||||||
bool tunnel_thru_httpproxy;
|
bool tunnel_thru_httpproxy;
|
||||||
bool ftp_append;
|
bool ftp_append;
|
||||||
@@ -410,186 +547,39 @@ struct Configbits {
|
|||||||
bool http_include_header;
|
bool http_include_header;
|
||||||
bool http_set_referer;
|
bool http_set_referer;
|
||||||
bool http_auto_referer; /* set "correct" referer when following location: */
|
bool http_auto_referer; /* set "correct" referer when following location: */
|
||||||
bool httpproxy;
|
|
||||||
bool no_body;
|
bool no_body;
|
||||||
bool set_port;
|
bool set_port;
|
||||||
bool set_range;
|
|
||||||
bool upload;
|
bool upload;
|
||||||
bool use_netrc;
|
bool use_netrc;
|
||||||
bool verbose;
|
bool verbose;
|
||||||
bool this_is_a_follow; /* this is a followed Location: request */
|
|
||||||
bool krb4; /* kerberos4 connection requested */
|
bool krb4; /* kerberos4 connection requested */
|
||||||
bool proxystringalloc; /* the http proxy string is malloc()'ed */
|
bool reuse_forbid; /* forbidden to be reused, close after use */
|
||||||
bool urlstringalloc; /* the URL string is malloc()'ed */
|
bool reuse_fresh; /* do not re-use an existing connection */
|
||||||
bool reuse_forbid; /* if this is forbidden to be reused, close
|
bool expect100header; /* TRUE if we added Expect: 100-continue */
|
||||||
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 */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* As of April 11, 2000 we're now trying to split up the urldata struct in
|
* In August 2001, this struct was redesigned and is since stricter than
|
||||||
* three different parts:
|
* 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)
|
* From now on, the 'SessionHandle' must only contain data that is set once to
|
||||||
* 1 - No matter how many hosts and requests that are being performed, this
|
* go for many (perhaps) independent connections. Values that are generated or
|
||||||
* goes for all of them.
|
* calculated internally for the "session handle" must be defined within the
|
||||||
*
|
* 'struct urlstate' instead. */
|
||||||
* (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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct UrlData {
|
struct SessionHandle {
|
||||||
/*************** Global - specific items ************/
|
struct UserDefined set; /* values set by the libcurl user */
|
||||||
FILE *err; /* the stderr writes goes here */
|
struct DynamicStatic change; /* possibly modified userdefined data */
|
||||||
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 CookieInfo *cookies; /* the cookies, read from files and servers */
|
||||||
struct Progress progress; /* for all the progress meter data */
|
struct Progress progress; /* for all the progress meter data */
|
||||||
|
struct UrlState state; /* struct for fields used for state info and
|
||||||
#define MAX_CURL_USER_LENGTH 128
|
other dynamic purposes */
|
||||||
#define MAX_CURL_PASSWORD_LENGTH 128
|
struct PureInfo info; /* stats, reports and info data */
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define LIBCURL_NAME "libcurl"
|
#define LIBCURL_NAME "libcurl"
|
||||||
#define LIBCURL_ID LIBCURL_NAME " " LIBCURL_VERSION " " SSL_ID
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -103,3 +103,11 @@ char *curl_version(void)
|
|||||||
|
|
||||||
return version;
|
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.
|
# Constants.
|
||||||
PROGRAM=ltmain.sh
|
PROGRAM=ltmain.sh
|
||||||
PACKAGE=libtool
|
PACKAGE=libtool
|
||||||
VERSION=1.4
|
VERSION=1.4.2
|
||||||
TIMESTAMP=" (1.920 2001/04/24 23:26:18)"
|
TIMESTAMP=" (1.922.2.53 2001/09/11 03:18:52)"
|
||||||
|
|
||||||
default_mode=
|
default_mode=
|
||||||
help="Try \`$progname --help' for more information."
|
help="Try \`$progname --help' for more information."
|
||||||
@@ -84,6 +84,9 @@ if test "${LANG+set}" = set; then
|
|||||||
save_LANG="$LANG"; LANG=C; export LANG
|
save_LANG="$LANG"; LANG=C; export LANG
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Make sure IFS has a sensible default
|
||||||
|
: ${IFS=" "}
|
||||||
|
|
||||||
if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
|
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 "$modename: not configured to build any kind of library" 1>&2
|
||||||
echo "Fatal configuration error. See the $PACKAGE docs for more information." 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
|
exit 1
|
||||||
fi
|
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
|
if test -z "$show_help"; then
|
||||||
|
|
||||||
# Infer the operation mode.
|
# Infer the operation mode.
|
||||||
@@ -329,7 +337,7 @@ if test -z "$show_help"; then
|
|||||||
-Wc,*)
|
-Wc,*)
|
||||||
args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
|
args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"`
|
||||||
lastarg=
|
lastarg=
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=','
|
save_ifs="$IFS"; IFS=','
|
||||||
for arg in $args; do
|
for arg in $args; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
|
|
||||||
@@ -615,6 +623,10 @@ compiler."
|
|||||||
# Now arrange that obj and lo_libobj become the same file
|
# Now arrange that obj and lo_libobj become the same file
|
||||||
$show "(cd $xdir && $LN_S $baseobj $libobj)"
|
$show "(cd $xdir && $LN_S $baseobj $libobj)"
|
||||||
if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then
|
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
|
exit 0
|
||||||
else
|
else
|
||||||
error=$?
|
error=$?
|
||||||
@@ -1031,6 +1043,17 @@ compiler."
|
|||||||
# These systems don't actually have a C library (as such)
|
# These systems don't actually have a C library (as such)
|
||||||
test "X$arg" = "X-lc" && continue
|
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
|
esac
|
||||||
fi
|
fi
|
||||||
deplibs="$deplibs $arg"
|
deplibs="$deplibs $arg"
|
||||||
@@ -1122,7 +1145,7 @@ compiler."
|
|||||||
-Wc,*)
|
-Wc,*)
|
||||||
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
|
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'`
|
||||||
arg=
|
arg=
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=','
|
save_ifs="$IFS"; IFS=','
|
||||||
for flag in $args; do
|
for flag in $args; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
case $flag in
|
case $flag in
|
||||||
@@ -1140,7 +1163,7 @@ compiler."
|
|||||||
-Wl,*)
|
-Wl,*)
|
||||||
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
|
args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'`
|
||||||
arg=
|
arg=
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=','
|
save_ifs="$IFS"; IFS=','
|
||||||
for flag in $args; do
|
for flag in $args; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
case $flag in
|
case $flag in
|
||||||
@@ -1750,7 +1773,7 @@ compiler."
|
|||||||
if test -f "$output_objdir/$soname-def"; then :
|
if test -f "$output_objdir/$soname-def"; then :
|
||||||
else
|
else
|
||||||
$show "extracting exported symbol list from \`$soname'"
|
$show "extracting exported symbol list from \`$soname'"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
eval cmds=\"$extract_expsyms_cmds\"
|
eval cmds=\"$extract_expsyms_cmds\"
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
@@ -1763,7 +1786,7 @@ compiler."
|
|||||||
# Create $newlib
|
# Create $newlib
|
||||||
if test -f "$output_objdir/$newlib"; then :; else
|
if test -f "$output_objdir/$newlib"; then :; else
|
||||||
$show "generating import library for \`$soname'"
|
$show "generating import library for \`$soname'"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
eval cmds=\"$old_archive_from_expsyms_cmds\"
|
eval cmds=\"$old_archive_from_expsyms_cmds\"
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
@@ -2175,7 +2198,7 @@ compiler."
|
|||||||
else
|
else
|
||||||
|
|
||||||
# Parse the version information argument.
|
# Parse the version information argument.
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS=':'
|
save_ifs="$IFS"; IFS=':'
|
||||||
set dummy $vinfo 0 0 0
|
set dummy $vinfo 0 0 0
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
|
|
||||||
@@ -2312,6 +2335,16 @@ compiler."
|
|||||||
if test -z "$vinfo" && test -n "$release"; then
|
if test -z "$vinfo" && test -n "$release"; then
|
||||||
major=
|
major=
|
||||||
verstring="0.0"
|
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
|
if test "$need_version" = no; then
|
||||||
versuffix=
|
versuffix=
|
||||||
else
|
else
|
||||||
@@ -2408,6 +2441,9 @@ compiler."
|
|||||||
*-*-netbsd*)
|
*-*-netbsd*)
|
||||||
# Don't link with libc until the a.out ld.so is fixed.
|
# 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.
|
# Add libc to deplibs on all other systems if necessary.
|
||||||
if test $build_libtool_need_lc = "yes"; then
|
if test $build_libtool_need_lc = "yes"; then
|
||||||
@@ -2784,7 +2820,7 @@ EOF
|
|||||||
export_symbols="$output_objdir/$libname.exp"
|
export_symbols="$output_objdir/$libname.exp"
|
||||||
$run $rm $export_symbols
|
$run $rm $export_symbols
|
||||||
eval cmds=\"$export_symbols_cmds\"
|
eval cmds=\"$export_symbols_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -2860,7 +2896,7 @@ EOF
|
|||||||
else
|
else
|
||||||
eval cmds=\"$archive_cmds\"
|
eval cmds=\"$archive_cmds\"
|
||||||
fi
|
fi
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -2988,7 +3024,7 @@ EOF
|
|||||||
|
|
||||||
output="$obj"
|
output="$obj"
|
||||||
eval cmds=\"$reload_cmds\"
|
eval cmds=\"$reload_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -3024,7 +3060,7 @@ EOF
|
|||||||
reload_objs="$libobjs $reload_conv_objs"
|
reload_objs="$libobjs $reload_conv_objs"
|
||||||
output="$libobj"
|
output="$libobj"
|
||||||
eval cmds=\"$reload_cmds\"
|
eval cmds=\"$reload_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -3287,27 +3323,25 @@ extern \"C\" {
|
|||||||
#undef lt_preloaded_symbols
|
#undef lt_preloaded_symbols
|
||||||
|
|
||||||
#if defined (__STDC__) && __STDC__
|
#if defined (__STDC__) && __STDC__
|
||||||
# define lt_ptr_t void *
|
# define lt_ptr void *
|
||||||
#else
|
#else
|
||||||
# define lt_ptr_t char *
|
# define lt_ptr char *
|
||||||
# define const
|
# define const
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The mapping between symbol names and symbols. */
|
/* The mapping between symbol names and symbols. */
|
||||||
const struct {
|
const struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
lt_ptr_t address;
|
lt_ptr address;
|
||||||
}
|
}
|
||||||
lt_preloaded_symbols[] =
|
lt_preloaded_symbols[] =
|
||||||
{\
|
{\
|
||||||
"
|
"
|
||||||
|
|
||||||
sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \
|
eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms"
|
||||||
-e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \
|
|
||||||
< "$nlist" >> "$output_objdir/$dlsyms"
|
|
||||||
|
|
||||||
$echo >> "$output_objdir/$dlsyms" "\
|
$echo >> "$output_objdir/$dlsyms" "\
|
||||||
{0, (lt_ptr_t) 0}
|
{0, (lt_ptr) 0}
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This works around a problem in FreeBSD linker */
|
/* This works around a problem in FreeBSD linker */
|
||||||
@@ -3618,8 +3652,9 @@ else
|
|||||||
|
|
||||||
# relink executable if necessary
|
# relink executable if necessary
|
||||||
if test -n \"\$relink_command\"; then
|
if test -n \"\$relink_command\"; then
|
||||||
if (eval \$relink_command); then :
|
if relink_command_output=\`eval \$relink_command 2>&1\`; then :
|
||||||
else
|
else
|
||||||
|
$echo \"\$relink_command_output\" >&2
|
||||||
$rm \"\$progdir/\$file\"
|
$rm \"\$progdir/\$file\"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -3790,7 +3825,7 @@ fi\
|
|||||||
|
|
||||||
eval cmds=\"$old_archive_cmds\"
|
eval cmds=\"$old_archive_cmds\"
|
||||||
fi
|
fi
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -4165,7 +4200,7 @@ relink_command=\"$relink_command\""
|
|||||||
# Do each command in the postinstall commands.
|
# Do each command in the postinstall commands.
|
||||||
lib="$destdir/$realname"
|
lib="$destdir/$realname"
|
||||||
eval cmds=\"$postinstall_cmds\"
|
eval cmds=\"$postinstall_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -4352,7 +4387,7 @@ relink_command=\"$relink_command\""
|
|||||||
|
|
||||||
# Do each command in the postinstall commands.
|
# Do each command in the postinstall commands.
|
||||||
eval cmds=\"$old_postinstall_cmds\"
|
eval cmds=\"$old_postinstall_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -4368,11 +4403,10 @@ relink_command=\"$relink_command\""
|
|||||||
if test -n "$current_libdirs"; then
|
if test -n "$current_libdirs"; then
|
||||||
# Maybe just do a dry run.
|
# Maybe just do a dry run.
|
||||||
test -n "$run" && current_libdirs=" -n$current_libdirs"
|
test -n "$run" && current_libdirs=" -n$current_libdirs"
|
||||||
exec $SHELL $0 --finish$current_libdirs
|
exec_cmd='$SHELL $0 --finish$current_libdirs'
|
||||||
exit 1
|
else
|
||||||
fi
|
|
||||||
|
|
||||||
exit 0
|
exit 0
|
||||||
|
fi
|
||||||
;;
|
;;
|
||||||
|
|
||||||
# libtool finish mode
|
# libtool finish mode
|
||||||
@@ -4391,7 +4425,7 @@ relink_command=\"$relink_command\""
|
|||||||
if test -n "$finish_cmds"; then
|
if test -n "$finish_cmds"; then
|
||||||
# Do each command in the finish commands.
|
# Do each command in the finish commands.
|
||||||
eval cmds=\"$finish_cmds\"
|
eval cmds=\"$finish_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -4575,11 +4609,8 @@ relink_command=\"$relink_command\""
|
|||||||
LANG="$save_LANG"; export LANG
|
LANG="$save_LANG"; export LANG
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Now actually exec the command.
|
# Now prepare to actually exec the command.
|
||||||
eval "exec \$cmd$args"
|
exec_cmd='"$cmd"$args'
|
||||||
|
|
||||||
$echo "$modename: cannot exec \$cmd$args"
|
|
||||||
exit 1
|
|
||||||
else
|
else
|
||||||
# Display what would be done.
|
# Display what would be done.
|
||||||
if test -n "$shlibpath_var"; then
|
if test -n "$shlibpath_var"; then
|
||||||
@@ -4670,7 +4701,7 @@ relink_command=\"$relink_command\""
|
|||||||
if test -n "$library_names"; then
|
if test -n "$library_names"; then
|
||||||
# Do each command in the postuninstall commands.
|
# Do each command in the postuninstall commands.
|
||||||
eval cmds=\"$postuninstall_cmds\"
|
eval cmds=\"$postuninstall_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -4685,7 +4716,7 @@ relink_command=\"$relink_command\""
|
|||||||
if test -n "$old_library"; then
|
if test -n "$old_library"; then
|
||||||
# Do each command in the old_postuninstall commands.
|
# Do each command in the old_postuninstall commands.
|
||||||
eval cmds=\"$old_postuninstall_cmds\"
|
eval cmds=\"$old_postuninstall_cmds\"
|
||||||
IFS="${IFS= }"; save_ifs="$IFS"; IFS='~'
|
save_ifs="$IFS"; IFS='~'
|
||||||
for cmd in $cmds; do
|
for cmd in $cmds; do
|
||||||
IFS="$save_ifs"
|
IFS="$save_ifs"
|
||||||
$show "$cmd"
|
$show "$cmd"
|
||||||
@@ -4744,11 +4775,18 @@ relink_command=\"$relink_command\""
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
if test -z "$exec_cmd"; then
|
||||||
$echo "$modename: invalid operation mode \`$mode'" 1>&2
|
$echo "$modename: invalid operation mode \`$mode'" 1>&2
|
||||||
$echo "$generic_help" 1>&2
|
$echo "$generic_help" 1>&2
|
||||||
exit 1
|
exit 1
|
||||||
|
fi
|
||||||
fi # test -z "$show_help"
|
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.
|
# We need to display help for each of the modes.
|
||||||
case $mode in
|
case $mode in
|
||||||
"") $echo \
|
"") $echo \
|
||||||
|
|||||||
@@ -1,6 +1,22 @@
|
|||||||
Revision history for Perl extension Curl::easy.
|
Revision history for Perl extension Curl::easy.
|
||||||
Check out the file README for more info.
|
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>
|
1.1.5 Fri Apr 20 2001: - Cris Bailiff <c.bailiff@devsecure.com>
|
||||||
- Add latest CURLOPT_ and CURLINFO_ constants to the constants list
|
- Add latest CURLOPT_ and CURLINFO_ constants to the constants list
|
||||||
|
|
||||||
|
|||||||
@@ -4,4 +4,13 @@ Makefile.PL
|
|||||||
README
|
README
|
||||||
easy.pm
|
easy.pm
|
||||||
easy.xs
|
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'
|
'INC' => '', # e.g., '-I/usr/include/other'
|
||||||
'clean' => {FILES => "head.out body.out"}
|
'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 test
|
||||||
make install
|
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,
|
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
|
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
|
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.
|
express or implied. Send praise, patches, money, beer and pizza to the author.
|
||||||
Send complaints to /dev/null. ;-)
|
Send complaints to /dev/null. ;-)
|
||||||
|
|
||||||
The author of this software is Georg Horn <horn@koblenz-net.de>
|
The original author of this software is Georg Horn <horn@koblenz-net.de>
|
||||||
Parts of the callback support have been added by Cris Bailiff
|
Parts of the callback support, tests and documentation have been added by
|
||||||
<c.bailiff@awayweb.com> and Forrest Cahoon <forrest.cahoon@merrillcorp.com>
|
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.
|
# Do not simply export all your public functions/methods/constants.
|
||||||
@EXPORT = qw(
|
@EXPORT = qw(
|
||||||
CURLOPT_AUTOREFERER
|
CURLOPT_AUTOREFERER
|
||||||
|
CURLOPT_CAINFO
|
||||||
|
CURLOPT_CLOSEFUNCTION
|
||||||
|
CURLOPT_CLOSEPOLICY
|
||||||
|
CURLOPT_CONNECTTIMEOUT
|
||||||
CURLOPT_COOKIE
|
CURLOPT_COOKIE
|
||||||
CURLOPT_COOKIEFILE
|
CURLOPT_COOKIEFILE
|
||||||
|
CURLOPT_COOKIEJAR
|
||||||
CURLOPT_CRLF
|
CURLOPT_CRLF
|
||||||
CURLOPT_CUSTOMREQUEST
|
CURLOPT_CUSTOMREQUEST
|
||||||
|
CURLOPT_EGDSOCKET
|
||||||
CURLOPT_ERRORBUFFER
|
CURLOPT_ERRORBUFFER
|
||||||
CURLOPT_FAILONERROR
|
CURLOPT_FAILONERROR
|
||||||
CURLOPT_FILE
|
CURLOPT_FILE
|
||||||
|
CURLOPT_FILETIME
|
||||||
CURLOPT_FOLLOWLOCATION
|
CURLOPT_FOLLOWLOCATION
|
||||||
|
CURLOPT_FORBID_REUSE
|
||||||
|
CURLOPT_FRESH_CONNECT
|
||||||
CURLOPT_FTPAPPEND
|
CURLOPT_FTPAPPEND
|
||||||
CURLOPT_FTPASCII
|
CURLOPT_FTPASCII
|
||||||
CURLOPT_FTPLISTONLY
|
CURLOPT_FTPLISTONLY
|
||||||
CURLOPT_FTPPORT
|
CURLOPT_FTPPORT
|
||||||
CURLOPT_HEADER
|
CURLOPT_HEADER
|
||||||
CURLOPT_HEADERFUNCTION
|
CURLOPT_HEADERFUNCTION
|
||||||
|
CURLOPT_HTTPGET
|
||||||
CURLOPT_HTTPHEADER
|
CURLOPT_HTTPHEADER
|
||||||
CURLOPT_HTTPPOST
|
CURLOPT_HTTPPOST
|
||||||
CURLOPT_HTTPPROXYTUNNEL
|
CURLOPT_HTTPPROXYTUNNEL
|
||||||
@@ -40,6 +50,8 @@ CURLOPT_INTERFACE
|
|||||||
CURLOPT_KRB4LEVEL
|
CURLOPT_KRB4LEVEL
|
||||||
CURLOPT_LOW_SPEED_LIMIT
|
CURLOPT_LOW_SPEED_LIMIT
|
||||||
CURLOPT_LOW_SPEED_TIME
|
CURLOPT_LOW_SPEED_TIME
|
||||||
|
CURLOPT_MAXCONNECTS
|
||||||
|
CURLOPT_MAXREDIRS
|
||||||
CURLOPT_MUTE
|
CURLOPT_MUTE
|
||||||
CURLOPT_NETRC
|
CURLOPT_NETRC
|
||||||
CURLOPT_NOBODY
|
CURLOPT_NOBODY
|
||||||
@@ -59,6 +71,7 @@ CURLOPT_PROXYPORT
|
|||||||
CURLOPT_PROXYUSERPWD
|
CURLOPT_PROXYUSERPWD
|
||||||
CURLOPT_PUT
|
CURLOPT_PUT
|
||||||
CURLOPT_QUOTE
|
CURLOPT_QUOTE
|
||||||
|
CURLOPT_RANDOM_FILE
|
||||||
CURLOPT_RANGE
|
CURLOPT_RANGE
|
||||||
CURLOPT_READFUNCTION
|
CURLOPT_READFUNCTION
|
||||||
CURLOPT_REFERER
|
CURLOPT_REFERER
|
||||||
@@ -66,7 +79,11 @@ CURLOPT_RESUME_FROM
|
|||||||
CURLOPT_SSLCERT
|
CURLOPT_SSLCERT
|
||||||
CURLOPT_SSLCERTPASSWD
|
CURLOPT_SSLCERTPASSWD
|
||||||
CURLOPT_SSLVERSION
|
CURLOPT_SSLVERSION
|
||||||
|
CURLOPT_SSL_CIPHER_LIST
|
||||||
|
CURLOPT_SSL_VERIFYHOST
|
||||||
|
CURLOPT_SSL_VERIFYPEER
|
||||||
CURLOPT_STDERR
|
CURLOPT_STDERR
|
||||||
|
CURLOPT_TELNETOPTIONS
|
||||||
CURLOPT_TIMECONDITION
|
CURLOPT_TIMECONDITION
|
||||||
CURLOPT_TIMEOUT
|
CURLOPT_TIMEOUT
|
||||||
CURLOPT_TIMEVALUE
|
CURLOPT_TIMEVALUE
|
||||||
@@ -78,17 +95,7 @@ CURLOPT_USERPWD
|
|||||||
CURLOPT_VERBOSE
|
CURLOPT_VERBOSE
|
||||||
CURLOPT_WRITEFUNCTION
|
CURLOPT_WRITEFUNCTION
|
||||||
CURLOPT_WRITEHEADER
|
CURLOPT_WRITEHEADER
|
||||||
CURLOPT_MAXREDIRS
|
CURLOPT_WRITEINFO
|
||||||
CURLOPT_FILETIME
|
|
||||||
CURLOPT_TELNETOPTIONS
|
|
||||||
CURLOPT_MAXCONNECTS
|
|
||||||
CURLOPT_CLOSEPOLICY
|
|
||||||
CURLOPT_CLOSEFUNCTION
|
|
||||||
CURLOPT_FRESH_CONNECT
|
|
||||||
CURLOPT_FORBID_REUSE
|
|
||||||
CURLOPT_RANDOM_FILE
|
|
||||||
CURLOPT_EGD_SOCKET
|
|
||||||
CURLOPT_CONNECTTIMEOUT
|
|
||||||
|
|
||||||
CURLINFO_EFFECTIVE_URL
|
CURLINFO_EFFECTIVE_URL
|
||||||
CURLINFO_HTTP_CODE
|
CURLINFO_HTTP_CODE
|
||||||
@@ -110,7 +117,7 @@ CURLINFO_CONTENT_LENGTH_UPLOAD
|
|||||||
USE_INTERNAL_VARS
|
USE_INTERNAL_VARS
|
||||||
);
|
);
|
||||||
|
|
||||||
$VERSION = '1.1.5';
|
$VERSION = '1.1.8';
|
||||||
|
|
||||||
$Curl::easy::headers = "";
|
$Curl::easy::headers = "";
|
||||||
$Curl::easy::content = "";
|
$Curl::easy::content = "";
|
||||||
@@ -133,6 +140,8 @@ bootstrap Curl::easy $VERSION;
|
|||||||
__END__
|
__END__
|
||||||
# Below is the stub of documentation for your module. You better edit it!
|
# Below is the stub of documentation for your module. You better edit it!
|
||||||
|
|
||||||
|
=pod
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
||||||
Curl::easy - Perl extension for libcurl
|
Curl::easy - Perl extension for libcurl
|
||||||
@@ -146,12 +155,16 @@ Curl::easy - Perl extension for libcurl
|
|||||||
$CURLcode = Curl::easy::perform($curl);
|
$CURLcode = Curl::easy::perform($curl);
|
||||||
Curl::easy::cleanup($curl);
|
Curl::easy::cleanup($curl);
|
||||||
|
|
||||||
|
Read curl_easy_setopt for details of most CURLoption values
|
||||||
|
|
||||||
=head1 DESCRIPTION
|
=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.
|
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
|
Curl::easy supports the various options of curl_easy_setopt which require either a FILE * or
|
||||||
a callback function.
|
a callback function.
|
||||||
@@ -254,9 +267,20 @@ indicate an error.
|
|||||||
|
|
||||||
Georg Horn <horn@koblenz-net.de>
|
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>
|
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
|
=head1 SEE ALSO
|
||||||
|
|
||||||
http://curl.haxx.se/
|
http://curl.haxx.se/
|
||||||
|
|||||||
@@ -1,4 +1,12 @@
|
|||||||
/* Perl interface for libcurl. Check out the file README for more info. */
|
/* 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 "EXTERN.h"
|
||||||
#include "perl.h"
|
#include "perl.h"
|
||||||
@@ -101,12 +109,14 @@ fwrite_wrapper (const void *ptr,
|
|||||||
|
|
||||||
if (stream == stdout) {
|
if (stream == stdout) {
|
||||||
sv = newSViv(0); /* FIXME: should cast stdout to GLOB somehow? */
|
sv = newSViv(0); /* FIXME: should cast stdout to GLOB somehow? */
|
||||||
|
} else if (stream == NULL) {
|
||||||
|
sv = &PL_sv_undef;
|
||||||
} else { /* its already an SV */
|
} else { /* its already an SV */
|
||||||
sv = stream;
|
sv = stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ptr != NULL) {
|
if (ptr != NULL) {
|
||||||
XPUSHs(sv_2mortal(newSVpvn(ptr, size * nmemb)));
|
XPUSHs(sv_2mortal(newSVpvn((char *)ptr, (STRLEN)(size * nmemb))));
|
||||||
} else {
|
} else {
|
||||||
XPUSHs(sv_2mortal(newSVpv("", 0)));
|
XPUSHs(sv_2mortal(newSVpv("", 0)));
|
||||||
}
|
}
|
||||||
@@ -130,15 +140,20 @@ fwrite_wrapper (const void *ptr,
|
|||||||
} else {
|
} else {
|
||||||
/* default to a normal 'fwrite' */
|
/* default to a normal 'fwrite' */
|
||||||
/* stream could be a FILE * or an SV * */
|
/* stream could be a FILE * or an SV * */
|
||||||
|
/* or NULL since libcurl-7.8.1pre3 */
|
||||||
FILE *f;
|
FILE *f;
|
||||||
|
|
||||||
if (stream == stdout) { /* the only possible FILE ? Think so */
|
if (stream == stdout ||
|
||||||
|
stream == NULL) { /* the only possible FILE ? Think so */
|
||||||
f = stream;
|
f = stream;
|
||||||
} else { /* its a GLOB */
|
} else { /* its a GLOB */
|
||||||
f = IoIFP(sv_2io(stream)); /* may barf if not a GLOB */
|
f = IoIFP(sv_2io(stream)); /* may barf if not a GLOB */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (f)
|
||||||
return fwrite(ptr, size, nmemb, 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) {
|
if (strncmp(name, "CURLOPT_", 8) == 0) {
|
||||||
name += 8;
|
name += 8;
|
||||||
switch (*name) {
|
switch (*name) {
|
||||||
case 'A':
|
#include "curlopt-constants.c"
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (strEQ(name, "USE_INTERNAL_VARS")) return USE_INTERNAL_VARS;
|
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
|
CFLAGS = /I "../include" /nologo /W3 /GX /D "WIN32" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
|
||||||
LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:I386
|
LFLAGS = /nologo /out:$(PROGRAM_NAME) /subsystem:console /machine:I386
|
||||||
LINKLIBS = wsock32.lib libcurl.lib
|
LINKLIBS = ws2_32.lib libcurl.lib
|
||||||
LINKLIBS_DEBUG = wsock32.lib libcurld.lib
|
LINKLIBS_DEBUG = ws2_32.lib libcurld.lib
|
||||||
|
|
||||||
RELEASE_OBJS= \
|
RELEASE_OBJS= \
|
||||||
hugehelpr.obj \
|
hugehelpr.obj \
|
||||||
|
|||||||
@@ -14,6 +14,12 @@
|
|||||||
/* Define if you have the <fcntl.h> header file. */
|
/* Define if you have the <fcntl.h> header file. */
|
||||||
#define HAVE_FCNTL_H 1
|
#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.*
|
* This section is for compiler specific defines.*
|
||||||
*************************************************/
|
*************************************************/
|
||||||
|
|||||||
@@ -10,3 +10,12 @@
|
|||||||
|
|
||||||
/* Define if you have strdup() */
|
/* Define if you have strdup() */
|
||||||
#undef 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>
|
#include <fcntl.h>
|
||||||
#endif
|
#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: */
|
/* The last #include file should be: */
|
||||||
#ifdef MALLOCDEBUG
|
#ifdef MALLOCDEBUG
|
||||||
/* this is low-level hard-hacking memory leak tracking shit */
|
/* this is low-level hard-hacking memory leak tracking shit */
|
||||||
@@ -88,7 +96,6 @@ typedef enum {
|
|||||||
/* Just a set of bits */
|
/* Just a set of bits */
|
||||||
#define CONF_DEFAULT 0
|
#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_AUTO_REFERER (1<<4) /* the automatic referer-system please! */
|
||||||
#define CONF_VERBOSE (1<<5) /* talk a lot */
|
#define CONF_VERBOSE (1<<5) /* talk a lot */
|
||||||
#define CONF_HEADER (1<<8) /* throw the header out too */
|
#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"
|
" --egd-file <file> EGD socket path for random data (SSL)\n"
|
||||||
" -e/--referer Referer page (H)");
|
" -e/--referer Referer page (H)");
|
||||||
puts(" -E/--cert <cert[:passwd]> Specifies your certificate file and password (HTTPS)\n"
|
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"
|
" --connect-timeout <seconds> Maximum time allowed for connection\n"
|
||||||
" -f/--fail Fail silently (no output at all) on errors (H)\n"
|
" -f/--fail Fail silently (no output at all) on errors (H)\n"
|
||||||
" -F/--form <name=content> Specify HTTP POST data (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 When used as the first parameter disables .curlrc\n"
|
||||||
" -Q/--quote <cmd> Send QUOTE command to FTP before file transfer (F)");
|
" -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"
|
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/--silent Silent mode. Don't output anything\n"
|
||||||
" -S/--show-error Show error. With -s, make curl show errors when they occur\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"
|
" --stderr <file> Where to redirect stderr. - means stdout.\n"
|
||||||
@@ -367,6 +376,7 @@ struct LongShort {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct Configurable {
|
struct Configurable {
|
||||||
|
bool remote_time;
|
||||||
char *random_file;
|
char *random_file;
|
||||||
char *egd_file;
|
char *egd_file;
|
||||||
char *useragent;
|
char *useragent;
|
||||||
@@ -404,6 +414,7 @@ struct Configurable {
|
|||||||
struct getout *url_get; /* point to the node to fill in URL */
|
struct getout *url_get; /* point to the node to fill in URL */
|
||||||
struct getout *url_out; /* point to the node to fill in outfile */
|
struct getout *url_out; /* point to the node to fill in outfile */
|
||||||
|
|
||||||
|
char *cipher_list;
|
||||||
char *cert;
|
char *cert;
|
||||||
char *cacert;
|
char *cacert;
|
||||||
char *cert_passwd;
|
char *cert_passwd;
|
||||||
@@ -595,6 +606,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
{"5a", "random-file", TRUE},
|
{"5a", "random-file", TRUE},
|
||||||
{"5b", "egd-file", TRUE},
|
{"5b", "egd-file", TRUE},
|
||||||
{"5c", "connect-timeout", TRUE},
|
{"5c", "connect-timeout", TRUE},
|
||||||
|
{"5d", "ciphers", TRUE},
|
||||||
|
|
||||||
{"2", "sslv2", FALSE},
|
{"2", "sslv2", FALSE},
|
||||||
{"3", "sslv3", FALSE},
|
{"3", "sslv3", FALSE},
|
||||||
@@ -634,6 +646,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
{"q", "disable", FALSE},
|
{"q", "disable", FALSE},
|
||||||
{"Q", "quote", TRUE},
|
{"Q", "quote", TRUE},
|
||||||
{"r", "range", TRUE},
|
{"r", "range", TRUE},
|
||||||
|
{"R", "remote-time", FALSE},
|
||||||
{"s", "silent", FALSE},
|
{"s", "silent", FALSE},
|
||||||
{"S", "show-error", FALSE},
|
{"S", "show-error", FALSE},
|
||||||
{"t", "telnet-options", TRUE},
|
{"t", "telnet-options", TRUE},
|
||||||
@@ -755,6 +768,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
case 'c': /* connect-timeout */
|
case 'c': /* connect-timeout */
|
||||||
config->connecttimeout=atoi(nextarg);
|
config->connecttimeout=atoi(nextarg);
|
||||||
break;
|
break;
|
||||||
|
case 'd': /* ciphers */
|
||||||
|
GetStr(&config->cipher_list, nextarg);
|
||||||
|
break;
|
||||||
default: /* the URL! */
|
default: /* the URL! */
|
||||||
{
|
{
|
||||||
struct getout *url;
|
struct getout *url;
|
||||||
@@ -1055,6 +1071,10 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
|||||||
/* byte range requested */
|
/* byte range requested */
|
||||||
GetStr(&config->range, nextarg);
|
GetStr(&config->range, nextarg);
|
||||||
break;
|
break;
|
||||||
|
case 'R':
|
||||||
|
/* use remote file's time */
|
||||||
|
config->remote_time ^= TRUE;
|
||||||
|
break;
|
||||||
case 's':
|
case 's':
|
||||||
/* don't show progress meter, don't show errors : */
|
/* don't show progress meter, don't show errors : */
|
||||||
config->conf |= (CONF_MUTE|CONF_NOPROGRESS);
|
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);
|
curl_easy_setopt(curl, CURLOPT_SSLCERTPASSWD, config->cert_passwd);
|
||||||
|
|
||||||
if(config->cacert) {
|
if(config->cacert) {
|
||||||
/* available from libcurl 7.5: */
|
|
||||||
curl_easy_setopt(curl, CURLOPT_CAINFO, config->cacert);
|
curl_easy_setopt(curl, CURLOPT_CAINFO, config->cacert);
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, TRUE);
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
|
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2);
|
||||||
@@ -1965,13 +1984,12 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
else
|
else
|
||||||
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
|
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 */
|
/* no body or use remote time */
|
||||||
/* new in 7.5 */
|
|
||||||
curl_easy_setopt(curl, CURLOPT_FILETIME, TRUE);
|
curl_easy_setopt(curl, CURLOPT_FILETIME, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 7.5 news: */
|
|
||||||
if (config->maxredirs)
|
if (config->maxredirs)
|
||||||
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
|
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, config->maxredirs);
|
||||||
else
|
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_EGDSOCKET, config->egd_file);
|
||||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout);
|
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);
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
if(config->writeout) {
|
if(config->writeout) {
|
||||||
@@ -2035,6 +2057,23 @@ operate(struct Configurable *config, int argc, char *argv[])
|
|||||||
free(urlbuffer);
|
free(urlbuffer);
|
||||||
if (outfile && !strequal(outfile, "-") && outs.stream)
|
if (outfile && !strequal(outfile, "-") && outs.stream)
|
||||||
fclose(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)
|
if (config->infile)
|
||||||
fclose(infd);
|
fclose(infd);
|
||||||
if(headerfilep)
|
if(headerfilep)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
#define OS "unknown"
|
#define OS "unknown"
|
||||||
#endif
|
#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);
|
int fileno( FILE *stream);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
#define CURL_NAME "curl"
|
#define CURL_NAME "curl"
|
||||||
#define CURL_VERSION "7.8.2-pre1"
|
#define CURL_VERSION "7.9"
|
||||||
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "
|
#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 \
|
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
|
SUBDIRS = data
|
||||||
|
|
||||||
@@ -12,11 +13,11 @@ curl:
|
|||||||
@(cd ..; make)
|
@(cd ..; make)
|
||||||
|
|
||||||
test:
|
test:
|
||||||
$(MAKE) -C data test
|
@cd data && exec $(MAKE) test
|
||||||
srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl
|
srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl
|
||||||
|
|
||||||
quiet-test:
|
quiet-test:
|
||||||
$(MAKE) -C data test
|
@cd data && exec $(MAKE) test
|
||||||
srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl -s -a
|
srcdir=$(srcdir) $(PERL) $(PERLFLAGS) $(srcdir)/runtests.pl -s -a
|
||||||
|
|
||||||
clean:
|
clean:
|
||||||
|
|||||||
@@ -5,9 +5,11 @@ test:
|
|||||||
[ -f test1 ] || ln -s $(srcdir)/test* .
|
[ -f test1 ] || ln -s $(srcdir)/test* .
|
||||||
|
|
||||||
EXTRA_DIST = \
|
EXTRA_DIST = \
|
||||||
test1 test104 test13 test19 test21 test3 test5 \
|
test1 test106 test113 test120 test15 test201 test3 test44 \
|
||||||
test10 test105 test14 test2 test22 test300 test6 \
|
test10 test107 test114 test121 test16 test202 test300 test5 \
|
||||||
test100 test106 test15 test20 test23 test33 test7 \
|
test100 test108 test115 test122 test17 test21 test301 test6 \
|
||||||
test101 test107 test16 test200 test24 test4 test8 \
|
test101 test109 test116 test123 test18 test22 test302 test7 \
|
||||||
test102 test11 test17 test201 test25 test400 test9 \
|
test102 test11 test117 test124 test19 test23 test33 test8 \
|
||||||
test103 test12 test18 test202 test26 test43 test44
|
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