Compare commits
48 Commits
curl-7_7-b
...
curl-7_7-b
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ea409d0374 | ||
![]() |
eaaa1a1fd4 | ||
![]() |
78b4851da1 | ||
![]() |
38c47803dd | ||
![]() |
455663ba5e | ||
![]() |
efb5d9a403 | ||
![]() |
b1a5208e6b | ||
![]() |
e6dacd92ec | ||
![]() |
952b3a2c0f | ||
![]() |
721f9bca84 | ||
![]() |
ad4d5fabf8 | ||
![]() |
aa860990ad | ||
![]() |
0fa9135d9f | ||
![]() |
8f0114a4dd | ||
![]() |
5980c2977b | ||
![]() |
19f8d71508 | ||
![]() |
6f3bccd911 | ||
![]() |
96f81a5c4a | ||
![]() |
ca05d1b59c | ||
![]() |
895dc5e530 | ||
![]() |
bcc6ca6fd1 | ||
![]() |
d538241a58 | ||
![]() |
71b4b2ffa9 | ||
![]() |
65b4a63f56 | ||
![]() |
ecbee01f4b | ||
![]() |
34fed76a35 | ||
![]() |
0adf0cfde7 | ||
![]() |
d6c456db85 | ||
![]() |
36c88343d3 | ||
![]() |
2360e5ce12 | ||
![]() |
d445eac162 | ||
![]() |
e0a6d20e20 | ||
![]() |
3bb979b897 | ||
![]() |
010daec776 | ||
![]() |
e2b0ad8429 | ||
![]() |
6eed95103a | ||
![]() |
4eb2a165e8 | ||
![]() |
b7fc1e45b5 | ||
![]() |
3395a2fa9e | ||
![]() |
a564a54e21 | ||
![]() |
92186dc3d3 | ||
![]() |
7bd6507eec | ||
![]() |
d4cc810de3 | ||
![]() |
bea7bbee1b | ||
![]() |
fe64570d5d | ||
![]() |
df6ad8d8d6 | ||
![]() |
f8e1fc32de | ||
![]() |
8c6d56f1f9 |
67
CHANGES
67
CHANGES
@@ -6,6 +6,73 @@
|
||||
|
||||
History of Changes
|
||||
|
||||
Version 7.7-beta5
|
||||
|
||||
Daniel (19 March 2001)
|
||||
- Georg Ottinger reported problems with using -C together with -L in the sense
|
||||
that the -C info got lost when it was redirected. I could not repeat this
|
||||
problem on the 7.7 branch why I leave this for the moment. Test case 39 was
|
||||
added to do exactly this, and it seems to do right.
|
||||
|
||||
- Christian Robottom Reis reported how his 7.7 beta didn't successfully do
|
||||
form posts as elegantly as 7.6.1 did. Indeed, this was a flaw in the header
|
||||
engine, as HTTP 1.1 has introduced a new 100 "transient" return code for PUT
|
||||
and POST operations that I need to add support for. Section 8.2.3 in RFC2616
|
||||
has all the details. Seems to work now!
|
||||
|
||||
Daniel (16 March 2001)
|
||||
- After having experienced another machine break-down, we're back.
|
||||
|
||||
- Georg Horn's perl interface Curl::easy is now included in the curl release
|
||||
archive. The perl/ directory is now present. Please help me with docs,
|
||||
examples and updates you think fit.
|
||||
|
||||
- Made a new php/ directory in the release archive and moved the PHP examples
|
||||
into a subdirectory in there. Not much PHP info yet, but I plan to. Please
|
||||
help me here as well!
|
||||
|
||||
- Made libcurl return error if a transfer is aborted in the middle of a
|
||||
"chunk". It actually enables libcurl to discover premature transfer aborts
|
||||
even if the Content-Length: size is unknown.
|
||||
|
||||
Daniel (15 March 2001)
|
||||
- Added --connect-timeout to curl, which sets the new CURLOPT_CONNECTTIMEOUT
|
||||
option in libcurl. It limits the time curl is allowed to spend in the
|
||||
connection phase. This differs from -m/--max-time that limits the entire
|
||||
file transfer operation. Requested by Larry Fahnoe and others.
|
||||
|
||||
I also updated the curl.1 and curl_easy_setopt.3 man pages and removed the
|
||||
item from the TODO.
|
||||
|
||||
Version 7.7-beta4
|
||||
|
||||
Daniel (14 March 2001)
|
||||
- Made curl grok IPv6 with HTTP proxies and got everything to compile nicely
|
||||
again when ENABLE_IPV6 is set.
|
||||
|
||||
I need to remake things in the test suite. I can't test the FTP parts with
|
||||
curl built for IPv6 as it uses a different set of FTP commands then!
|
||||
|
||||
- I fell onto a bug report on php.net (posted by Lars Torben Wilson) that was
|
||||
a report meant for our project. Anyway, it said the .netrc parsing didn't
|
||||
work as supposed, and as I agreed with Lars, I made the netrc parser use
|
||||
getpwuid() to figure out the home directory of the effective user and try
|
||||
that netrc. It still uses the environment variable HOME for those that don't
|
||||
have that function or if the user doesn't return valid pwd info.
|
||||
|
||||
- Edin Kadribaic posted a bug report where he got a crash when a fetch with
|
||||
user+password in the URL followed a Location: to a second URL (absolute,
|
||||
without name+password). This bug has been around for a long while and
|
||||
crashes due to a read at address zero. Fixed now. Wrote test case 38, that
|
||||
tests this.
|
||||
|
||||
- Modified the test suite's httpserver slightly to append all client request
|
||||
data to its log file so that the test script now better can verify a range
|
||||
of requests and not only the last one, as it did previously.
|
||||
|
||||
- Updated the curl man page with --random-file and --egd-file details.
|
||||
|
||||
Version 7.7-beta3
|
||||
|
||||
Daniel (14 March 2001)
|
||||
- Bj<42>rn Stenberg provided similar fixes as J<>rn did and some additional patches
|
||||
|
2
CVS-INFO
2
CVS-INFO
@@ -10,7 +10,7 @@ memanalyze.pl is for analyzing the output generated by curl if -DMALLOCDEBUG
|
||||
|
||||
Makefile.dist is included as the root Makefile in distribution archives
|
||||
|
||||
perl/ is a subdirectory with various perl scripts
|
||||
perl/contrib/ is a subdirectory with various perl scripts
|
||||
|
||||
To build after having extracted everything from CVS, do this:
|
||||
|
||||
|
@@ -8,7 +8,7 @@ EXTRA_DIST = \
|
||||
CHANGES LEGAL maketgz MITX.txt MPL-1.1.txt \
|
||||
config-win32.h reconf packages/README Makefile.dist
|
||||
|
||||
SUBDIRS = docs lib src include tests packages
|
||||
SUBDIRS = docs lib src include tests packages perl php
|
||||
|
||||
# create a root makefile in the distribution:
|
||||
dist-hook:
|
||||
|
@@ -30,16 +30,16 @@ ssl:
|
||||
make
|
||||
|
||||
borland:
|
||||
cd lib; make -f Makefile.b32
|
||||
cd src; make -f Makefile.b32
|
||||
cd lib & make -f Makefile.b32
|
||||
cd src & make -f Makefile.b32
|
||||
|
||||
mingw32:
|
||||
cd lib; make -f Makefile.m32
|
||||
cd src; make -f Makefile.m32
|
||||
cd lib & make -f Makefile.m32
|
||||
cd src & make -f Makefile.m32
|
||||
|
||||
mingw32-ssl:
|
||||
cd lib; make -f Makefile.m32 SSL=1
|
||||
cd src; make -f Makefile.m32 SSL=1
|
||||
cd lib & make -f Makefile.m32 SSL=1
|
||||
cd src & make -f Makefile.m32 SSL=1
|
||||
|
||||
vc:
|
||||
cd lib
|
||||
|
12
configure.in
12
configure.in
@@ -673,6 +673,7 @@ AC_CHECK_HEADERS( \
|
||||
winsock.h \
|
||||
time.h \
|
||||
io.h \
|
||||
pwd.h
|
||||
)
|
||||
|
||||
dnl Check for libz header
|
||||
@@ -746,7 +747,9 @@ AC_CHECK_FUNCS( socket \
|
||||
sigaction \
|
||||
signal \
|
||||
getpass_r \
|
||||
strlcat
|
||||
strlcat \
|
||||
getpwuid \
|
||||
geteuid
|
||||
)
|
||||
|
||||
dnl removed 'getpass' check on October 26, 2000
|
||||
@@ -786,5 +789,10 @@ AC_OUTPUT( Makefile \
|
||||
packages/Linux/Makefile \
|
||||
packages/Linux/RPM/Makefile \
|
||||
packages/Linux/RPM/curl.spec \
|
||||
packages/Linux/RPM/curl-ssl.spec )
|
||||
packages/Linux/RPM/curl-ssl.spec \
|
||||
perl/Makefile \
|
||||
perl/Curl_easy/Makefile \
|
||||
php/Makefile \
|
||||
php/examples/Makefile
|
||||
)
|
||||
|
||||
|
91
docs/INSTALL
91
docs/INSTALL
@@ -10,21 +10,32 @@ Curl has been compiled and built on numerous different operating systems. The
|
||||
way to proceed is mainly divided in two different ways: the unix way or the
|
||||
windows way.
|
||||
|
||||
If you're using Windows (95, 98, NT) or OS/2, you should continue reading from
|
||||
the Win32 or OS/2 headers further down. All other systems should be capable of
|
||||
being installed as described below.
|
||||
If you're using Windows (95/98/NT/ME/2000 or whatever) or OS/2, you should
|
||||
continue reading from the Win32 or OS/2 headers further down. All other
|
||||
systems should be capable of being installed as described below.
|
||||
|
||||
UNIX
|
||||
====
|
||||
|
||||
The configure script *always* tries to find a working SSL library unless
|
||||
explicitly told not to. If you have OpenSSL installed in the default
|
||||
search path for your compiler/linker, you don't need to do anything
|
||||
special:
|
||||
A normal unix installation is made in three or four steps (after you've
|
||||
unpacked the source archive):
|
||||
|
||||
./configure
|
||||
make
|
||||
make test (optional)
|
||||
make install
|
||||
|
||||
If you have OpenSSL installed in /usr/local/ssl, you can run configure
|
||||
You probably need to be root when doing the last command.
|
||||
|
||||
If you want to install curl in a different file hierarchy than /usr/local,
|
||||
you need to specify that already when running configure:
|
||||
|
||||
./configure --prefix=/path/to/curl/tree
|
||||
|
||||
The configure script always tries to find a working SSL library unless
|
||||
explicitly told not to. If you have OpenSSL installed in the default search
|
||||
path for your compiler/linker, you don't need to do anything special. If
|
||||
you have OpenSSL installed in e.g /usr/local/ssl, you can run configure
|
||||
like:
|
||||
|
||||
./configure --with-ssl
|
||||
@@ -54,33 +65,11 @@ UNIX
|
||||
env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
|
||||
./configure
|
||||
|
||||
If your SSL library was compiled with rsaref (usually for use in
|
||||
the United States), you may also need to set:
|
||||
If your SSL library was compiled with rsaref (usually for use in the United
|
||||
States), you may also need to set:
|
||||
|
||||
LIBS=-lRSAglue -lrsaref
|
||||
(from Doug Kaufman <dkaufman@rahul.net>)
|
||||
|
||||
Without SSL support, just run:
|
||||
|
||||
./configure
|
||||
|
||||
Then run:
|
||||
|
||||
make
|
||||
|
||||
Use the executable `curl` in src/ directory.
|
||||
|
||||
To install curl on your system, run
|
||||
|
||||
make install
|
||||
|
||||
This will copy curl to /usr/local/bin/ (or $prefix/bin if you used the
|
||||
--prefix option to configure) and it copies the man pages, the lib and the
|
||||
include files to suitable places.
|
||||
|
||||
To make sure everything runs as supposed, run the test suite:
|
||||
|
||||
make test
|
||||
(as suggested by Doug Kaufman)
|
||||
|
||||
KNOWN PROBLEMS
|
||||
|
||||
@@ -109,7 +98,7 @@ UNIX
|
||||
they're executable and set to appear in the path *BEFORE* the actual (but
|
||||
obsolete) autoconf and autoheader scripts.
|
||||
|
||||
OPTIONS
|
||||
MORE OPTIONS
|
||||
|
||||
Remember, to force configure to use the standard cc compiler if both
|
||||
cc and gcc are present, run configure like
|
||||
@@ -156,29 +145,27 @@ Win32
|
||||
MingW32 (GCC-2.95) style
|
||||
------------------------
|
||||
Run the 'mingw32.bat' file to get the proper environment variables
|
||||
set, then run 'make -f Makefile.m32' in the lib/ dir and then
|
||||
'make -f Makefile.m32' in the src/ dir.
|
||||
set, then run 'make mingw32' in the root dir.
|
||||
|
||||
If you have any problems linking libraries or finding header files,
|
||||
be sure to look at the provided "Makefile.m32" files for the proper
|
||||
If you have any problems linking libraries or finding header files, be
|
||||
sure to verify that the provided "Makefile.m32" files use the proper
|
||||
paths, and adjust as necessary.
|
||||
|
||||
Cygwin style
|
||||
------------
|
||||
Almost identical to the unix installation. Run the configure script
|
||||
in the curl root with 'sh configure'. Make sure you have the sh
|
||||
executable in /bin/ or you'll see the configure fail towards the
|
||||
end.
|
||||
Almost identical to the unix installation. Run the configure script in
|
||||
the curl root with 'sh configure'. Make sure you have the sh
|
||||
executable in /bin/ or you'll see the configure fail towards the end.
|
||||
|
||||
Run 'make'
|
||||
|
||||
Microsoft command line style
|
||||
----------------------------
|
||||
Run the 'vcvars32.bat' file to get the proper environment variables
|
||||
set, then run 'nmake -f Makefile.vc6' in the lib/ dir and then
|
||||
'nmake -f Makefile.vc6' in the src/ dir.
|
||||
set, then run 'nmake vc' in the root dir.
|
||||
|
||||
The vcvars32.bat file is part of the Microsoft development environment.
|
||||
The vcvars32.bat file is part of the Microsoft development
|
||||
environment.
|
||||
|
||||
IDE-style
|
||||
-------------------------
|
||||
@@ -206,26 +193,24 @@ Win32
|
||||
MingW32 (GCC-2.95) style
|
||||
------------------------
|
||||
Run the 'mingw32.bat' file to get the proper environment variables
|
||||
set, then run 'make -f Makefile.m32 SSL=1' in the lib/ dir and then
|
||||
'make -f Makefile.m32 SSL=1' in the src/ dir.
|
||||
set, then run 'make mingw32-ssl' in the root dir.
|
||||
|
||||
If you have any problems linking libraries or finding header files,
|
||||
be sure to look at the provided "Makefile.m32" files for the proper
|
||||
If you have any problems linking libraries or finding header files, be
|
||||
sure to look at the provided "Makefile.m32" files for the proper
|
||||
paths, and adjust as necessary.
|
||||
|
||||
Cygwin style
|
||||
------------
|
||||
|
||||
Haven't done, nor got any reports on how to do. It should although be
|
||||
identical to the unix setup for the same purpose. See above.
|
||||
|
||||
Microsoft command line style
|
||||
----------------------------
|
||||
Run the 'vcvars32.bat' file to get the proper environment variables
|
||||
set, then run 'nmake -f Makefile.vc6 release-ssl' in the lib/ dir and
|
||||
then 'nmake -f Makefile.vc6' in the src/ dir.
|
||||
set, then run 'nmake vc-ssl' in the root dir.
|
||||
|
||||
The vcvars32.bat file is part of the Microsoft development environment.
|
||||
The vcvars32.bat file is part of the Microsoft development
|
||||
environment.
|
||||
|
||||
Microsoft / Borland style
|
||||
-------------------------
|
||||
|
@@ -9,22 +9,18 @@ TODO
|
||||
Things to do in project cURL. Please tell me what you think, contribute and
|
||||
send me patches that improve things!
|
||||
|
||||
To do for the 7.7 release:
|
||||
|
||||
* Add a special connection-timeout that only goes for the connection phase.
|
||||
|
||||
To do for the 7.8 release:
|
||||
|
||||
* Make SSL session ids get used if multiple HTTPS documents from the same
|
||||
host is requested.
|
||||
|
||||
To do in a future release (random order):
|
||||
|
||||
* Document the undocumented libcurl functions: the printf clones (like
|
||||
curl_msprintf, curl_mfprintf, curl_msnprintf, curl_maprintf and
|
||||
curl_mvfprintf), the string compare functions (curl_strequal
|
||||
and curl_strnequal) and the URL escape/unescape functions.
|
||||
|
||||
To do in a future release (random order):
|
||||
|
||||
* Add configure options that disables certain protocols in libcurl to
|
||||
decrease footprint. '--disable-[protocol]' where protocol is http, ftp,
|
||||
telnet, ldap, dict or file.
|
||||
|
41
docs/curl.1
41
docs/curl.1
@@ -2,7 +2,7 @@
|
||||
.\" nroff -man curl.1
|
||||
.\" Written by Daniel Stenberg
|
||||
.\"
|
||||
.TH curl 1 "12 March 2001" "Curl 7.7" "Curl Manual"
|
||||
.TH curl 1 "15 March 2001" "Curl 7.7" "Curl Manual"
|
||||
.SH NAME
|
||||
curl \- get a URL with FTP, TELNET, LDAP, GOPHER, DICT, FILE, HTTP or
|
||||
HTTPS syntax.
|
||||
@@ -91,6 +91,14 @@ also be enforced by using an URL that ends with ";type=A". This option causes
|
||||
data sent to stdout to be in text mode for win32 systems.
|
||||
|
||||
If this option is used twice, the second one will disable ASCII usage.
|
||||
.IP "--connect-timeout <seconds>"
|
||||
Maximum time in seconds that you allow the connection to the server to take.
|
||||
This only limits the connection phase, once curl has connected this option is
|
||||
of no more use. This option doesn't work in win32 systems. See also the
|
||||
.I "--max-time"
|
||||
option.
|
||||
|
||||
If this option is used serveral times, the last one will be used.
|
||||
.IP "-c/--continue"
|
||||
.B Deprecated. Use '-C -' instead.
|
||||
Continue/Resume a previous file transfer. This instructs curl to
|
||||
@@ -111,14 +119,15 @@ HTTP resume is only possible with HTTP/1.1 or later servers.
|
||||
|
||||
If this option is used serveral times, the last one will be used.
|
||||
.IP "-d/--data <data>"
|
||||
(HTTP) Sends the specified data in a POST request to the HTTP server. Note
|
||||
that the data is sent exactly as specified with no extra processing (with all
|
||||
newlines cut off). The data is expected to be "url-encoded". This will cause
|
||||
curl to pass the data to the server using the content-type
|
||||
application/x-www-form-urlencoded. Compare to -F. If more than one -d/--data
|
||||
option is used on the same command line, the data pieces specified will be
|
||||
merged together with a separating &-letter. Thus, using '-d name=daniel -d
|
||||
skill=lousy' would generate a post chunk that looks like
|
||||
(HTTP) Sends the specified data in a POST request to the HTTP server, in a way
|
||||
that can emulate as if a user has filled in a HTML form and pressed the submit
|
||||
button. Note that the data is sent exactly as specified with no extra
|
||||
processing (with all newlines cut off). The data is expected to be
|
||||
"url-encoded". This will cause curl to pass the data to the server using the
|
||||
content-type application/x-www-form-urlencoded. Compare to -F. If more than
|
||||
one -d/--data option is used on the same command line, the data pieces
|
||||
specified will be merged together with a separating &-letter. Thus, using '-d
|
||||
name=daniel -d skill=lousy' would generate a post chunk that looks like
|
||||
'name=daniel&skill=lousy'.
|
||||
|
||||
If you start the data with the letter @, the rest should be a file name to
|
||||
@@ -166,6 +175,11 @@ previous URL when it follows a Location: header. The ";auto" string can be
|
||||
used alone, even if you don't set an initial referer.
|
||||
|
||||
If this option is used serveral times, the last one will be used.
|
||||
.IP "--egd-file <file>"
|
||||
(HTTPS) Specify the path name to the Entropy Gathering Daemon socket. The
|
||||
socket is used to seed the random engine for SSL connections. See also the
|
||||
.I "--random-file"
|
||||
option.
|
||||
.IP "-E/--cert <certificate[:password]>"
|
||||
(HTTPS)
|
||||
Tells curl to use the specified certificate file when getting a file
|
||||
@@ -289,6 +303,9 @@ If this option is used twice, the second will again disable location following.
|
||||
Maximum time in seconds that you allow the whole operation to take. This is
|
||||
useful for preventing your batch jobs from hanging for hours due to slow
|
||||
networks or links going down. This doesn't work fully in win32 systems.
|
||||
See also the
|
||||
.I "--connect-timeout"
|
||||
option.
|
||||
|
||||
If this option is used serveral times, the last one will be used.
|
||||
.IP "-M/--manual"
|
||||
@@ -383,6 +400,12 @@ to be run before and after the transfer. If the server returns failure for one
|
||||
of the commands, the entire operation will be aborted.
|
||||
|
||||
This option can be used multiple times.
|
||||
.IP "--random-file <file>"
|
||||
(HTTPS) Specify the path name to file containing what will be considered as
|
||||
random data. The data is used to seed the random engine for SSL connections.
|
||||
See also the
|
||||
.I "--edg-file"
|
||||
option.
|
||||
.IP "-r/--range <range>"
|
||||
(HTTP/FTP)
|
||||
Retrieve a byte range (i.e a partial document) from a HTTP/1.1 or FTP
|
||||
|
@@ -470,6 +470,15 @@ the more secure will the SSL connection become.
|
||||
.B CURLOPT_FORBID_REUSE
|
||||
Pass a char * to the zero terminated path name to the Entropy Gathering Daemon
|
||||
socket. It will be used to seed the random engine for SSL.
|
||||
.TP
|
||||
.B CURLOPT_CONNECTTIMEOUT
|
||||
Pass a long. It should contain the maximum time in seconds that you allow the
|
||||
connection to the server to take. This only limits the connection phase, once
|
||||
it has connected, this option is of no more use. Set to zero to disable
|
||||
connection timeout (it will then only timeout on the system's internal
|
||||
timeouts). This option doesn't work in win32 systems. See also the
|
||||
.I CURLOPT_TIMEOUT
|
||||
option.
|
||||
.PP
|
||||
.SH RETURN VALUE
|
||||
0 means the option was set properly, non-zero means an error as
|
||||
|
@@ -7,5 +7,4 @@ advantage of libcurl.
|
||||
If you end up with other small but still useful example sources, please mail
|
||||
them for submission in future packages and on the web site.
|
||||
|
||||
There are examples for different languages and environments. Browse around to
|
||||
find those that fit you.
|
||||
Try the php/examples/ directory for PHP programming snippets!
|
||||
|
@@ -425,6 +425,11 @@ typedef enum {
|
||||
/* Set to the Entropy Gathering Daemon socket pathname */
|
||||
CINIT(EGDSOCKET, OBJECTPOINT, 77),
|
||||
|
||||
/* Time-out connect operations after this amount of seconds, if connects
|
||||
are OK within this time, then fine... This only aborts the connect
|
||||
phase. [Only works on unix-style/SIGALRM operating systems] */
|
||||
CINIT(CONNECTTIMEOUT, LONG, 78),
|
||||
|
||||
CURLOPT_LASTENTRY /* the last unusued */
|
||||
} CURLoption;
|
||||
|
||||
@@ -471,7 +476,7 @@ char *curl_getenv(char *variable);
|
||||
char *curl_version(void);
|
||||
|
||||
/* This is the version number */
|
||||
#define LIBCURL_VERSION "7.7-beta3"
|
||||
#define LIBCURL_VERSION "7.7-beta5"
|
||||
#define LIBCURL_VERSION_NUM 0x070700
|
||||
|
||||
/* linked-list structure for the CURLOPT_QUOTE option (and other) */
|
||||
|
@@ -100,7 +100,7 @@ CURLcode Curl_dict(struct connectdata *conn)
|
||||
char *path = conn->path;
|
||||
long *bytecount = &conn->bytecount;
|
||||
|
||||
if(data->bits.user_passwd) {
|
||||
if(conn->bits.user_passwd) {
|
||||
/* AUTH is missing */
|
||||
}
|
||||
|
||||
|
28
lib/ftp.c
28
lib/ftp.c
@@ -77,6 +77,8 @@
|
||||
#include "krb4.h"
|
||||
#endif
|
||||
|
||||
#include "strequal.h"
|
||||
|
||||
#define _MPRINTF_REPLACE /* use our functions only */
|
||||
#include <curl/mprintf.h>
|
||||
|
||||
@@ -549,13 +551,14 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
char *buf = data->buffer; /* this is our buffer */
|
||||
/* for the ftp PORT mode */
|
||||
int portsock=-1;
|
||||
struct sockaddr_in serv_addr;
|
||||
char hostent_buf[8192];
|
||||
#if defined (HAVE_INET_NTOA_R)
|
||||
char ntoa_buf[64];
|
||||
#endif
|
||||
#ifdef ENABLE_IPV6
|
||||
struct addrinfo *ai;
|
||||
#else
|
||||
struct sockaddr_in serv_addr;
|
||||
char hostent_buf[8192];
|
||||
#endif
|
||||
|
||||
struct curl_slist *qitem; /* QUOTE item */
|
||||
@@ -715,20 +718,20 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
#ifdef ENABLE_IPV6
|
||||
struct addrinfo hints, *res, *ai;
|
||||
struct sockaddr_storage ss;
|
||||
int sslen;
|
||||
socklen_t sslen;
|
||||
char hbuf[NI_MAXHOST];
|
||||
char *localaddr;
|
||||
|
||||
struct sockaddr *sa=(struct sockaddr *)&ss;
|
||||
#ifdef NI_WITHSCOPEID
|
||||
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV | NI_WITHSCOPEID;
|
||||
#else
|
||||
const int niflags = NI_NUMERICHOST | NI_NUMERICSERV;
|
||||
#endif
|
||||
unsigned char *ap;
|
||||
unsigned char *pp;
|
||||
char *ap;
|
||||
char *pp;
|
||||
int alen, plen;
|
||||
char portmsgbuf[4096], tmp[4096];
|
||||
char *p;
|
||||
|
||||
char *mode[] = { "EPRT", "LPRT", "PORT", NULL };
|
||||
char **modep;
|
||||
|
||||
@@ -761,13 +764,13 @@ CURLcode _ftp(struct connectdata *conn)
|
||||
continue;
|
||||
|
||||
if (bind(portsock, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||
close(portsock);
|
||||
sclose(portsock);
|
||||
portsock = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (listen(portsock, 1) < 0) {
|
||||
close(portsock);
|
||||
sclose(portsock);
|
||||
portsock = -1;
|
||||
continue;
|
||||
}
|
||||
@@ -878,7 +881,7 @@ again:;
|
||||
}
|
||||
|
||||
if (!*modep) {
|
||||
close(portsock);
|
||||
sclose(portsock);
|
||||
freeaddrinfo(res);
|
||||
return CURLE_FTP_PORT_FAILED;
|
||||
}
|
||||
@@ -1027,9 +1030,10 @@ again:;
|
||||
struct addrinfo *res;
|
||||
#else
|
||||
struct hostent *he;
|
||||
#endif
|
||||
char *str=buf,*ip_addr;
|
||||
char *hostdataptr=NULL;
|
||||
char *ip_addr;
|
||||
#endif
|
||||
char *str=buf;
|
||||
|
||||
/*
|
||||
* New 227-parser June 3rd 1999.
|
||||
|
111
lib/getdate.c
111
lib/getdate.c
@@ -104,6 +104,11 @@
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
||||
# define __attribute__(x)
|
||||
#endif
|
||||
@@ -222,7 +227,7 @@ static int yyRelSeconds;
|
||||
static int yyRelYear;
|
||||
|
||||
|
||||
#line 205 "getdate.y"
|
||||
#line 210 "getdate.y"
|
||||
typedef union {
|
||||
int Number;
|
||||
enum _MERIDIAN Meridian;
|
||||
@@ -305,11 +310,11 @@ static const short yyrhs[] = { -1,
|
||||
|
||||
#if YYDEBUG != 0
|
||||
static const short yyrline[] = { 0,
|
||||
221, 222, 225, 228, 231, 234, 237, 240, 243, 249,
|
||||
255, 264, 270, 282, 285, 288, 294, 298, 302, 308,
|
||||
312, 330, 336, 342, 346, 351, 355, 362, 370, 373,
|
||||
376, 379, 382, 385, 388, 391, 394, 397, 400, 403,
|
||||
406, 409, 412, 415, 418, 421, 424, 429, 462, 466
|
||||
226, 227, 230, 233, 236, 239, 242, 245, 248, 254,
|
||||
260, 269, 275, 287, 290, 293, 299, 303, 307, 313,
|
||||
317, 335, 341, 347, 351, 356, 360, 367, 375, 378,
|
||||
381, 384, 387, 390, 393, 396, 399, 402, 405, 408,
|
||||
411, 414, 417, 420, 423, 426, 429, 434, 467, 471
|
||||
};
|
||||
#endif
|
||||
|
||||
@@ -933,37 +938,37 @@ yyreduce:
|
||||
switch (yyn) {
|
||||
|
||||
case 3:
|
||||
#line 225 "getdate.y"
|
||||
#line 230 "getdate.y"
|
||||
{
|
||||
yyHaveTime++;
|
||||
;
|
||||
break;}
|
||||
case 4:
|
||||
#line 228 "getdate.y"
|
||||
#line 233 "getdate.y"
|
||||
{
|
||||
yyHaveZone++;
|
||||
;
|
||||
break;}
|
||||
case 5:
|
||||
#line 231 "getdate.y"
|
||||
#line 236 "getdate.y"
|
||||
{
|
||||
yyHaveDate++;
|
||||
;
|
||||
break;}
|
||||
case 6:
|
||||
#line 234 "getdate.y"
|
||||
#line 239 "getdate.y"
|
||||
{
|
||||
yyHaveDay++;
|
||||
;
|
||||
break;}
|
||||
case 7:
|
||||
#line 237 "getdate.y"
|
||||
#line 242 "getdate.y"
|
||||
{
|
||||
yyHaveRel++;
|
||||
;
|
||||
break;}
|
||||
case 9:
|
||||
#line 243 "getdate.y"
|
||||
#line 248 "getdate.y"
|
||||
{
|
||||
yyHour = yyvsp[-1].Number;
|
||||
yyMinutes = 0;
|
||||
@@ -972,7 +977,7 @@ case 9:
|
||||
;
|
||||
break;}
|
||||
case 10:
|
||||
#line 249 "getdate.y"
|
||||
#line 254 "getdate.y"
|
||||
{
|
||||
yyHour = yyvsp[-3].Number;
|
||||
yyMinutes = yyvsp[-1].Number;
|
||||
@@ -981,7 +986,7 @@ case 10:
|
||||
;
|
||||
break;}
|
||||
case 11:
|
||||
#line 255 "getdate.y"
|
||||
#line 260 "getdate.y"
|
||||
{
|
||||
yyHour = yyvsp[-3].Number;
|
||||
yyMinutes = yyvsp[-1].Number;
|
||||
@@ -993,7 +998,7 @@ case 11:
|
||||
;
|
||||
break;}
|
||||
case 12:
|
||||
#line 264 "getdate.y"
|
||||
#line 269 "getdate.y"
|
||||
{
|
||||
yyHour = yyvsp[-5].Number;
|
||||
yyMinutes = yyvsp[-3].Number;
|
||||
@@ -1002,7 +1007,7 @@ case 12:
|
||||
;
|
||||
break;}
|
||||
case 13:
|
||||
#line 270 "getdate.y"
|
||||
#line 275 "getdate.y"
|
||||
{
|
||||
yyHour = yyvsp[-5].Number;
|
||||
yyMinutes = yyvsp[-3].Number;
|
||||
@@ -1015,53 +1020,53 @@ case 13:
|
||||
;
|
||||
break;}
|
||||
case 14:
|
||||
#line 282 "getdate.y"
|
||||
#line 287 "getdate.y"
|
||||
{
|
||||
yyTimezone = yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 15:
|
||||
#line 285 "getdate.y"
|
||||
#line 290 "getdate.y"
|
||||
{
|
||||
yyTimezone = yyvsp[0].Number - 60;
|
||||
;
|
||||
break;}
|
||||
case 16:
|
||||
#line 289 "getdate.y"
|
||||
#line 294 "getdate.y"
|
||||
{
|
||||
yyTimezone = yyvsp[-1].Number - 60;
|
||||
;
|
||||
break;}
|
||||
case 17:
|
||||
#line 294 "getdate.y"
|
||||
#line 299 "getdate.y"
|
||||
{
|
||||
yyDayOrdinal = 1;
|
||||
yyDayNumber = yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 18:
|
||||
#line 298 "getdate.y"
|
||||
#line 303 "getdate.y"
|
||||
{
|
||||
yyDayOrdinal = 1;
|
||||
yyDayNumber = yyvsp[-1].Number;
|
||||
;
|
||||
break;}
|
||||
case 19:
|
||||
#line 302 "getdate.y"
|
||||
#line 307 "getdate.y"
|
||||
{
|
||||
yyDayOrdinal = yyvsp[-1].Number;
|
||||
yyDayNumber = yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 20:
|
||||
#line 308 "getdate.y"
|
||||
#line 313 "getdate.y"
|
||||
{
|
||||
yyMonth = yyvsp[-2].Number;
|
||||
yyDay = yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 21:
|
||||
#line 312 "getdate.y"
|
||||
#line 317 "getdate.y"
|
||||
{
|
||||
/* Interpret as YYYY/MM/DD if $1 >= 1000, otherwise as MM/DD/YY.
|
||||
The goal in recognizing YYYY/MM/DD is solely to support legacy
|
||||
@@ -1082,7 +1087,7 @@ case 21:
|
||||
;
|
||||
break;}
|
||||
case 22:
|
||||
#line 330 "getdate.y"
|
||||
#line 335 "getdate.y"
|
||||
{
|
||||
/* ISO 8601 format. yyyy-mm-dd. */
|
||||
yyYear = yyvsp[-2].Number;
|
||||
@@ -1091,7 +1096,7 @@ case 22:
|
||||
;
|
||||
break;}
|
||||
case 23:
|
||||
#line 336 "getdate.y"
|
||||
#line 341 "getdate.y"
|
||||
{
|
||||
/* e.g. 17-JUN-1992. */
|
||||
yyDay = yyvsp[-2].Number;
|
||||
@@ -1100,14 +1105,14 @@ case 23:
|
||||
;
|
||||
break;}
|
||||
case 24:
|
||||
#line 342 "getdate.y"
|
||||
#line 347 "getdate.y"
|
||||
{
|
||||
yyMonth = yyvsp[-1].Number;
|
||||
yyDay = yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 25:
|
||||
#line 346 "getdate.y"
|
||||
#line 351 "getdate.y"
|
||||
{
|
||||
yyMonth = yyvsp[-3].Number;
|
||||
yyDay = yyvsp[-2].Number;
|
||||
@@ -1115,14 +1120,14 @@ case 25:
|
||||
;
|
||||
break;}
|
||||
case 26:
|
||||
#line 351 "getdate.y"
|
||||
#line 356 "getdate.y"
|
||||
{
|
||||
yyMonth = yyvsp[0].Number;
|
||||
yyDay = yyvsp[-1].Number;
|
||||
;
|
||||
break;}
|
||||
case 27:
|
||||
#line 355 "getdate.y"
|
||||
#line 360 "getdate.y"
|
||||
{
|
||||
yyMonth = yyvsp[-1].Number;
|
||||
yyDay = yyvsp[-2].Number;
|
||||
@@ -1130,7 +1135,7 @@ case 27:
|
||||
;
|
||||
break;}
|
||||
case 28:
|
||||
#line 362 "getdate.y"
|
||||
#line 367 "getdate.y"
|
||||
{
|
||||
yyRelSeconds = -yyRelSeconds;
|
||||
yyRelMinutes = -yyRelMinutes;
|
||||
@@ -1141,115 +1146,115 @@ case 28:
|
||||
;
|
||||
break;}
|
||||
case 30:
|
||||
#line 373 "getdate.y"
|
||||
#line 378 "getdate.y"
|
||||
{
|
||||
yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 31:
|
||||
#line 376 "getdate.y"
|
||||
#line 381 "getdate.y"
|
||||
{
|
||||
yyRelYear += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 32:
|
||||
#line 379 "getdate.y"
|
||||
#line 384 "getdate.y"
|
||||
{
|
||||
yyRelYear += yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 33:
|
||||
#line 382 "getdate.y"
|
||||
#line 387 "getdate.y"
|
||||
{
|
||||
yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 34:
|
||||
#line 385 "getdate.y"
|
||||
#line 390 "getdate.y"
|
||||
{
|
||||
yyRelMonth += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 35:
|
||||
#line 388 "getdate.y"
|
||||
#line 393 "getdate.y"
|
||||
{
|
||||
yyRelMonth += yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 36:
|
||||
#line 391 "getdate.y"
|
||||
#line 396 "getdate.y"
|
||||
{
|
||||
yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 37:
|
||||
#line 394 "getdate.y"
|
||||
#line 399 "getdate.y"
|
||||
{
|
||||
yyRelDay += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 38:
|
||||
#line 397 "getdate.y"
|
||||
#line 402 "getdate.y"
|
||||
{
|
||||
yyRelDay += yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 39:
|
||||
#line 400 "getdate.y"
|
||||
#line 405 "getdate.y"
|
||||
{
|
||||
yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 40:
|
||||
#line 403 "getdate.y"
|
||||
#line 408 "getdate.y"
|
||||
{
|
||||
yyRelHour += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 41:
|
||||
#line 406 "getdate.y"
|
||||
#line 411 "getdate.y"
|
||||
{
|
||||
yyRelHour += yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 42:
|
||||
#line 409 "getdate.y"
|
||||
#line 414 "getdate.y"
|
||||
{
|
||||
yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 43:
|
||||
#line 412 "getdate.y"
|
||||
#line 417 "getdate.y"
|
||||
{
|
||||
yyRelMinutes += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 44:
|
||||
#line 415 "getdate.y"
|
||||
#line 420 "getdate.y"
|
||||
{
|
||||
yyRelMinutes += yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 45:
|
||||
#line 418 "getdate.y"
|
||||
#line 423 "getdate.y"
|
||||
{
|
||||
yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 46:
|
||||
#line 421 "getdate.y"
|
||||
#line 426 "getdate.y"
|
||||
{
|
||||
yyRelSeconds += yyvsp[-1].Number * yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 47:
|
||||
#line 424 "getdate.y"
|
||||
#line 429 "getdate.y"
|
||||
{
|
||||
yyRelSeconds += yyvsp[0].Number;
|
||||
;
|
||||
break;}
|
||||
case 48:
|
||||
#line 430 "getdate.y"
|
||||
#line 435 "getdate.y"
|
||||
{
|
||||
if (yyHaveTime && yyHaveDate && !yyHaveRel)
|
||||
yyYear = yyvsp[0].Number;
|
||||
@@ -1282,13 +1287,13 @@ case 48:
|
||||
;
|
||||
break;}
|
||||
case 49:
|
||||
#line 463 "getdate.y"
|
||||
#line 468 "getdate.y"
|
||||
{
|
||||
yyval.Meridian = MER24;
|
||||
;
|
||||
break;}
|
||||
case 50:
|
||||
#line 467 "getdate.y"
|
||||
#line 472 "getdate.y"
|
||||
{
|
||||
yyval.Meridian = yyvsp[0].Meridian;
|
||||
;
|
||||
@@ -1515,7 +1520,7 @@ yyerrhandle:
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
#line 472 "getdate.y"
|
||||
#line 477 "getdate.y"
|
||||
|
||||
|
||||
/* Include this file down here because bison inserts code above which
|
||||
|
@@ -80,6 +80,11 @@
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
|
||||
# define __attribute__(x)
|
||||
#endif
|
||||
|
@@ -66,6 +66,11 @@
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
/* no perror? make an fprintf! */
|
||||
#ifndef HAVE_PERROR
|
||||
# define perror(x) fprintf(stderr, "Error in: %s\n", x)
|
||||
|
18
lib/http.c
18
lib/http.c
@@ -283,7 +283,7 @@ CURLcode Curl_ConnectHTTPProxyTunnel(struct connectdata *conn,
|
||||
"%s"
|
||||
"\r\n",
|
||||
hostname, remote_port,
|
||||
(data->bits.proxy_user_passwd)?conn->allocptr.proxyuserpwd:"",
|
||||
(conn->bits.proxy_user_passwd)?conn->allocptr.proxyuserpwd:"",
|
||||
(data->useragent?conn->allocptr.uagent:"")
|
||||
);
|
||||
|
||||
@@ -340,7 +340,7 @@ CURLcode Curl_http_connect(struct connectdata *conn)
|
||||
return CURLE_SSL_CONNECT_ERROR;
|
||||
}
|
||||
|
||||
if(data->bits.user_passwd && !data->bits.this_is_a_follow) {
|
||||
if(conn->bits.user_passwd && !data->bits.this_is_a_follow) {
|
||||
/* Authorization: is requested, this is not a followed location, get the
|
||||
original host name */
|
||||
data->auth_host = strdup(conn->hostname);
|
||||
@@ -423,7 +423,7 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
conn->allocptr.uagent=NULL;
|
||||
}
|
||||
|
||||
if((data->bits.user_passwd) && !checkheaders(data, "Authorization:")) {
|
||||
if((conn->bits.user_passwd) && !checkheaders(data, "Authorization:")) {
|
||||
char *authorization;
|
||||
|
||||
/* To prevent the user+password to get sent to other than the original
|
||||
@@ -606,10 +606,14 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||
(data->bits.http_post || data->bits.http_formpost)?"POST":
|
||||
(data->bits.http_put)?"PUT":"GET"),
|
||||
ppath,
|
||||
(data->bits.proxy_user_passwd && conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"",
|
||||
(data->bits.user_passwd && conn->allocptr.userpwd)?conn->allocptr.userpwd:"",
|
||||
(data->bits.set_range && conn->allocptr.rangeline)?conn->allocptr.rangeline:"",
|
||||
(data->useragent && *data->useragent && conn->allocptr.uagent)?conn->allocptr.uagent:"",
|
||||
(conn->bits.proxy_user_passwd &&
|
||||
conn->allocptr.proxyuserpwd)?conn->allocptr.proxyuserpwd:"",
|
||||
(conn->bits.user_passwd && conn->allocptr.userpwd)?
|
||||
conn->allocptr.userpwd:"",
|
||||
(data->bits.set_range && conn->allocptr.rangeline)?
|
||||
conn->allocptr.rangeline:"",
|
||||
(data->useragent && *data->useragent && conn->allocptr.uagent)?
|
||||
conn->allocptr.uagent:"",
|
||||
(conn->allocptr.cookie?conn->allocptr.cookie:""), /* Cookie: <data> */
|
||||
(conn->allocptr.host?conn->allocptr.host:""), /* Host: host */
|
||||
http->p_pragma?http->p_pragma:"",
|
||||
|
@@ -70,6 +70,11 @@
|
||||
#include "inet_ntoa_r.h"
|
||||
#endif
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
#define SYS_ERROR -1
|
||||
|
||||
char *Curl_if2ip(char *interface, char *buf, int buf_size)
|
||||
@@ -90,6 +95,7 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size)
|
||||
strcpy(req.ifr_name, interface);
|
||||
req.ifr_addr.sa_family = AF_INET;
|
||||
if (SYS_ERROR == ioctl(dummy, SIOCGIFADDR, &req, sizeof(req))) {
|
||||
sclose(dummy);
|
||||
return NULL;
|
||||
}
|
||||
else {
|
||||
@@ -104,7 +110,7 @@ char *Curl_if2ip(char *interface, char *buf, int buf_size)
|
||||
ip[buf_size - 1] = 0;
|
||||
#endif
|
||||
}
|
||||
close(dummy);
|
||||
sclose(dummy);
|
||||
}
|
||||
return ip;
|
||||
}
|
||||
|
41
lib/netrc.c
41
lib/netrc.c
@@ -27,10 +27,26 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_PWD_H
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
|
||||
|
||||
#include <curl/curl.h>
|
||||
|
||||
#include "strequal.h"
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
/* Debug this single source file with:
|
||||
'make netrc' then run './netrc'!
|
||||
|
||||
@@ -60,7 +76,7 @@ int Curl_parsenetrc(char *host,
|
||||
char netrcbuffer[256];
|
||||
int retcode=1;
|
||||
|
||||
char *home = curl_getenv("HOME"); /* portable environment reader */
|
||||
char *home = NULL;
|
||||
int state=NOTHING;
|
||||
|
||||
char state_login=0;
|
||||
@@ -68,11 +84,25 @@ int Curl_parsenetrc(char *host,
|
||||
|
||||
#define NETRC DOT_CHAR "netrc"
|
||||
|
||||
if(!home)
|
||||
return -1;
|
||||
#if defined(HAVE_GETPWUID) && defined(HAVE_GETEUID)
|
||||
struct passwd *pw;
|
||||
pw= getpwuid(geteuid());
|
||||
if (pw)
|
||||
home = pw->pw_dir;
|
||||
#else
|
||||
void *pw=NULL;
|
||||
#endif
|
||||
|
||||
if(NULL == pw) {
|
||||
home = curl_getenv("HOME"); /* portable environment reader */
|
||||
if(!home) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if(strlen(home)>(sizeof(netrcbuffer)-strlen(NETRC))) {
|
||||
free(home);
|
||||
if(NULL==pw)
|
||||
free(home);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -140,7 +170,8 @@ int Curl_parsenetrc(char *host,
|
||||
fclose(file);
|
||||
}
|
||||
|
||||
free(home);
|
||||
if(NULL==pw)
|
||||
free(home);
|
||||
|
||||
return retcode;
|
||||
}
|
||||
|
@@ -82,6 +82,11 @@
|
||||
|
||||
#include "arpa_telnet.h"
|
||||
|
||||
/* The last #include file should be: */
|
||||
#ifdef MALLOCDEBUG
|
||||
#include "memdebug.h"
|
||||
#endif
|
||||
|
||||
#define SUBBUFSIZE 512
|
||||
|
||||
#define SB_CLEAR(x) x->subpointer = x->subbuffer;
|
||||
@@ -745,7 +750,7 @@ static int check_telnet_options(struct connectdata *conn)
|
||||
|
||||
/* Add the user name as an environment variable if it
|
||||
was given on the command line */
|
||||
if(data->bits.user_passwd)
|
||||
if(conn->bits.user_passwd)
|
||||
{
|
||||
char *buf = malloc(256);
|
||||
sprintf(buf, "USER,%s", data->user);
|
||||
|
@@ -127,7 +127,7 @@ Transfer(struct connectdata *c_conn)
|
||||
bool content_range = FALSE; /* set TRUE if Content-Range: was found */
|
||||
int offset = 0; /* possible resume offset read from the
|
||||
Content-Range: header */
|
||||
int code = 0; /* error code from the 'HTTP/1.? XXX' line */
|
||||
int httpcode = 0; /* error code from the 'HTTP/1.? XXX' line */
|
||||
int httpversion = -1; /* the last digit in the HTTP/1.1 string */
|
||||
|
||||
/* for the low speed checks: */
|
||||
@@ -181,7 +181,7 @@ Transfer(struct connectdata *c_conn)
|
||||
int keepon=0;
|
||||
|
||||
/* timeout every X second
|
||||
- makes a better progressmeter (i.e even when no data is read, the
|
||||
- makes a better progress meter (i.e even when no data is read, the
|
||||
meter can be updated and reflect reality)
|
||||
- allows removal of the alarm() crap
|
||||
- variable timeout is easier
|
||||
@@ -310,8 +310,11 @@ Transfer(struct connectdata *c_conn)
|
||||
/* we now have a full line that p points to */
|
||||
if (('\n' == *p) || ('\r' == *p)) {
|
||||
/* Zero-length line means end of header! */
|
||||
#if 0
|
||||
if (-1 != conn->size) /* if known */
|
||||
conn->size += bytecount; /* we append the already read size */
|
||||
conn->size += bytecount; /* we append the already read
|
||||
size */
|
||||
#endif
|
||||
|
||||
|
||||
if ('\r' == *p)
|
||||
@@ -321,7 +324,20 @@ Transfer(struct connectdata *c_conn)
|
||||
#if 0 /* headers are not included in the size */
|
||||
Curl_pgrsSetDownloadSize(data, conn->size);
|
||||
#endif
|
||||
header = FALSE; /* no more header to parse! */
|
||||
|
||||
if(100 == httpcode) {
|
||||
/*
|
||||
* we have made a HTTP PUT or POST and this is 1.1-lingo
|
||||
* that tells us that the server is OK with this and ready
|
||||
* to receive our stuff.
|
||||
* However, we'll get more headers now so we must get
|
||||
* back into the header-parsing state!
|
||||
*/
|
||||
header = TRUE;
|
||||
headerline = 0; /* we restart the header line counter */
|
||||
}
|
||||
else
|
||||
header = FALSE; /* no more header to parse! */
|
||||
|
||||
/* now, only output this if the header AND body are requested:
|
||||
*/
|
||||
@@ -336,29 +352,38 @@ Transfer(struct connectdata *c_conn)
|
||||
|
||||
data->header_size += p - data->headerbuff;
|
||||
|
||||
if(!header) {
|
||||
/*
|
||||
* end-of-headers.
|
||||
*
|
||||
* If we requested a "no body" and this isn't a "close"
|
||||
* connection, this is a good time to get out and return
|
||||
* home.
|
||||
*/
|
||||
if(!conn->bits.close && data->bits.no_body)
|
||||
return CURLE_OK;
|
||||
break; /* exit header line loop */
|
||||
}
|
||||
|
||||
/*
|
||||
* end-of-headers.
|
||||
*
|
||||
* If we requested a "no body" and this isn't a "close"
|
||||
* connection, this is a good time to get out and return
|
||||
* home.
|
||||
*/
|
||||
if(!conn->bits.close && data->bits.no_body)
|
||||
return CURLE_OK;
|
||||
|
||||
break; /* exit header line loop */
|
||||
/* We continue reading headers, so reset the line-based
|
||||
header parsing variables hbufp && hbuflen */
|
||||
hbufp = data->headerbuff;
|
||||
hbuflen = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!headerline++) {
|
||||
/* This is the first header, it MUST be the error code line
|
||||
or else we consiser this to be the body right away! */
|
||||
if (2 == sscanf (p, " HTTP/1.%d %3d", &httpversion, &code)) {
|
||||
if (2 == sscanf (p, " HTTP/1.%d %3d", &httpversion,
|
||||
&httpcode)) {
|
||||
/* 404 -> URL not found! */
|
||||
if (
|
||||
( ((data->bits.http_follow_location) && (code >= 400))
|
||||
( ((data->bits.http_follow_location) &&
|
||||
(httpcode >= 400))
|
||||
||
|
||||
(!data->bits.http_follow_location && (code >= 300)))
|
||||
(!data->bits.http_follow_location &&
|
||||
(httpcode >= 300)))
|
||||
&& (data->bits.http_fail_on_error)) {
|
||||
/* If we have been told to fail hard on HTTP-errors,
|
||||
here is the check for that: */
|
||||
@@ -366,7 +391,7 @@ Transfer(struct connectdata *c_conn)
|
||||
failf (data, "The requested file was not found");
|
||||
return CURLE_HTTP_NOT_FOUND;
|
||||
}
|
||||
data->progress.httpcode = code;
|
||||
data->progress.httpcode = httpcode;
|
||||
data->progress.httpversion = httpversion;
|
||||
if(httpversion == 0)
|
||||
/* Default action for HTTP/1.0 must be to close, unless
|
||||
@@ -447,7 +472,7 @@ Transfer(struct connectdata *c_conn)
|
||||
if(data->bits.get_filetime)
|
||||
data->progress.filetime = timeofdoc;
|
||||
}
|
||||
else if ((code >= 300 && code < 400) &&
|
||||
else if ((httpcode >= 300 && httpcode < 400) &&
|
||||
(data->bits.http_follow_location) &&
|
||||
strnequal("Location: ", p, 10)) {
|
||||
/* this is the URL that the server advices us to get instead */
|
||||
@@ -689,6 +714,11 @@ Transfer(struct connectdata *c_conn)
|
||||
contentlength-bytecount);
|
||||
return CURLE_PARTIAL_FILE;
|
||||
}
|
||||
else if(conn->bits.chunk && conn->proto.http->chunk.datasize) {
|
||||
failf(data, "transfer closed with at least %d bytes remaining",
|
||||
conn->proto.http->chunk.datasize);
|
||||
return CURLE_PARTIAL_FILE;
|
||||
}
|
||||
if(Curl_pgrsUpdate(data))
|
||||
return CURLE_ABORTED_BY_CALLBACK;
|
||||
|
||||
|
129
lib/url.c
129
lib/url.c
@@ -122,6 +122,19 @@ static unsigned int ConnectionStore(struct UrlData *data,
|
||||
struct connectdata *conn);
|
||||
|
||||
|
||||
#if !defined(WIN32)||defined(__CYGWIN32__)
|
||||
#ifndef RETSIGTYPE
|
||||
#define RETSIGTYPE void
|
||||
#endif
|
||||
static
|
||||
RETSIGTYPE alarmfunc(int signal)
|
||||
{
|
||||
/* this is for "-ansi -Wall -pedantic" to stop complaining! (rabe) */
|
||||
(void)signal;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
CURLcode Curl_close(CURL *curl)
|
||||
{
|
||||
struct UrlData *data=(struct UrlData *)curl;
|
||||
@@ -186,6 +199,9 @@ CURLcode Curl_open(CURL **curl, char *url)
|
||||
{
|
||||
/* We don't yet support specifying the URL at this point */
|
||||
struct UrlData *data;
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction sigact;
|
||||
#endif
|
||||
|
||||
/* Very simple start-up: alloc the struct, init it with zeroes and return */
|
||||
data = (struct UrlData *)malloc(sizeof(struct UrlData));
|
||||
@@ -234,6 +250,26 @@ CURLcode Curl_open(CURL **curl, char *url)
|
||||
memset(data->connects, 0, sizeof(struct connectdata *)*data->numconnects);
|
||||
|
||||
*curl = data;
|
||||
|
||||
/*************************************************************
|
||||
* Set signal handler
|
||||
*************************************************************/
|
||||
#ifdef HAVE_SIGACTION
|
||||
sigaction(SIGALRM, NULL, &sigact);
|
||||
sigact.sa_handler = alarmfunc;
|
||||
#ifdef SA_RESTART
|
||||
/* HPUX doesn't have SA_RESTART but defaults to that behaviour! */
|
||||
sigact.sa_flags &= ~SA_RESTART;
|
||||
#endif
|
||||
sigaction(SIGALRM, &sigact, NULL);
|
||||
#else
|
||||
/* no sigaction(), revert to the much lamer signal() */
|
||||
#ifdef HAVE_SIGNAL
|
||||
signal(SIGALRM, alarmfunc);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
@@ -595,6 +631,12 @@ CURLcode Curl_setopt(CURL *curl, CURLoption option, ...)
|
||||
*/
|
||||
data->timeout = va_arg(param, long);
|
||||
break;
|
||||
case CURLOPT_CONNECTTIMEOUT:
|
||||
/*
|
||||
* The maximum time you allow curl to use to connect.
|
||||
*/
|
||||
data->connecttimeout = va_arg(param, long);
|
||||
break;
|
||||
case CURLOPT_MAXREDIRS:
|
||||
/*
|
||||
* The maximum amount of hops you allow curl to follow Location:
|
||||
@@ -613,7 +655,6 @@ CURLcode Curl_setopt(CURL *curl, CURLoption option, ...)
|
||||
* user:password to use in the operation
|
||||
*/
|
||||
data->userpwd = va_arg(param, char *);
|
||||
data->bits.user_passwd = data->userpwd?1:0;
|
||||
break;
|
||||
case CURLOPT_POSTQUOTE:
|
||||
/*
|
||||
@@ -657,7 +698,6 @@ CURLcode Curl_setopt(CURL *curl, CURLoption option, ...)
|
||||
* user:password needed to use the proxy
|
||||
*/
|
||||
data->proxyuserpwd = va_arg(param, char *);
|
||||
data->bits.proxy_user_passwd = data->proxyuserpwd?1:0;
|
||||
break;
|
||||
case CURLOPT_RANGE:
|
||||
/*
|
||||
@@ -750,29 +790,16 @@ CURLcode Curl_setopt(CURL *curl, CURLoption option, ...)
|
||||
return CURLE_OK;
|
||||
}
|
||||
|
||||
#if !defined(WIN32)||defined(__CYGWIN32__)
|
||||
#ifndef RETSIGTYPE
|
||||
#define RETSIGTYPE void
|
||||
#endif
|
||||
static
|
||||
RETSIGTYPE alarmfunc(int signal)
|
||||
{
|
||||
/* this is for "-ansi -Wall -pedantic" to stop complaining! (rabe) */
|
||||
(void)signal;
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
CURLcode Curl_disconnect(struct connectdata *conn)
|
||||
{
|
||||
if(!conn)
|
||||
return CURLE_OK; /* this is closed and fine already */
|
||||
|
||||
infof(conn->data, "Closing live connection (#%d)\n", conn->connectindex);
|
||||
|
||||
if(-1 != conn->connectindex)
|
||||
if(-1 != conn->connectindex) {
|
||||
/* unlink ourselves! */
|
||||
infof(conn->data, "Closing live connection (#%d)\n", conn->connectindex);
|
||||
conn->data->connects[conn->connectindex] = NULL;
|
||||
}
|
||||
|
||||
if(conn->curl_disconnect)
|
||||
/* This is set if protocol-specific cleanups should be made */
|
||||
@@ -1164,12 +1191,14 @@ static CURLcode ConnectPlease(struct UrlData *data,
|
||||
#ifdef ENABLE_IPV6
|
||||
conn->firstsocket = -1;
|
||||
for (ai = conn->hp; ai; ai = ai->ai_next) {
|
||||
conn->firstsocket = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
|
||||
conn->firstsocket = socket(ai->ai_family,
|
||||
ai->ai_socktype,
|
||||
ai->ai_protocol);
|
||||
if (conn->firstsocket < 0)
|
||||
continue;
|
||||
|
||||
if (connect(conn->firstsocket, ai->ai_addr, ai->ai_addrlen) < 0) {
|
||||
close(conn->firstsocket);
|
||||
sclose(conn->firstsocket);
|
||||
conn->firstsocket = -1;
|
||||
continue;
|
||||
}
|
||||
@@ -1246,9 +1275,6 @@ static CURLcode Connect(struct UrlData *data,
|
||||
struct connectdata *conn;
|
||||
struct connectdata *conn_temp;
|
||||
char endbracket;
|
||||
#ifdef HAVE_SIGACTION
|
||||
struct sigaction sigact;
|
||||
#endif
|
||||
int urllen;
|
||||
|
||||
/*************************************************************
|
||||
@@ -1288,10 +1314,15 @@ static CURLcode Connect(struct UrlData *data,
|
||||
connections, so we set this to force-close. Protocols that support
|
||||
this need to set this to FALSE in their "curl_do" functions. */
|
||||
conn->bits.close = TRUE;
|
||||
|
||||
/* inherite initial knowledge from the data struct */
|
||||
conn->bits.user_passwd = data->userpwd?1:0;
|
||||
conn->bits.proxy_user_passwd = data->proxyuserpwd?1:0;
|
||||
|
||||
/* Store creation time to help future close decision making */
|
||||
conn->created = Curl_tvnow();
|
||||
|
||||
|
||||
/***********************************************************
|
||||
* We need to allocate memory to store the path in. We get the size of the
|
||||
* full URL to be sure, and we need to make it at least 256 bytes since
|
||||
@@ -1383,30 +1414,11 @@ static CURLcode Connect(struct UrlData *data,
|
||||
|
||||
buf = data->buffer; /* this is our buffer */
|
||||
|
||||
/*************************************************************
|
||||
* Set signal handler
|
||||
*************************************************************/
|
||||
#ifdef HAVE_SIGACTION
|
||||
sigaction(SIGALRM, NULL, &sigact);
|
||||
sigact.sa_handler = alarmfunc;
|
||||
#ifdef SA_RESTART
|
||||
/* HPUX doesn't have SA_RESTART but defaults to that behaviour! */
|
||||
sigact.sa_flags &= ~SA_RESTART;
|
||||
#endif
|
||||
sigaction(SIGALRM, &sigact, NULL);
|
||||
#else
|
||||
/* no sigaction(), revert to the much lamer signal() */
|
||||
#ifdef HAVE_SIGNAL
|
||||
signal(SIGALRM, alarmfunc);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
/*************************************************************
|
||||
* Take care of user and password authentication stuff
|
||||
*************************************************************/
|
||||
|
||||
if(data->bits.user_passwd && !data->bits.use_netrc) {
|
||||
if(conn->bits.user_passwd && !data->bits.use_netrc) {
|
||||
data->user[0] =0;
|
||||
data->passwd[0]=0;
|
||||
|
||||
@@ -1431,7 +1443,7 @@ static CURLcode Connect(struct UrlData *data,
|
||||
/*************************************************************
|
||||
* Take care of proxy authentication stuff
|
||||
*************************************************************/
|
||||
if(data->bits.proxy_user_passwd) {
|
||||
if(conn->bits.proxy_user_passwd) {
|
||||
data->proxyuser[0] =0;
|
||||
data->proxypasswd[0]=0;
|
||||
|
||||
@@ -1598,11 +1610,16 @@ static CURLcode Connect(struct UrlData *data,
|
||||
/*************************************************************
|
||||
* Set timeout if that is being used
|
||||
*************************************************************/
|
||||
if(data->timeout) {
|
||||
if(data->timeout || data->connecttimeout) {
|
||||
/* We set the timeout on the connection/resolving phase first, separately
|
||||
* from the download/upload part to allow a maximum time on everything */
|
||||
myalarm(data->timeout); /* this sends a signal when the timeout fires
|
||||
off, and that will abort system calls */
|
||||
|
||||
/* myalarm() makes a signal get sent when the timeout fires off, and that
|
||||
will abort system calls */
|
||||
if(data->connecttimeout)
|
||||
myalarm(data->connecttimeout);
|
||||
else
|
||||
myalarm(data->timeout);
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
@@ -1754,7 +1771,7 @@ static CURLcode Connect(struct UrlData *data,
|
||||
conn->hostname);
|
||||
}
|
||||
else
|
||||
data->bits.user_passwd = 1; /* enable user+password */
|
||||
conn->bits.user_passwd = 1; /* enable user+password */
|
||||
|
||||
/* weather we failed or not, we don't know which fields that were filled
|
||||
in anyway */
|
||||
@@ -1763,7 +1780,7 @@ static CURLcode Connect(struct UrlData *data,
|
||||
if(!data->passwd[0])
|
||||
strcpy(data->passwd, CURL_DEFAULT_PASSWORD);
|
||||
}
|
||||
else if(!(data->bits.user_passwd) &&
|
||||
else if(!(conn->bits.user_passwd) &&
|
||||
(conn->protocol & (PROT_FTP|PROT_HTTP)) ) {
|
||||
/* This is a FTP or HTTP URL, and we haven't got the user+password in
|
||||
* the extra parameter, we will now try to extract the possible
|
||||
@@ -1812,7 +1829,7 @@ static CURLcode Connect(struct UrlData *data,
|
||||
}
|
||||
|
||||
conn->name = ++ptr;
|
||||
data->bits.user_passwd=1; /* enable user+password */
|
||||
conn->bits.user_passwd=TRUE; /* enable user+password */
|
||||
}
|
||||
else {
|
||||
strcpy(data->user, CURL_DEFAULT_USER);
|
||||
@@ -1859,10 +1876,6 @@ static CURLcode Connect(struct UrlData *data,
|
||||
host name name, so that we can re-use an existing connection
|
||||
that may exist registered to the same proxy host. */
|
||||
|
||||
#ifdef ENABLE_IPV6
|
||||
failf(data, "proxy yet to be supported");
|
||||
return CURLE_OUT_OF_MEMORY;
|
||||
#else
|
||||
char *prox_portno;
|
||||
char *endofprot;
|
||||
|
||||
@@ -1907,7 +1920,6 @@ static CURLcode Connect(struct UrlData *data,
|
||||
conn->proxyhost = strdup(proxyptr);
|
||||
|
||||
free(proxydup); /* free the duplicate pointer and not the modified */
|
||||
#endif /* end of IPv4-section */
|
||||
}
|
||||
|
||||
/*************************************************************
|
||||
@@ -1987,7 +1999,12 @@ static CURLcode Connect(struct UrlData *data,
|
||||
if we're reusing an existing connection. */
|
||||
|
||||
/* resolve proxy */
|
||||
#ifdef ENABLE_IPV6
|
||||
/* it might already be set if reusing a connection */
|
||||
conn->hp = Curl_getaddrinfo(data, conn->proxyhost, conn->port);
|
||||
#else
|
||||
conn->hp = Curl_gethost(data, conn->proxyhost, &conn->hostent_buf);
|
||||
#endif
|
||||
if(!conn->hp) {
|
||||
failf(data, "Couldn't resolve proxy '%s'", conn->proxyhost);
|
||||
return CURLE_COULDNT_RESOLVE_PROXY;
|
||||
@@ -1998,7 +2015,7 @@ static CURLcode Connect(struct UrlData *data,
|
||||
/*************************************************************
|
||||
* Proxy authentication
|
||||
*************************************************************/
|
||||
if(data->bits.proxy_user_passwd) {
|
||||
if(conn->bits.proxy_user_passwd) {
|
||||
char *authorization;
|
||||
snprintf(data->buffer, BUFSIZE, "%s:%s",
|
||||
data->proxyuser, data->proxypasswd);
|
||||
|
@@ -183,6 +183,8 @@ struct ConnectBits {
|
||||
bool reuse; /* if set, this is a re-used connection */
|
||||
bool chunk; /* if set, this is a chunked transfer-encoding */
|
||||
bool httpproxy; /* if set, this transfer is done through a http proxy */
|
||||
bool user_passwd; /* do we use user+password for this connection? */
|
||||
bool proxy_user_passwd; /* user+password for the proxy? */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -391,12 +393,10 @@ struct Configbits {
|
||||
bool httpproxy;
|
||||
bool mute;
|
||||
bool no_body;
|
||||
bool proxy_user_passwd;
|
||||
bool set_port;
|
||||
bool set_range;
|
||||
bool upload;
|
||||
bool use_netrc;
|
||||
bool user_passwd;
|
||||
bool verbose;
|
||||
bool this_is_a_follow; /* this is a followed Location: request */
|
||||
bool krb4; /* kerberos4 connection requested */
|
||||
@@ -496,8 +496,9 @@ struct UrlData {
|
||||
curl_passwd_callback fpasswd;
|
||||
void *passwd_client; /* pointer to pass to the passwd callback */
|
||||
|
||||
long timeout; /* in seconds, 0 means no timeout */
|
||||
long infilesize; /* size of file to upload, -1 means unknown */
|
||||
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 */
|
||||
|
||||
|
@@ -1 +1,3 @@
|
||||
SUBDIRS = Win32 Linux
|
||||
|
||||
EXTRA_DIST = README
|
||||
|
35
perl/Curl_easy/Changes
Normal file
35
perl/Curl_easy/Changes
Normal file
@@ -0,0 +1,35 @@
|
||||
Revision history for Perl extension Curl::easy.
|
||||
Check out the file README for more info.
|
||||
|
||||
1.0.2 Tue Oct 10 2000:
|
||||
- runs with libcurl 7.4
|
||||
- modified curl_easy_getinfo(). It now calls curl_getinfo() that has
|
||||
been added to libcurl in version 7.4.
|
||||
|
||||
1.0.1 Tue Oct 10 2000:
|
||||
- Added some missing features of curl_easy_setopt():
|
||||
- CURLOPT_ERRORBUFFER now works by passing the name of a perl
|
||||
variable that shall be crated and the errormessage (if any)
|
||||
be stored to.
|
||||
- Passing filehandles (Options FILE, INFILE and WRITEHEADER) now works.
|
||||
Have a look at test.pl to see how it works...
|
||||
|
||||
- Added a new function, curl_easy_getinfo(), that for now always
|
||||
returns the number of bytes that where written to disk during the last
|
||||
download. If the curl_easy_getinfo() function is included in libcurl,
|
||||
(as promised by Daniel ;-)) i will turn this into just a call to this
|
||||
function.
|
||||
|
||||
1.0 Thu Oct 5 2000:
|
||||
- first released version
|
||||
- runs with libcurl 7.3
|
||||
- some features of curl_easy_setopt() are still missing:
|
||||
- passing function pointers doesn't work (options WRITEFUNCTION,
|
||||
READFUNCTION and PROGRESSFUNCTION).
|
||||
- passing FILE * pointers doesn't work (options FILE, INFILE and
|
||||
WRITEHEADER).
|
||||
- passing linked lists doesn't work (options HTTPHEADER and
|
||||
HTTPPOST).
|
||||
- setting the buffer where to store error messages in doesn't work
|
||||
(option ERRORBUFFER).
|
||||
|
6
perl/Curl_easy/MANIFEST
Normal file
6
perl/Curl_easy/MANIFEST
Normal file
@@ -0,0 +1,6 @@
|
||||
Changes
|
||||
MANIFEST
|
||||
Makefile.PL
|
||||
easy.pm
|
||||
easy.xs
|
||||
test.pl
|
14
perl/Curl_easy/Makefile.PL
Normal file
14
perl/Curl_easy/Makefile.PL
Normal file
@@ -0,0 +1,14 @@
|
||||
# Makefile.PL for Perl extension Curl::easy.
|
||||
# Check out the file README for more info.
|
||||
|
||||
use ExtUtils::MakeMaker;
|
||||
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
|
||||
# the contents of the Makefile that is written.
|
||||
WriteMakefile(
|
||||
'NAME' => 'Curl::easy',
|
||||
'VERSION_FROM' => 'easy.pm', # finds $VERSION
|
||||
'LIBS' => ['-lcurl '], # e.g., '-lm'
|
||||
'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
|
||||
'INC' => '', # e.g., '-I/usr/include/other'
|
||||
'clean' => {FILES => "head.out body.out"}
|
||||
);
|
1
perl/Curl_easy/Makefile.am
Normal file
1
perl/Curl_easy/Makefile.am
Normal file
@@ -0,0 +1 @@
|
||||
EXTRA_DIST = Changes easy.pm easy.xs Makefile.PL MANIFEST README test.pl
|
27
perl/Curl_easy/README
Normal file
27
perl/Curl_easy/README
Normal file
@@ -0,0 +1,27 @@
|
||||
README for Perl extension Curl::easy.
|
||||
|
||||
The perl module Curl::easy provides an interface to the cURL library "libcurl".
|
||||
See http://curl.haxx.se/ for more information on cURL and libcurl.
|
||||
|
||||
This module requires libcurl and the corresponding headerfiles to be
|
||||
installed. You then may install this module via the usual way:
|
||||
|
||||
perl Makefile.PL
|
||||
make
|
||||
make test
|
||||
make install
|
||||
|
||||
The module provides the same functionality as libcurl provides to C programs,
|
||||
please refer to the documentation of libcurl.
|
||||
|
||||
A short example how to use the module may be found in test.pl.
|
||||
|
||||
This Software is distributed AS IS, WITHOUT WARRANTY OF ANY KIND,
|
||||
either express or implied. Send praise, patches, money, beer and
|
||||
pizza to the author. Send complaints to /dev/null. ;-)
|
||||
|
||||
The author of this module is Georg Horn <horn@koblenz-net.de>
|
||||
|
||||
The latest version of this module can be dowloaded from
|
||||
http://koblenz-net.de/~horn/export/
|
||||
|
139
perl/Curl_easy/easy.pm
Normal file
139
perl/Curl_easy/easy.pm
Normal file
@@ -0,0 +1,139 @@
|
||||
# Perl interface for libcurl. Check out the file README for more info.
|
||||
|
||||
package Curl::easy;
|
||||
|
||||
use strict;
|
||||
use Carp;
|
||||
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
|
||||
|
||||
require Exporter;
|
||||
require DynaLoader;
|
||||
require AutoLoader;
|
||||
|
||||
@ISA = qw(Exporter DynaLoader);
|
||||
# Items to export into callers namespace by default. Note: do not export
|
||||
# names by default without a very good reason. Use EXPORT_OK instead.
|
||||
# Do not simply export all your public functions/methods/constants.
|
||||
@EXPORT = qw(
|
||||
CURLOPT_AUTOREFERER
|
||||
CURLOPT_COOKIE
|
||||
CURLOPT_COOKIEFILE
|
||||
CURLOPT_CRLF
|
||||
CURLOPT_CUSTOMREQUEST
|
||||
CURLOPT_ERRORBUFFER
|
||||
CURLOPT_FAILONERROR
|
||||
CURLOPT_FILE
|
||||
CURLOPT_FOLLOWLOCATION
|
||||
CURLOPT_FTPAPPEND
|
||||
CURLOPT_FTPASCII
|
||||
CURLOPT_FTPLISTONLY
|
||||
CURLOPT_FTPPORT
|
||||
CURLOPT_HEADER
|
||||
CURLOPT_HTTPHEADER
|
||||
CURLOPT_HTTPPOST
|
||||
CURLOPT_HTTPPROXYTUNNEL
|
||||
CURLOPT_HTTPREQUEST
|
||||
CURLOPT_INFILE
|
||||
CURLOPT_INFILESIZE
|
||||
CURLOPT_INTERFACE
|
||||
CURLOPT_KRB4LEVEL
|
||||
CURLOPT_LOW_SPEED_LIMIT
|
||||
CURLOPT_LOW_SPEED_TIME
|
||||
CURLOPT_MUTE
|
||||
CURLOPT_NETRC
|
||||
CURLOPT_NOBODY
|
||||
CURLOPT_NOPROGRESS
|
||||
CURLOPT_NOTHING
|
||||
CURLOPT_PORT
|
||||
CURLOPT_POST
|
||||
CURLOPT_POSTFIELDS
|
||||
CURLOPT_POSTFIELDSIZE
|
||||
CURLOPT_POSTQUOTE
|
||||
CURLOPT_PROGRESSDATA
|
||||
CURLOPT_PROGRESSFUNCTION
|
||||
CURLOPT_PROXY
|
||||
CURLOPT_PROXYPORT
|
||||
CURLOPT_PROXYUSERPWD
|
||||
CURLOPT_PUT
|
||||
CURLOPT_QUOTE
|
||||
CURLOPT_RANGE
|
||||
CURLOPT_READFUNCTION
|
||||
CURLOPT_REFERER
|
||||
CURLOPT_RESUME_FROM
|
||||
CURLOPT_SSLCERT
|
||||
CURLOPT_SSLCERTPASSWD
|
||||
CURLOPT_SSLVERSION
|
||||
CURLOPT_STDERR
|
||||
CURLOPT_TIMECONDITION
|
||||
CURLOPT_TIMEOUT
|
||||
CURLOPT_TIMEVALUE
|
||||
CURLOPT_TRANSFERTEXT
|
||||
CURLOPT_UPLOAD
|
||||
CURLOPT_URL
|
||||
CURLOPT_USERAGENT
|
||||
CURLOPT_USERPWD
|
||||
CURLOPT_VERBOSE
|
||||
CURLOPT_WRITEFUNCTION
|
||||
CURLOPT_WRITEHEADER
|
||||
|
||||
CURLINFO_EFFECTIVE_URL
|
||||
CURLINFO_HTTP_CODE
|
||||
CURLINFO_TOTAL_TIME
|
||||
CURLINFO_NAMELOOKUP_TIME
|
||||
CURLINFO_CONNECT_TIME
|
||||
CURLINFO_PRETRANSFER_TIME
|
||||
CURLINFO_SIZE_UPLOAD
|
||||
CURLINFO_SIZE_DOWNLOAD
|
||||
CURLINFO_SPEED_DOWNLOAD
|
||||
CURLINFO_SPEED_UPLOAD
|
||||
CURLINFO_HEADER_SIZE
|
||||
CURLINFO_REQUEST_SIZE
|
||||
);
|
||||
$VERSION = '1.0.1';
|
||||
|
||||
sub AUTOLOAD {
|
||||
# This AUTOLOAD is used to 'autoload' constants from the constant()
|
||||
# XS function.
|
||||
|
||||
(my $constname = $AUTOLOAD) =~ s/.*:://;
|
||||
return constant($constname, 0);
|
||||
}
|
||||
|
||||
bootstrap Curl::easy $VERSION;
|
||||
|
||||
# Preloaded methods go here.
|
||||
|
||||
# Autoload methods go after =cut, and are processed by the autosplit program.
|
||||
|
||||
1;
|
||||
__END__
|
||||
# Below is the stub of documentation for your module. You better edit it!
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Curl::easy - Perl extension for libcurl
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
use Curl::easy;
|
||||
|
||||
$CURL = curl_easy_init();
|
||||
$CURLcode = curl_easy_setopt($CURL, CURLoption, Value);
|
||||
$CURLcode = curl_easy_perform($CURL);
|
||||
curl_easy_cleanup($CURL);
|
||||
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
This perl module provides an interface to the libcurl C library. See
|
||||
http://curl.haxx.se/ for more information on cURL and libcurl.
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Georg Horn <horn@koblenz-net.de>
|
||||
|
||||
=head1 SEE ALSO
|
||||
|
||||
http://curl.haxx.se/
|
||||
|
||||
=cut
|
290
perl/Curl_easy/easy.xs
Normal file
290
perl/Curl_easy/easy.xs
Normal file
@@ -0,0 +1,290 @@
|
||||
/* Perl interface for libcurl. Check out the file README for more info. */
|
||||
|
||||
#include "EXTERN.h"
|
||||
#include "perl.h"
|
||||
#include "XSUB.h"
|
||||
|
||||
#include <curl/curl.h>
|
||||
#include <curl/easy.h>
|
||||
|
||||
|
||||
/* Buffer and varname for option CURLOPT_ERRORBUFFER */
|
||||
|
||||
static char errbuf[CURL_ERROR_SIZE];
|
||||
static char *errbufvarname = NULL;
|
||||
|
||||
|
||||
static int
|
||||
constant(char *name, int arg)
|
||||
{
|
||||
errno = 0;
|
||||
if (strncmp(name, "CURLINFO_", 9) == 0) {
|
||||
name += 9;
|
||||
switch (*name) {
|
||||
case 'A':
|
||||
case 'B':
|
||||
case 'C':
|
||||
case 'D':
|
||||
if (strEQ(name, "CONNECT_TIME")) return CURLINFO_CONNECT_TIME;
|
||||
break;
|
||||
case 'E':
|
||||
case 'F':
|
||||
if (strEQ(name, "EFFECTIVE_URL")) return CURLINFO_EFFECTIVE_URL;
|
||||
break;
|
||||
case 'G':
|
||||
case 'H':
|
||||
if (strEQ(name, "HEADER_SIZE")) return CURLINFO_HEADER_SIZE;
|
||||
if (strEQ(name, "HTTP_CODE")) return CURLINFO_HTTP_CODE;
|
||||
break;
|
||||
case 'I':
|
||||
case 'J':
|
||||
case 'K':
|
||||
case 'L':
|
||||
case 'M':
|
||||
case 'N':
|
||||
if (strEQ(name, "NAMELOOKUP_TIME")) return CURLINFO_NAMELOOKUP_TIME;
|
||||
break;
|
||||
case 'O':
|
||||
case 'P':
|
||||
if (strEQ(name, "PRETRANSFER_TIME")) return CURLINFO_PRETRANSFER_TIME;
|
||||
break;
|
||||
case 'Q':
|
||||
case 'R':
|
||||
if (strEQ(name, "REQUEST_SIZE")) return CURLINFO_REQUEST_SIZE;
|
||||
break;
|
||||
case 'S':
|
||||
case 'T':
|
||||
if (strEQ(name, "SIZE_DOWNLOAD")) return CURLINFO_SIZE_DOWNLOAD;
|
||||
if (strEQ(name, "SIZE_UPLOAD")) return CURLINFO_SIZE_UPLOAD;
|
||||
if (strEQ(name, "SPEED_DOWNLOAD")) return CURLINFO_SPEED_DOWNLOAD;
|
||||
if (strEQ(name, "SPEED_UPLOAD")) return CURLINFO_SPEED_UPLOAD;
|
||||
if (strEQ(name, "TOTAL_TIME")) return CURLINFO_TOTAL_TIME;
|
||||
break;
|
||||
case 'U':
|
||||
case 'V':
|
||||
case 'W':
|
||||
case 'X':
|
||||
case 'Y':
|
||||
case 'Z':
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (strncmp(name, "CURLOPT_", 8) == 0) {
|
||||
name += 8;
|
||||
switch (*name) {
|
||||
case 'A':
|
||||
case 'B':
|
||||
if (strEQ(name, "AUTOREFERER")) return CURLOPT_AUTOREFERER;
|
||||
break;
|
||||
case 'C':
|
||||
case 'D':
|
||||
if (strEQ(name, "COOKIE")) return CURLOPT_COOKIE;
|
||||
if (strEQ(name, "COOKIEFILE")) return CURLOPT_COOKIEFILE;
|
||||
if (strEQ(name, "CRLF")) return CURLOPT_CRLF;
|
||||
if (strEQ(name, "CUSTOMREQUEST")) return CURLOPT_CUSTOMREQUEST;
|
||||
break;
|
||||
case 'E':
|
||||
case 'F':
|
||||
if (strEQ(name, "ERRORBUFFER")) return CURLOPT_ERRORBUFFER;
|
||||
if (strEQ(name, "FAILONERROR")) return CURLOPT_FAILONERROR;
|
||||
if (strEQ(name, "FILE")) return CURLOPT_FILE;
|
||||
if (strEQ(name, "FOLLOWLOCATION")) return CURLOPT_FOLLOWLOCATION;
|
||||
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, "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':
|
||||
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, "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':
|
||||
case 'R':
|
||||
if (strEQ(name, "QUOTE")) return CURLOPT_QUOTE;
|
||||
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':
|
||||
case 'T':
|
||||
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;
|
||||
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;
|
||||
}
|
||||
}
|
||||
errno = EINVAL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
MODULE = Curl::easy PACKAGE = Curl::easy
|
||||
|
||||
int
|
||||
constant(name,arg)
|
||||
char * name
|
||||
int arg
|
||||
|
||||
|
||||
void *
|
||||
curl_easy_init()
|
||||
CODE:
|
||||
if (errbufvarname) free(errbufvarname);
|
||||
errbufvarname = NULL;
|
||||
RETVAL = curl_easy_init();
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
int
|
||||
curl_easy_setopt(curl, option, value)
|
||||
void * curl
|
||||
int option
|
||||
char * value
|
||||
CODE:
|
||||
if (option < CURLOPTTYPE_OBJECTPOINT) {
|
||||
/* This is an option specifying an integer value: */
|
||||
long value = (long)SvIV(ST(2));
|
||||
RETVAL = curl_setopt(curl, option, value);
|
||||
} else if (option == CURLOPT_FILE || option == CURLOPT_INFILE ||
|
||||
option == CURLOPT_WRITEHEADER) {
|
||||
/* This is an option specifying a FILE * value: */
|
||||
FILE * value = IoIFP(sv_2io(ST(2)));
|
||||
RETVAL = curl_setopt(curl, option, value);
|
||||
} else if (option == CURLOPT_ERRORBUFFER) {
|
||||
SV *sv;
|
||||
RETVAL = curl_setopt(curl, option, errbuf);
|
||||
if (errbufvarname) free(errbufvarname);
|
||||
errbufvarname = strdup(value);
|
||||
sv = perl_get_sv(errbufvarname, TRUE | GV_ADDMULTI);
|
||||
} else if (option == CURLOPT_WRITEFUNCTION || option ==
|
||||
CURLOPT_READFUNCTION || option == CURLOPT_PROGRESSFUNCTION) {
|
||||
/* This is an option specifying a callback function */
|
||||
/* not yet implemented */
|
||||
RETVAL = -1;
|
||||
} else {
|
||||
/* default, option specifying a char * value: */
|
||||
RETVAL = curl_setopt(curl, option, value);
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
int
|
||||
curl_easy_perform(curl)
|
||||
void * curl
|
||||
CODE:
|
||||
RETVAL = curl_easy_perform(curl);
|
||||
if (RETVAL && errbufvarname) {
|
||||
SV *sv = perl_get_sv(errbufvarname, TRUE | GV_ADDMULTI);
|
||||
sv_setpv(sv, errbuf);
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
int
|
||||
curl_easy_getinfo(curl, option, value)
|
||||
void * curl
|
||||
int option
|
||||
double value
|
||||
CODE:
|
||||
switch (option & CURLINFO_TYPEMASK) {
|
||||
case CURLINFO_STRING: {
|
||||
char * value = (char *)SvPV(ST(2), PL_na);
|
||||
RETVAL = curl_getinfo(curl, option, &value);
|
||||
sv_setpv(ST(2), value);
|
||||
break;
|
||||
}
|
||||
case CURLINFO_LONG: {
|
||||
long value = (long)SvIV(ST(2));
|
||||
RETVAL = curl_getinfo(curl, option, &value);
|
||||
sv_setiv(ST(2), value);
|
||||
break;
|
||||
}
|
||||
case CURLINFO_DOUBLE: {
|
||||
double value = (double)SvNV(ST(2));
|
||||
RETVAL = curl_getinfo(curl, option, &value);
|
||||
sv_setnv(ST(2), value);
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
RETVAL = CURLE_BAD_FUNCTION_ARGUMENT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
||||
|
||||
int
|
||||
curl_easy_cleanup(curl)
|
||||
void * curl
|
||||
CODE:
|
||||
curl_easy_cleanup(curl);
|
||||
if (errbufvarname) free(errbufvarname);
|
||||
errbufvarname = NULL;
|
||||
RETVAL = 0;
|
||||
OUTPUT:
|
||||
RETVAL
|
||||
|
101
perl/Curl_easy/test.pl
Normal file
101
perl/Curl_easy/test.pl
Normal file
@@ -0,0 +1,101 @@
|
||||
# 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.)
|
||||
|
||||
BEGIN { $| = 1; print "1..5\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):
|
||||
|
||||
# Read URL to get
|
||||
$defurl = "http://www/";
|
||||
$url = "";
|
||||
print "Please enter an URL to fetch [$defurl]: ";
|
||||
$url = <STDIN>;
|
||||
if ($url =~ /^\s*\n/) {
|
||||
$url = $defurl;
|
||||
}
|
||||
|
||||
# Use this for simple benchmarking
|
||||
#for ($i=0; $i<1000; $i++) {
|
||||
|
||||
# Init the curl session
|
||||
if (($curl = Curl::easy::curl_easy_init()) != 0) {
|
||||
print "ok 2\n";
|
||||
} else {
|
||||
print "ko 2\n";
|
||||
}
|
||||
|
||||
# Set URL to get
|
||||
if (Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_URL, $url) == 0) {
|
||||
print "ok 3\n";
|
||||
} else {
|
||||
print "ko 3\n";
|
||||
}
|
||||
|
||||
# No progress meter please
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_NOPROGRESS, 1);
|
||||
|
||||
# Shut up completely
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_MUTE, 1);
|
||||
|
||||
# Follow location headers
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_FOLLOWLOCATION, 1);
|
||||
|
||||
# Set timeout
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_TIMEOUT, 30);
|
||||
|
||||
# Set file where to read cookies from
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_COOKIEFILE, "cookies");
|
||||
|
||||
# Set file where to store the header
|
||||
open HEAD, ">head.out";
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_WRITEHEADER, HEAD);
|
||||
|
||||
# Set file where to store the body
|
||||
open BODY, ">body.out";
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_FILE, BODY);
|
||||
|
||||
# Store error messages in variable $errbuf
|
||||
# NOTE: The name of the variable is passed as a string!
|
||||
# curl_easy_setopt() creates a perl variable with that name, and
|
||||
# curl_easy_perform() stores the errormessage into it if an error occurs.
|
||||
Curl::easy::curl_easy_setopt($curl, Curl::easy::CURLOPT_ERRORBUFFER, "errbuf");
|
||||
|
||||
# Go get it
|
||||
if (Curl::easy::curl_easy_perform($curl) == 0) {
|
||||
Curl::easy::curl_easy_getinfo($curl, Curl::easy::CURLINFO_SIZE_DOWNLOAD, $bytes);
|
||||
print "ok 4: $bytes bytes read\n";
|
||||
print "check out the files head.out and body.out\n";
|
||||
print "for the headers and content of the URL you just fetched...\n";
|
||||
Curl::easy::curl_easy_getinfo($curl, Curl::easy::CURLINFO_EFFECTIVE_URL, $realurl);
|
||||
Curl::easy::curl_easy_getinfo($curl, Curl::easy::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 "ko 4: '$errbuf'\n";
|
||||
}
|
||||
|
||||
# Cleanup
|
||||
close HEAD;
|
||||
close BODY;
|
||||
Curl::easy::curl_easy_cleanup($curl);
|
||||
print "ok 5\n";
|
||||
|
||||
# Use this for simple benchmarking
|
||||
#}
|
||||
|
3
perl/Makefile.am
Normal file
3
perl/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
SUBDIRS = Curl_easy
|
||||
|
||||
EXTRA_DIST = README
|
42
perl/README
42
perl/README
@@ -1,33 +1,17 @@
|
||||
This is just a small collection of perl scripts that use curl to do
|
||||
their jobs.
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
If you need a proxy configuration in order to get HTTP or FTP
|
||||
documents, do edit your .curlrc file in your HOME dir to contain:
|
||||
-x <proxy host>:<proxy port>
|
||||
Perl
|
||||
|
||||
These scripts are all written by Daniel Stenberg.
|
||||
Perl's a great script language, not the least for quick prototyping. Curl is
|
||||
elegantly used from within it. You can either invoke external curl command
|
||||
line or use the curl interface.
|
||||
|
||||
checklinks.pl
|
||||
=============
|
||||
This script fetches an HTML page, extracts all links and references to
|
||||
other documents and then goes through them to check that they work.
|
||||
Reports progress in a format intended for machine-parsing.
|
||||
Georg Horn's Perl interface to curl is available in the Curl_easy/
|
||||
subdirectory.
|
||||
|
||||
getlinks.pl
|
||||
===========
|
||||
You ever wanted to download a bunch of programs a certain HTML page has
|
||||
links to? This program extracts all links and references from a web page
|
||||
and then compares them to the regex you supply. All matches will be
|
||||
downloaded in the target directory of your choice.
|
||||
|
||||
recursiveftpget.pl
|
||||
==================
|
||||
This script recursively downloads all files from a directory on an ftp site
|
||||
and all subdirectories it has. Optional depth-level.
|
||||
|
||||
formfind.pl
|
||||
===========
|
||||
Downloads an HTML page (or reads stdin) and reports a human readable report
|
||||
about the FORM(s) present. What method, what URL, which input or select
|
||||
field, what default values they have and what submit buttons there are. It
|
||||
is useful if you intend to use curl to properly fake a form submission.
|
||||
Unfortunately, we don't have any examples nor any documentation for it at
|
||||
this point.
|
||||
|
0
perl/checklinks.pl.in → perl/contrib/checklinks.pl.in
Executable file → Normal file
0
perl/checklinks.pl.in → perl/contrib/checklinks.pl.in
Executable file → Normal file
0
perl/getlinks.pl.in → perl/contrib/getlinks.pl.in
Executable file → Normal file
0
perl/getlinks.pl.in → perl/contrib/getlinks.pl.in
Executable file → Normal file
104
perl/contrib/mirror.pl
Normal file
104
perl/contrib/mirror.pl
Normal file
@@ -0,0 +1,104 @@
|
||||
#!/usr/bin/perl
|
||||
|
||||
#
|
||||
# Author: Daniel Stenberg <daniel@haxx.se>
|
||||
# Version: 0.1
|
||||
# Date: October 10, 2000
|
||||
#
|
||||
# This is public domain. Feel free to do whatever you please with this script.
|
||||
# There are no warranties whatsoever! It might work, it might ruin your hard
|
||||
# disk. Use this on your own risk.
|
||||
#
|
||||
# PURPOSE
|
||||
#
|
||||
# This script uses a local directory to maintain a "mirror" of the curl
|
||||
# packages listed in the remote curl web sites package list. Files present in
|
||||
# the local directory that aren't present in the remote list will be removed.
|
||||
# Files that are present in the remote list but not in the local directory
|
||||
# will be downloaded and put there. Files present at both places will not
|
||||
# be touched.
|
||||
#
|
||||
# WARNING: don't put other files in the mirror directory, they will be removed
|
||||
# when this script runs if they don't exist in the remote package list!
|
||||
#
|
||||
|
||||
# this is the directory to keep all the mirrored curl files in:
|
||||
$some_dir = $ARGV[0];
|
||||
|
||||
if( ! -d $some_dir ) {
|
||||
print "$some_dir is not a dir!\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
# path to the curl binary
|
||||
$curl = "/home/danste/bin/curl";
|
||||
|
||||
# this is the remote file list
|
||||
$filelist = "http://curl.haxx.se/download/curldist.txt";
|
||||
|
||||
# prepend URL:
|
||||
$prepend = "http://curl.haxx.se/download";
|
||||
|
||||
opendir(DIR, $some_dir) || die "can't opendir $some_dir: $!";
|
||||
@existing = grep { /^[^\.]/ } readdir(DIR);
|
||||
closedir DIR;
|
||||
|
||||
$LOCAL_FILE = 1;
|
||||
$REMOTE_FILE = 2;
|
||||
|
||||
# create a hash array
|
||||
for(@existing) {
|
||||
$allfiles{$_} |= $LOCAL_FILE;
|
||||
}
|
||||
|
||||
# get remote file list
|
||||
print "Getting file list from $filelist\n";
|
||||
@remotefiles=`$curl -s $filelist`;
|
||||
|
||||
# fill in the hash array
|
||||
for(@remotefiles) {
|
||||
chomp;
|
||||
$allfiles{$_} |= $REMOTE_FILE;
|
||||
$remote++;
|
||||
}
|
||||
if($remote < 10) {
|
||||
print "There's something wrong. The remote file list seems too smallish!\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
@sfiles = sort { $a cmp $b } keys %allfiles;
|
||||
|
||||
|
||||
$leftalone = $downloaded = $removed = 0;
|
||||
for(@sfiles) {
|
||||
$file = $_;
|
||||
$info = $allfiles{$file};
|
||||
|
||||
if($info == ($REMOTE_FILE|$LOCAL_FILE)) {
|
||||
print "$file is LOCAL and REMOTE, left alone\n";
|
||||
$leftalone++;
|
||||
}
|
||||
elsif($info == $REMOTE_FILE) {
|
||||
print "$file is only REMOTE, getting it...\n";
|
||||
system("$curl $prepend/$file -o $some_dir/$file");
|
||||
$downloaded++;
|
||||
}
|
||||
elsif($info == $LOCAL_FILE) {
|
||||
print "$file is only LOCAL, removing it...\n";
|
||||
system("rm $some_dir/$file");
|
||||
$removed++;
|
||||
}
|
||||
else {
|
||||
print "Problem, file $file was marked $info\n";
|
||||
}
|
||||
$loops++;
|
||||
}
|
||||
|
||||
if(!$loops) {
|
||||
print "No remote or local files were found!\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
print "$leftalone files were already present\n",
|
||||
"$downloaded files were added\n",
|
||||
"$removed files were removed\n";
|
0
perl/recursiveftpget.pl.in → perl/contrib/recursiveftpget.pl.in
Executable file → Normal file
0
perl/recursiveftpget.pl.in → perl/contrib/recursiveftpget.pl.in
Executable file → Normal file
2
php/Makefile.am
Normal file
2
php/Makefile.am
Normal file
@@ -0,0 +1,2 @@
|
||||
SUBDIRS = examples
|
||||
EXTRA_DIST = README
|
15
php/README
Normal file
15
php/README
Normal file
@@ -0,0 +1,15 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
PHP
|
||||
|
||||
There's an excellent interface to curl written for PHP by Sterling Hughes. See
|
||||
the subdirectory examples/ for some examples on how to program with it.
|
||||
|
||||
Unfortunately, we don't have much more information about the interface
|
||||
included here yet, but there's a detailed online manual for it over at:
|
||||
|
||||
http://www.php.net/manual/ref.curl.php
|
1
php/examples/Makefile.am
Normal file
1
php/examples/Makefile.am
Normal file
@@ -0,0 +1 @@
|
||||
EXTRA_DIST = README getpageinvar.php simpleget.php simplepost.php
|
16
php/examples/README
Normal file
16
php/examples/README
Normal file
@@ -0,0 +1,16 @@
|
||||
_ _ ____ _
|
||||
___| | | | _ \| |
|
||||
/ __| | | | |_) | |
|
||||
| (__| |_| | _ <| |___
|
||||
\___|\___/|_| \_\_____|
|
||||
|
||||
PHP program examples
|
||||
|
||||
getpageinvar.php
|
||||
- Fetch a single URL and return in a variable
|
||||
|
||||
simpleget.php
|
||||
- A very simple example that gets a HTTP page
|
||||
|
||||
simplepost.php
|
||||
- Example that sends a HTTP POST to a remote site
|
20
src/main.c
20
src/main.c
@@ -38,11 +38,6 @@
|
||||
|
||||
#define CURLseparator "--_curl_--"
|
||||
|
||||
/* This define make use of the "Curlseparator" as opposed to the
|
||||
MIMEseparator. We might add support for the latter one in the
|
||||
future, and that's why this is left in the source. */
|
||||
#define CURL_SEPARATORS
|
||||
|
||||
/* This is now designed to have its own local setup.h */
|
||||
#include "setup.h"
|
||||
|
||||
@@ -247,9 +242,11 @@ static void help(void)
|
||||
" --data-ascii <data> HTTP POST ASCII data (H)\n"
|
||||
" --data-binary <data> HTTP POST binary data (H)\n"
|
||||
" -D/--dump-header <file> Write the headers to this file\n"
|
||||
" --egd-file <file> EGD socket path for random data (SSL)\n"
|
||||
" -e/--referer Referer page (H)");
|
||||
puts(" -E/--cert <cert[:passwd]> Specifies your certificate file and password (HTTPS)\n"
|
||||
" --cacert <file> CA certifciate to verify peer against (HTTPS)\n"
|
||||
" --connect-timeout <seconds> Maximum time allowed for connection\n"
|
||||
" -f/--fail Fail silently (no output at all) on errors (H)\n"
|
||||
" -F/--form <name=content> Specify HTTP POST data (H)\n"
|
||||
" -g/--globoff Disable URL sequences and ranges using {} and []\n"
|
||||
@@ -275,6 +272,7 @@ static void help(void)
|
||||
puts(" -r/--range <range> Retrieve a byte range from a HTTP/1.1 or FTP server\n"
|
||||
" -s/--silent Silent mode. Don't output anything\n"
|
||||
" -S/--show-error Show error. With -s, make curl show errors when they occur\n"
|
||||
" --stderr <file> Where to redirect stderr. - means stdout.\n"
|
||||
" -t/--telnet-option <OPT=val> Set telnet option\n"
|
||||
" -T/--upload-file <file> Transfer/upload <file> to remote site\n"
|
||||
" --url <URL> Another way to specify URL to work with");
|
||||
@@ -284,6 +282,7 @@ static void help(void)
|
||||
" -V/--version Outputs version number then quits\n"
|
||||
" -w/--write-out [format] What to output after completion\n"
|
||||
" -x/--proxy <host[:port]> Use proxy. (Default port is 1080)\n"
|
||||
" --random-file <file> File to use for reading random data from (SSL)\n"
|
||||
" -X/--request <command> Specific request command to use");
|
||||
puts(" -y/--speed-time Time needed to trig speed-limit abort. Defaults to 30\n"
|
||||
" -Y/--speed-limit Stop transfer if below speed-limit for 'speed-time' secs\n"
|
||||
@@ -292,10 +291,7 @@ static void help(void)
|
||||
" -2/--sslv2 Force usage of SSLv2 (H)\n"
|
||||
" -3/--sslv3 Force usage of SSLv3 (H)");
|
||||
puts(" -#/--progress-bar Display transfer progress as a progress bar\n"
|
||||
" --crlf Convert LF to CRLF in upload. Useful for MVS (OS/390)\n"
|
||||
" --stderr <file> Where to redirect stderr. - means stdout.\n"
|
||||
" --random-file <file> File to use for reading random data from (SSL)\n"
|
||||
" --egd-file <file> EGD socket path for random data (SSL)");
|
||||
" --crlf Convert LF to CRLF in upload. Useful for MVS (OS/390)");
|
||||
}
|
||||
|
||||
struct LongShort {
|
||||
@@ -315,6 +311,7 @@ struct Configurable {
|
||||
long postfieldsize;
|
||||
char *referer;
|
||||
long timeout;
|
||||
long connecttimeout;
|
||||
long maxredirs;
|
||||
char *headerfile;
|
||||
char *ftpport;
|
||||
@@ -528,6 +525,7 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
{"5", "url", TRUE},
|
||||
{"5a", "random-file", TRUE},
|
||||
{"5b", "egd-file", TRUE},
|
||||
{"5c", "connect-timeout", TRUE},
|
||||
|
||||
{"2", "sslv2", FALSE},
|
||||
{"3", "sslv3", FALSE},
|
||||
@@ -684,6 +682,9 @@ static ParameterError getparameter(char *flag, /* f or -long-flag */
|
||||
case 'b': /* egd-file */
|
||||
GetStr(&config->egd_file, nextarg);
|
||||
break;
|
||||
case 'c': /* connect-timeout */
|
||||
config->connecttimeout=atoi(nextarg);
|
||||
break;
|
||||
default: /* the URL! */
|
||||
{
|
||||
struct getout *url;
|
||||
@@ -1839,6 +1840,7 @@ operate(struct Configurable *config, int argc, char *argv[])
|
||||
/* new in libcurl 7.7: */
|
||||
curl_easy_setopt(curl, CURLOPT_RANDOM_FILE, config->random_file);
|
||||
curl_easy_setopt(curl, CURLOPT_EGDSOCKET, config->egd_file);
|
||||
curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, config->connecttimeout);
|
||||
|
||||
res = curl_easy_perform(curl);
|
||||
|
||||
|
@@ -1,3 +1,3 @@
|
||||
#define CURL_NAME "curl"
|
||||
#define CURL_VERSION "7.7-beta3"
|
||||
#define CURL_VERSION "7.7-beta5"
|
||||
#define CURL_ID CURL_NAME " " CURL_VERSION " (" OS ") "
|
||||
|
@@ -4,7 +4,7 @@ install:
|
||||
test:
|
||||
[ -f command1.txt ] || ln -s $(srcdir)/*.txt .
|
||||
|
||||
EXTRA_DIST = command1.txt error113.txt name17.txt prot8.txt \
|
||||
EXTRA_DIST = command1.txt error113.txt name17.txt prot8.txt \
|
||||
command10.txt error114.txt name18.txt prot9.txt \
|
||||
command100.txt error115.txt name19.txt reply1.txt \
|
||||
command101.txt error116.txt name2.txt reply10.txt \
|
||||
@@ -66,4 +66,6 @@ command33.txt extra33.txt name33.txt prot33.txt reply33.txt \
|
||||
command34.txt prot34.txt reply340001.txt name34.txt reply34.txt \
|
||||
command35.txt name35.txt prot35.txt reply35.txt \
|
||||
command36.txt error36.txt name36.txt reply36.txt \
|
||||
command37.txt name37.txt prot37.txt reply37.txt
|
||||
command37.txt name37.txt prot37.txt reply37.txt \
|
||||
command38.txt prot38.txt reply380001.txt name38.txt reply38.txt \
|
||||
command39.txt prot39.txt reply390001.txt name39.txt reply39.txt reply390002.txt
|
||||
|
1
tests/data/command38.txt
Normal file
1
tests/data/command38.txt
Normal file
@@ -0,0 +1 @@
|
||||
http://user:pwd@%HOSTIP:%HOSTPORT/38 -L
|
3
tests/data/command39.txt
Normal file
3
tests/data/command39.txt
Normal file
@@ -0,0 +1,3 @@
|
||||
http://%HOSTIP:%HOSTPORT/want/39 -L -C 20
|
||||
|
||||
|
1
tests/data/name38.txt
Normal file
1
tests/data/name38.txt
Normal file
@@ -0,0 +1 @@
|
||||
HTTP GET with user+password in URL and Location: and --include
|
1
tests/data/name39.txt
Normal file
1
tests/data/name39.txt
Normal file
@@ -0,0 +1 @@
|
||||
HTTP GET with location following and -C
|
@@ -1,3 +1,8 @@
|
||||
GET /want/11 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /want/data/110002.txt?coolsite=yes HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
|
@@ -1,5 +1,14 @@
|
||||
GET /11 HTTP/1.1
|
||||
User-Agent: curl/7.4.2 (sparc-sun-solaris2.7) libcurl 7.4.2
|
||||
GET /3 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /10 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /11 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
@@ -1,5 +1,14 @@
|
||||
GET /want/22 HTTP/1.1
|
||||
User-Agent: curl/7.6-pre1 (sparc-sun-solaris2.7) libcurl 7.6-pre1 (SSL 0.9.6) (krb4 enabled)
|
||||
GET /want/25 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /want/24 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /want/22 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
@@ -1,5 +1,12 @@
|
||||
POST /moo/moo/moo/310002 HTTP/1.1
|
||||
User-Agent: curl/7.6 (i686-pc-linux-gnu) libcurl 7.6 (SSL 0.9.5) (ipv6 enabled)
|
||||
POST /31 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
Content-Length: 9
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
mooo=fooo
|
||||
POST /moo/moo/moo/310002 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
@@ -1,5 +1,12 @@
|
||||
POST /32 HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
Content-Length: 9
|
||||
Content-Type: application/x-www-form-urlencoded
|
||||
|
||||
mooo=fooo
|
||||
GET /moo/moo/moo/320002 HTTP/1.1
|
||||
User-Agent: curl/7.6 (i686-pc-linux-gnu) libcurl 7.6 (SSL 0.9.5) (ipv6 enabled)
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
11
tests/data/prot38.txt
Normal file
11
tests/data/prot38.txt
Normal file
@@ -0,0 +1,11 @@
|
||||
GET /38 HTTP/1.1
|
||||
Authorization: Basic dXNlcjpwd2Q=
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /ffffooooooooooooooooooooooooooooooooooooooooooooooooooo/37?fake HTTP/1.1
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
14
tests/data/prot39.txt
Normal file
14
tests/data/prot39.txt
Normal file
@@ -0,0 +1,14 @@
|
||||
GET /want/39 HTTP/1.1
|
||||
Range: bytes=20-
|
||||
User-Agent: curl/7.7-beta4 (sparc-sun-solaris2.7) libcurl 7.7-beta4 (SSL 0.9.6) (krb4 enabled)
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
||||
GET /want/data/390002.txt?coolsite=yes HTTP/1.1
|
||||
Range: bytes=20-
|
||||
User-Agent: curl/7.7-beta4 (sparc-sun-solaris2.7) libcurl 7.7-beta4 (SSL 0.9.6) (krb4 enabled)
|
||||
Host: 127.0.0.1:8999
|
||||
Pragma: no-cache
|
||||
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*
|
||||
|
4
tests/data/reply38.txt
Normal file
4
tests/data/reply38.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
HTTP/1.0 301 OK
|
||||
Location: http://127.0.0.1:8999/ffffooooooooooooooooooooooooooooooooooooooooooooooooooo/37?fake
|
||||
|
||||
blah
|
6
tests/data/reply380001.txt
Normal file
6
tests/data/reply380001.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
HTTP/1.0 301 OK
|
||||
Location: http://127.0.0.1:8999/ffffooooooooooooooooooooooooooooooooooooooooooooooooooo/37?fake
|
||||
|
||||
HTTP/1.0 200 OK
|
||||
|
||||
no headers!
|
7
tests/data/reply39.txt
Normal file
7
tests/data/reply39.txt
Normal file
@@ -0,0 +1,7 @@
|
||||
HTTP/1.1 301 This is a weirdo text message
|
||||
Date: Thu, 09 Nov 2010 14:49:00 GMT
|
||||
Server: test-server/fake
|
||||
Location: data/390002.txt?coolsite=yes
|
||||
Connection: close
|
||||
|
||||
This server reply is for testing a simple Location: following
|
12
tests/data/reply390001.txt
Normal file
12
tests/data/reply390001.txt
Normal file
@@ -0,0 +1,12 @@
|
||||
HTTP/1.1 301 This is a weirdo text message
|
||||
Date: Thu, 09 Nov 2010 14:49:00 GMT
|
||||
Server: test-server/fake
|
||||
Location: data/390002.txt?coolsite=yes
|
||||
Connection: close
|
||||
|
||||
HTTP/1.1 200 Followed here fine
|
||||
Server: test-server/fake
|
||||
Content-Range: bytes 20-71/91
|
||||
Content-Length: 51
|
||||
|
||||
If this is received, the location following worked
|
6
tests/data/reply390002.txt
Normal file
6
tests/data/reply390002.txt
Normal file
@@ -0,0 +1,6 @@
|
||||
HTTP/1.1 200 Followed here fine
|
||||
Server: test-server/fake
|
||||
Content-Range: bytes 20-71/91
|
||||
Content-Length: 51
|
||||
|
||||
If this is received, the location following worked
|
@@ -127,7 +127,7 @@ for ( $waitedpid = 0;
|
||||
else {
|
||||
$testnum=0;
|
||||
}
|
||||
open(INPUT, ">log/server.input");
|
||||
open(INPUT, ">>log/server.input");
|
||||
for(@headers) {
|
||||
print INPUT $_;
|
||||
}
|
||||
|
Reference in New Issue
Block a user