Somewhat updated, changes include: I tried to be more agnostic about the

specific SSL library that might be used, and I cut out the closepolicy stuff
that we no longer support
This commit is contained in:
Daniel Stenberg 2007-02-27 12:44:14 +00:00
parent acc4cf87cd
commit fa31335926
1 changed files with 60 additions and 61 deletions

View File

@ -5,7 +5,7 @@
.\" * | (__| |_| | _ <| |___
.\" * \___|\___/|_| \_\_____|
.\" *
.\" * Copyright (C) 1998 - 2006, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
.\" *
.\" * This software is licensed as described in the file COPYING, which
.\" * you should have received as part of this distribution. The terms
@ -21,7 +21,7 @@
.\" * $Id$
.\" **************************************************************************
.\"
.TH libcurl-tutorial 3 "9 May 2005" "libcurl" "libcurl programming"
.TH libcurl-tutorial 3 "27 Feb 2007" "libcurl" "libcurl programming"
.SH NAME
libcurl-tutorial \- libcurl programming tutorial
.SH "Objective"
@ -64,10 +64,10 @@ $ curl-config --libs
.IP "SSL or Not"
libcurl can be built and customized in many ways. One of the things that
varies from different libraries and builds is the support for SSL-based
transfers, like HTTPS and FTPS. If OpenSSL was detected properly at
build-time, libcurl will be built with SSL support. To figure out if an
installed libcurl has been built with SSL support enabled, use 'curl-config'
like this:
transfers, like HTTPS and FTPS. If a supported SSL library was detected
properly at build-time, libcurl will be built with SSL support. To figure out
if an installed libcurl has been built with SSL support enabled, use
\&'curl-config' like this:
$ curl-config --feature
@ -111,11 +111,10 @@ sockets properly. You should only do this once for each application, so if
your program already does this or of another library in use does it, you
should not tell libcurl to do this as well.
.IP CURL_GLOBAL_SSL
which only does anything on libcurls compiled and built
SSL-enabled. On these systems, this will make libcurl initialize OpenSSL
properly for this application. This is only needed to do once for each
application so if your program or another library already does this, this
bit should not be needed.
which only does anything on libcurls compiled and built SSL-enabled. On these
systems, this will make libcurl initialize the SSL library properly for this
application. This is only needed to do once for each application so if your
program or another library already does this, this bit should not be needed.
.RE
libcurl has a default protection mechanism that detects if
@ -256,18 +255,27 @@ handlers. Signals are used timeouting name resolves (during DNS lookup) - when
built without c-ares support and not on Windows..
If you are accessing HTTPS or FTPS URLs in a multi-threaded manner, you are
then of course using OpenSSL/GnuTLS multi-threaded and those libs have their
own requirements on this issue. Basically, you need to provide one or two
functions to allow it to function properly. For all details, see this:
then of course using the underlying SSL library multi-threaded and those libs
might have their own requirements on this issue. Basically, you need to
provide one or two functions to allow it to function properly. For all
details, see this:
OpenSSL
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
http://www.openssl.org/docs/crypto/threads.html#DESCRIPTION
GnuTLS
http://www.gnu.org/software/gnutls/manual/html_node/Multi_002dthreaded-applications.html
NSS
is claimed to be thread-safe already without anything required
yassl
Required actions unknown
When using multiple threads you should set the CURLOPT_NOSIGNAL option to TRUE
for all handles. Everything will or might work fine except that timeouts are
not honored during the DNS lookup - which you can work around by building
@ -614,22 +622,26 @@ What "proxy" means according to Merriam-Webster: "a person authorized to act
for another" but also "the agency, function, or office of a deputy who acts as
a substitute for another".
Proxies are exceedingly common these days. Companies often only offer
Internet access to employees through their HTTP proxies. Network clients or
user-agents ask the proxy for documents, the proxy does the actual request
and then it returns them.
Proxies are exceedingly common these days. Companies often only offer Internet
access to employees through their proxies. Network clients or user-agents ask
the proxy for documents, the proxy does the actual request and then it returns
them.
libcurl has full support for HTTP proxies, so when a given URL is wanted,
libcurl will ask the proxy for it instead of trying to connect to the actual
host identified in the URL.
libcurl supports SOCKS and HTTP proxies. When a given URL is wanted, libcurl
will ask the proxy for it instead of trying to connect to the actual host
identified in the URL.
The fact that the proxy is a HTTP proxy puts certain restrictions on what can
actually happen. A requested URL that might not be a HTTP URL will be still
be passed to the HTTP proxy to deliver back to libcurl. This happens
transparently, and an application may not need to know. I say "may", because
at times it is very important to understand that all operations over a HTTP
proxy is using the HTTP protocol. For example, you can't invoke your own
custom FTP commands or even proper FTP directory listings.
If you're using a SOCKS proxy, you may find that libcurl doesn't quite support
all operations through it.
For HTTP proxies: the fact that the proxy is a HTTP proxy puts certain
restrictions on what can actually happen. A requested URL that might not be a
HTTP URL will be still be passed to the HTTP proxy to deliver back to
libcurl. This happens transparently, and an application may not need to
know. I say "may", because at times it is very important to understand that
all operations over a HTTP proxy is using the HTTP protocol. For example, you
can't invoke your own custom FTP commands or even proper FTP directory
listings.
.IP "Proxy Options"
@ -645,6 +657,11 @@ pass that information similar to this:
If you want to, you can specify the host name only in the CURLOPT_PROXY
option, and set the port number separately with CURLOPT_PROXYPORT.
Tell libcurl what kind of proxy it is with CURLOPT_PROXYTYPE (if not, it will
default to assume a HTTP proxy):
curl_easy_setopt(easyhandle, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS4);
.IP "Environment Variables"
libcurl automatically checks and uses a set of environment variables to
@ -669,6 +686,8 @@ for any URL in case the protocol specific variable wasn't set, and
variable may say so. If 'no_proxy' is a plain asterisk ("*") it matches all
hosts.
To explicitly disable libcurl's checking for and using the proxy environment
variables, set the proxy name to "" - an empty string - with CURLOPT_PROXY.
.IP "SSL and Proxies"
SSL is for secure point-to-point connections. This involves strong encryption
@ -768,26 +787,6 @@ with the CURLOPT_MAXCONNECTS option. Default is 5. It is very seldom any
point in changing this value, and if you think of changing this it is often
just a matter of thinking again.
When the connection cache gets filled, libcurl must close an existing
connection in order to get room for the new one. To know which connection to
close, libcurl uses a "close policy" that you can affect with the
CURLOPT_CLOSEPOLICY option. There's only two polices implemented as of this
writing (libcurl 7.9.4) and they are:
.RS
.IP CURLCLOSEPOLICY_LEAST_RECENTLY_USED
simply close the one that hasn't been used for the longest time. This is the
default behavior.
.IP CURLCLOSEPOLICY_OLDEST
closes the oldest connection, the one that was created the longest time ago.
.RE
There are, or at least were, plans to support a close policy that would call
a user-specified callback to let the user be able to decide which connection
to dump when this is necessary and therefor is the CURLOPT_CLOSEFUNCTION an
existing option still today. Nothing ever uses this though and this will not
be used within the foreseeable future either.
To force your upcoming request to not use an already existing connection (it
will even close one first if there happens to be one alive to the same host
you're about to operate on), you can do that by setting CURLOPT_FRESH_CONNECT
@ -797,7 +796,8 @@ CURLOPT_FORBID_REUSE to TRUE.
.SH "HTTP Headers Used by libcurl"
When you use libcurl to do HTTP requests, it'll pass along a series of headers
automatically. It might be good for you to know and understand these ones.
automatically. It might be good for you to know and understand these ones. You
can replace or remove them by using the CURLOPT_HTTPHEADER option.
.IP "Host"
This header is required by HTTP 1.1 and even many 1.0 servers and should be
@ -811,10 +811,11 @@ fetch a fresh one.
.IP "Accept"
\&"*/*".
.IP "Expect:"
When doing multi-part formposts, libcurl will set this header to
\&"100-continue" to ask the server for an "OK" message before it proceeds with
sending the data part of the post.
.IP "Expect"
When doing POST requests, libcurl sets this header to \&"100-continue" to ask
the server for an "OK" message before it proceeds with sending the data part
of the post. If the POSTed data amount is deemed "small", libcurl will not use
this header.
.SH "Customizing Operations"
There is an ongoing development today where more and more protocols are built
@ -888,12 +889,10 @@ data size is unknown.
.IP "HTTP Version"
There's only one aspect left in the HTTP requests that we haven't yet
mentioned how to modify: the version field. All HTTP requests includes the
version number to tell the server which version we support. libcurl speak HTTP
1.1 by default. Some very old servers don't like getting 1.1-requests and when
dealing with stubborn old things like that, you can tell libcurl to use 1.0
instead by doing something like this:
All HTTP requests includes the version number to tell the server which version
we support. libcurl speak HTTP 1.1 by default. Some very old servers don't
like getting 1.1-requests and when dealing with stubborn old things like that,
you can tell libcurl to use 1.0 instead by doing something like this:
curl_easy_setopt(easyhandle, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
@ -1051,7 +1050,7 @@ The headers are passed to the callback function one by one, and you can
depend on that fact. It makes it easier for you to add custom header parsers
etc.
"Headers" for FTP transfers equal all the FTP server responses. They aren't
\&"Headers" for FTP transfers equal all the FTP server responses. They aren't
actually true headers, but in this case we pretend they are! ;-)
.SH "Post Transfer Information"