123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706 |
- \LoadClass[12pt,letterpaper]{article}
- \documentclass{article}
- \usepackage{verbatim}
- \author{Jean-Philippe Barrette-LaPierre}
- \title{Programming with cURLpp}
- \begin{document}
- \maketitle
- \section{About this Document}
- \newcommand{\Cpp}{C{\tt ++}}
- This document attempts to describe the general principles and some basic
- approaches to consider when programming with cURLpp. Don't forget that cURLpp
- is a \Cpp wrapper of libcurl, so cURLpp needs libcurl to be installed already.
- This document will refer to 'the user' as the person writing the source code
- that uses cURLpp. That would probably be you or someone in a similar position.
- What will be generally refered to as 'the program' will be the collective
- source code that you write and that is using cURLpp for transfers. The program
- is outside cURLpp and cURLpp is outside of the program.
- To get more details on all options and functions described herein, please
- refer to their respective man pages. You should always have in mind that this
- is a \Cpp wrapper of libcurl. It would be unproductive to duplicate libcurl's
- documentation here, so this document will show you how to interact with cURLpp,
- but you should read the libcurl programming tutorial, which this document is
- strongly inspired from, and the libcurl man pages.
- \section{Building}
- There are many different ways to build C++ programs. This chapter will assume a
- unix-style build process. If you use a different build system, you can still
- read this to get general information that may apply to your environment as
- well. Note that cURLpp need libcurl to be already installed.
- \subsection{Compiling the Program}
- Your compiler needs to know where cURLpp's and libcurl's headers are
- located. Therefore you must set your compiler's include path to point to
- the directory where you installed them. The 'curlpp-config'\footnote{
- The curlpp-config tool, which wraps all functions of curl-config,
- is generated at build-time (on unix-like systems) and should be installed
- with the 'make install' or similar instruction that installs the library,
- header files, man pages etc.} tool can be
- used to get this information:
- \begin{verbatim} # curlpp-config --cflags\end{verbatim}
- If pkg-config is installed, you can use it this way:
- \begin{verbatim} # pkg-config --cflags curlpp\end{verbatim}
- But, if you're using \verb+autoconf+ for your project you can use
- \verb+pkg-config+ macros. See \verb+pkg-config+ man pages for more
- details.
- \subsection{Linking the Program with cURLpp}
- When having compiled the program, you need to link your object files to
- create a single executable. For that to succeed, you need to link with
- cURLpp and possibly also with other libraries that cURLpp itself depends
- on (such as libcurl). This may include OpenSSL libraries and even some standard
- OS libraries may be needed on the command line. To figure out which flags to use,
- the 'curlpp-config' tool comes to the rescue once again:
- \begin{verbatim} # curlpp-config --libs\end{verbatim}
- Again, if pkg-config is installed, you can use it this way:
- \begin{verbatim} # pkg-config --libs curlpp\end{verbatim}
- \subsection{SSL or Not}
- cURLpp, like libcurl, can be built and customized in many ways. One of the things that
- varies between different libraries and builds is the support for SSL-based
- transfers, like HTTPS and FTPS. If OpenSSL was detected properly by libcurl
- at build-time, cURLpp will be built with SSL support. To figure out if an
- installed cURLpp has been built with SSL support enabled, use
- 'curlpp-config' like this:
- \begin{verbatim} # curlpp-config --feature\end{verbatim}
- If SSL is supported, the keyword 'SSL' will be written to stdout,
- possibly together with a few other features that can be on and off on
- different cURLpps.
- \subsection{Portable Code in a Portable World}
- The people behind libcurl have put a considerable effort to make libcurl work
- on a large number of different operating systems and environments.
- You program cURLpp the same way on all platforms that cURLpp runs on. There
- are only very few minor considerations that differ. If you make sure just to
- write your code portably enough, you may very well create yourself a very
- portable program. cURLpp shouldn't stop you from that.
- \section{Global Preparation}
- The program must initialize some of the cURLpp functionality globally. That
- means it should be done exactly once, no matter how many times you intend to
- use the library. Once for your program's entire lifetime. This is done using
- \begin{verbatim}
- cURLpp::initialize( long flags = cURLpp::CURL_GLOBAL_ALL )
- \end{verbatim}
- and it takes one parameter which is a bit pattern that tells cURLpp what to
- intialize. Check the man page of \verb+curl_global_init+ for more details on flags.
- When the program no longer uses cURLpp, it should call \verb+cURLpp::terminate()+,
- which is the opposite of the init call. It will then do the operations needed
- to cleanup the resources that the \verb+cURLpp::initialize()+ call initialized.
- Repeated calls to \verb+cURLpp::initialize()+ and \verb+cURLpp::terminate()+ must not be made.
- They must only be called once each. The cURLpp::Cleanup class can be used to do this. It will
- call the \verb+cURLpp::initialize()+ function in its constructor and \verb+cURLpp::terminate()+
- in its destructor. Check example01.cpp in the examples/ directory of
- the source distribution for an example.
- \section{Handle the Easy cURLpp}
- To use the easy interface, you must first create yourself an easy handle. You
- need one handle for each easy session you want to perform. Basically, you
- should use one handle for every thread you plan to use for transferring. You
- must never share the same handle in multiple threads.
- Get an easy handle with
- \begin{verbatim} cURLpp::Easy easyhandle;\end{verbatim}
- This creates an easy handle. Using that you proceed to the next step: setting
- up your preferred actions. A handle is just a logic entity for the upcoming
- transfer or series of transfers. You can use it to do HTTP or FTP
- requests.
- You set properties and options for this handle using \verb+cURLpp::Options+,
- or \verb+cURLpp::OptionList+ classes; we will discuss \verb+cURLpp::OptionList+
- later. They control how the subsequent transfer or transfers will be made.
- Options remain set in the handle until set again to something different.
- Alas, multiple requests using the same handle will use the same options.
- Many of the informationals you set in cURLpp are \Cpp standard library strings.
- Keep in mind that when you set strings with member functions, cURLpp will copy
- the data. It will not merely point to the data. You don't need to make sure
- that the data remains available for cURLpp.
- One of the most basic properties to set in the handle is the URL. You set
- your preferred URL to transfer with a
- \verb+void cURLpp::Options::Url(const char *link)+
- option class, in a manner similar to:
- \begin{verbatim}
- easyhandle.setOpt(cURLpp::Options::Url("http://example.com/"));
- \end{verbatim}
- There are of course many more options you can set, and we'll get back to a
- few of them later. Let's instead continue to the actual transfer:
- \begin{verbatim}
- easyhandle.perform();
- \end{verbatim}
- The \verb+cURLpp::Easy::perform()+ will connect to the remote site, do the necessary
- commands and receive the transfer. Whenever it receives data, it calls the
- trait function we previously set. The function may get one byte at a time,
- or it may get many kilobytes at once. cURLpp delivers as much as possible as
- often as possible. Your trait function should return the number of bytes
- it "took care of". If that is not the exact same amount of bytes that was
- passed to it, cURLpp will abort the operation and throw an exception.
- When the transfer is complete, the function throws a
- \verb+cURLpp::Exception+ if it
- doesn't succeed in its mission. the \verb+const char *cURLpp::Exception::what()+ will
- return the human readable reason of failure.
- \section{Wrapping libcurl}
- As previously said, \verb+cURLpp+ is just a \Cpp libcurl wrapper. It wouldn't be a good
- idea to reproduce here, in this project, all the libcurl documentation. This means
- that when you will be programming with \verb+cURLpp+, you will refer more to libcurl's
- documentation than to \verb+cURLpp+'s. We will explain here how \verb+cURLpp+ wraps libcurl, so
- you will able to use it, without constantly refering to its manual.
- First, you must know that there are two main things that constitute \verb+cURLpp+: There are
- its options value setting/retrieving behavior and its utilities that helps you to use
- libcurl's options more easily.
- \subsection{Option setting/retrieving}
- The main feature of \verb+cURLpp+ is that you can retrieve options previously set on handles.
- \verb+cURLpp+ gives you the opportunity to retrieve options values that were previously set
- on a specific handle and then use them again for other handles. But first, let's show
- you how to set an option on a handle, in comparison to libcurl's way of setting an option.
- libcurl sets options on handles with this function:
- \begin{verbatim}
- curl_easy_setopt(CURL *handle, CURLoption option, parameter)
- \end{verbatim}
- Here's a part of the documentation taken from the man pages:
- \begin{quote}
- \verb+curl_easy_setopt()+ is used to tell libcurl how to behave. By using the appropriate options to
- \verb+curl_easy_setopt()+, you can change libcurl's behavior. All options are set with the option
- followed by a parameter. That parameter can be a long, a function pointer or an object pointer,
- all depending on what the specific option expects.
- \end{quote}
- Lets code a simple example:
- \begin{verbatim}
- CURL *handle = curl_easy_init();
- if(handle == NULL) {
- //something went wrong.
- }
- CURLcode code = curl_easy_setopt(handle,
- CURLOPT_URL, ``http://www.example.com'');
- if(code != CURLE_OK) {
- //something went wrong
- }
- \end{verbatim}
- The code below does the same thing but with \verb+cURLpp+:
- \begin{verbatim}
- cURLpp::Easy handle;
- handle.setOpt(cURLpp::Options::Url(``http://www.example.com'');
- \end{verbatim}
- If a problem occur, \verb+cURLpp+ will throw an exception, for more detail on this subject,
- see the next section named \textit{Exception issues}. As you see, the equivalent
- of the \verb+curl_easy_setopt+ function is the cURLpp::Easy::setOpt member function.
- \subsubsection{cURLpp::Options}
- The question that you might ask you at this moment is: ``what exactly is the
- \verb+cURLpp::Options::Url+ class mentioned in the previous example?'' In fact,
- this class is used to store values of options, but also to retrieve them, as shown
- below:
- \begin{verbatim}
- cURLpp::Easy handle;
- handle.setOpt(cURLpp::Options::Url(``http://www.example.com'');
- cURLpp::Options::Url myUrl;
- handle.getOpt(myUrl);
- std::cout << myUrl.getValue() << std::endl;
- \end{verbatim}
- This piece of code should print the URL on the standard output. Here's the
- code of the \verb+examples/example01.cpp+ file.
- \begin{verbatim}
- #include <string>
- #include <iostream>
- #include <curlpp/cURLpp.hpp>
- #include <curlpp/Options.hpp>
- #define MY_PORT 8080
- /**
- * This example is made to show you how you can use the Options.
- */
- int main()
- {
- try
- {
- cURLpp::Cleanup myCleanup;
- // Creation of the URL option.
- cURLpp::Options::Url myUrl(
- std::string("http://example.com"));
-
- // Copy construct from the other URL.
- cURLpp::Options::Url myUrl2(myUrl);
- // Creation of the port option.
- cURLpp::Options::Port myPort(MY_PORT);
- // Creation of the request.
- cURLpp::Easy myRequest;
- // Creation of an option that contain a copy
- // of the URL option.
- cURLpp::OptionBase *mytest = myUrl.clone();
- myRequest.setOpt(*mytest);
- // You can reuse the base option for other type of option
- // and set the option to the request. but first, don't forget
- // to delete the previous memory. You can delete it since the
- // option is internally duplicated for the request.
- delete mytest;
- mytest = myPort.clone();
- myRequest.setOpt(*mytest);
- delete mytest;
- // You can clone an option directly to the same type of
- // option.
- cURLpp::Options::Url *myUrl3 = myUrl.clone();
- myRequest.setOpt(myUrl3);
- // Now myUrl3 is owned by the request we will NOT use
- // it anymore.
- // You don't need to declare an option if you just want
- // to use it once.
- myRequest.setOpt(cURLpp::Options::Url("example.com"));
- // Note that the previous line wasn't really efficient
- // because we create the option, this option is duplicated
- // for the request and then the option destructor is called.
- // You can use this instead:
- myRequest.setOpt(new cURLpp::Options::Url("example.com"));
- // Note that with this the request will use directly this
- // instance we just created. Be aware that if you pass an
- // Option pointer to the setOpt function, it will consider
- // the instance has its own instance. The Option instance
- // will be deleted when the request will be deleted, so
- // don't use the instance further in your code.
- // Doing the previous line is efficient as this:
- myRequest.setOpt(myUrl.clone());
-
- // You can retrieve the value of a specific option.
- std::cout << myUrl2.getValue() << std::endl;
- // You can see what are the options set for a request
- // with this function. This function will print the option
- // to the stdout.
- myRequest.print();
-
- // Perform the transaction with the options set.
- myRequest.perform();
- }
- catch( cURLpp::RuntimeError &e )
- {
- std::cout << e.what() << std::endl;
- }
- catch( cURLpp::LogicError &e )
- {
- std::cout << e.what() << std::endl;
- }
-
- return 0;
- }
- \end{verbatim}
- \subsection{cURLpp::Option types}
- This section will explain the use of the types that we use for
- some options that differ from types that libcurl uses for the
- same option.
- \subsubsection{The bool type}
- A true value is binded to a non-zero long value, a false value
- is binded to a zero long value.
- \subsubsection{The std::string type}
- The \verb+std::string::c_str()+ function is passed to libcurl.
- \subsubsection{The std::list template of std::string type}
- This type is used when libcurl's option need a \verb+curl_slist+. Instead of
- using this homemade struct, cURLpp allow you to use a known type, the
- \verb+std::list+. cURLpp this transform internally the \verb+std::list+
- to a \verb+curl_slist+.
- \subsection{cURLpp::Options}
- This section just list how each libcurl's option is binded by cURLpp.
- Some options might not be there, if it's the case and you want to use them,
- see the ``how to enhance cURLpp'' section.
- \subsubsection{Behavior options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< bool,
- CURLOPT_VERBOSE > Verbose;
- typedef cURLpp::OptionTrait< bool,
- CURLOPT_HEADER > Header;
- typedef cURLpp::OptionTrait< bool,
- CURLOPT_NOSIGNAL > NoSignal;
- typedef cURLpp::OptionTrait< bool,
- CURLOPT_NOPROGRESS > NoProgress;
- \end{verbatim}
- \subsubsection{Callback options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< cURL::curl_write_callback,
- CURLOPT_WRITEFUNCTION > WriteFunction;
- typedef cURLpp::OptionTrait< void *,
- CURLOPT_WRITEDATA > WriteData;
- typedef cURLpp::OptionTrait< cURL::curl_read_callback,
- CURLOPT_READFUNCTION > ReadFunction;
- typedef cURLpp::OptionTrait< void *,
- CURLOPT_READDATA > ReadData;
- typedef cURLpp::OptionTrait< cURL::curl_progress_callback,
- CURLOPT_PROGRESSFUNCTION > ProgressFunction;
- typedef cURLpp::OptionTrait< void *,
- CURLOPT_PROGRESSDATA > ProgressData;
- typedef cURLpp::OptionTrait< cURL::curl_write_callback,
- CURLOPT_HEADERFUNCTION > HeaderFunction;
- typedef cURLpp::OptionTrait< void *,
- CURLOPT_HEADERDATA > HeaderData;
- typedef cURLpp::OptionTrait< cURL::curl_debug_callback,
- CURLOPT_DEBUGFUNCTION > DebugFunction;
- typedef cURLpp::OptionTrait< void *,
- CURLOPT_DEBUGDATA > DebugData;
- #ifdef CURLOPT_SSL_CTX_FUNCTION
- typedef cURLpp::OptionTrait< cURL::curl_ssl_ctx_callback,
- CURLOPT_SSL_CTX_FUNCTION > SslCtxFunction;
- typedef cURLpp::OptionTrait< void *,
- cURL::CURLOPT_SSL_CTX_DATA > SslCtxData;
- #endif
- \end{verbatim}
- \subsubsection{Error options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< char *,
- cURL::CURLOPT_ERRORBUFFER > ErrorBuffer;
- typedef cURLpp::OptionTrait< FILE *,
- cURL::CURLOPT_STDERR > StdErr;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FAILONERROR > FailOnError;
- \end{verbatim}
- \subsubsection{Network options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_URL > Url;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_PROXY > Proxy;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_PROXYPORT > ProxyPort;
- typedef cURLpp::OptionTrait< curl_proxytype,
- cURL::CURLOPT_PROXYTYPE > ProxyType;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_HTTPPROXYTUNNEL > HttpProxyTunnel;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_INTERFACE > Interface;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_DNS_CACHE_TIMEOUT > DnsCacheTimeout;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_DNS_USE_GLOBAL_CACHE > DnsUseGlobalCache;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_BUFFERSIZE > BufferSize;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_PORT > Port;
- #ifdef cURL::CURLOPT_TCP_NODELAY
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_TCP_NODELAY > TcpNoDelay;
- #endif
- \end{verbatim}
- \subsubsection{Names and passwords options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_NETRC > Netrc;
- #ifdef cURL::CURLOPT_NETRC_FILE
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_NETRC_FILE > NetrcFile;
- #endif
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_USERPWD > UserPwd;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_PROXYUSERPWD > ProxyUserPwd;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_HTTPAUTH > HttpAuth;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_PROXYAUTH > ProxyAuth;
- \end{verbatim}
- \subsubsection{HTTP options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_AUTOREFERER > AutoReferer;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_ENCODING > Encoding;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FOLLOWLOCATION > FollowLocation;
- #ifdef cURL::CURLOPT_UNRESTRICTED_AUTH
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_UNRESTRICTED_AUTH > UnrestrictedAuth;
- #endif
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_MAXREDIRS > MaxRedirs;
- #ifndef cURL::CURLOPT_UPLOAD
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_PUT > Put;
- #else
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_UPLOAD > Put;
- #endif
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_POST > Post;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_POSTFIELDS > PostFields;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_POSTFIELDSIZE > PostFieldSize;
- #ifdef cURL::CURLOPT_POSTFIELDSIZE_LARGE
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_POSTFIELDSIZE_LARGE > PostFieldSizeLarge;
- #endif
- typedef cURLpp::OptionTrait< struct cURLpp::cURL::HttpPost *,
- cURL::CURLOPT_HTTPPOST > HttpPost;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_REFERER > Referer;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_USERAGENT > UserAgent;
- typedef cURLpp::OptionTrait< std::list< std::string >,
- cURL::CURLOPT_HTTPHEADER > HttpHeader;
- typedef cURLpp::OptionTrait< std::list< std::string >,
- cURL::CURLOPT_HTTP200ALIASES > Http200Aliases;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_COOKIE > Cookie;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_COOKIEFILE > CookieFile;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_COOKIEJAR > CookieJar;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_COOKIESESSION > CookieSession;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_HTTPGET > HttpGet;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_HTTP_VERSION > HttpVersion;
- \end{verbatim}
- \subsubsection{FTP options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_FTPPORT > FtpPort;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_QUOTE > Quote;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_POSTQUOTE > PostQuote;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_PREQUOTE > PreQuote;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FTPLISTONLY > FtpListOnly;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FTPAPPEND > FtpAppend;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FTP_USE_EPSV > FtpUseEpsv;
- #ifdef cURL::CURLOPT_FTP_CREATE_MISSING_DIRS
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FTP_CREATE_MISSING_DIRS > FtpCreateMissingDirs;
- #endif
- #ifdef cURL::CURLOPT_FTP_RESPONSE_TIMEOUT
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FTP_RESPONSE_TIMEOUT > FtpResponseTimeout;
- #endif
- #ifdef cURL::CURLOPT_FTP_SSL
- typedef cURLpp::OptionTrait< cURLpp::curl_ftpssl,
- cURL::CURLOPT_FTP_SSL > FtpSsl;
- #endif
- #ifdef cURL::CURLOPT_FTP_AUTH
- typedef cURLpp::OptionTrait< cURLpp::curl_ftpauth,
- cURL::CURLOPT_FTP_AUTH > FtpAuth;
- #endif
- \end{verbatim}
- \subsubsection{Protocol options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_TRANSFERTEXT > TransferText;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_CRLF > Crlf;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_RANGE > Range;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_RESUME_FROM > ResumeFrom;
- #ifdef cURL::CURLOPT_RESUME_FROM_LARGE
- typedef cURLpp::OptionTrait< curl_off_t,
- cURL::CURLOPT_RESUME_FROM_LARGE > ResumeFromLarge;
- #endif
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_CUSTOMREQUEST > CustomRequest;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FILETIME > FileTime;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_NOBODY > NoBody;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_INFILESIZE > InfileSize;
- #ifdef cURL::CURLOPT_INFILESIZE_LARGE
- typedef cURLpp::OptionTrait< cURL::curl_off_t,
- cURL::CURLOPT_INFILESIZE_LARGE > InfileSizeLarge;
- #endif
- #ifdef cURL::CURLOPT_UPLOAD
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_UPLOAD > Upload;
- #else
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_PUT > Upload;
- #endif
- #ifdef cURL::CURLOPT_MAXFILESIZE
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_MAXFILESIZE > MaxFileSize;
- #endif
- #ifdef cURL::CURLOPT_MAXFILESIZE_LARGE
- typedef cURLpp::OptionTrait< cURL::curl_off_t,
- cURL::CURLOPT_MAXFILESIZE_LARGE > MaxFileSizeLarge;
- #endif
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_TIMECONDITION > TimeCondition;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_TIMECONDITION > TimeValue;
- \end{verbatim}
- \subsubsection{Connection options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_TIMEOUT > Timeout;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_LOW_SPEED_LIMIT > LowSpeedLimit;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_LOW_SPEED_TIME > LowSpeedTime;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_MAXCONNECTS > MaxConnects;
- typedef cURLpp::OptionTrait< cURL::curl_closepolicy,
- cURL::CURLOPT_CLOSEPOLICY > ClosePolicy;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FRESH_CONNECT > FreshConnect;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_FORBID_REUSE > ForbidReuse;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_CONNECTTIMEOUT > ConnectTimeout;
- #ifdef cURL::CURLOPT_IPRESOLVE
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_IPRESOLVE > IpResolve;
- #endif
- \end{verbatim}
- \subsubsection{SSL and security options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLCERT > SslCert;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLCERTTYPE > SslCertType;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLCERTPASSWD > SslCertPasswd;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLKEY > SslKey;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLKEYTYPE > SslKeyType;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLKEYPASSWD > SslKeyPasswd;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSLENGINE > SslEngine;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_SSLVERSION > SslVersion;
- typedef cURLpp::OptionTrait< bool,
- cURL::CURLOPT_SSL_VERIFYPEER > SslVerifyPeer;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_CAINFO > CaInfo;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_CAPATH > CaPath;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_RANDOM_FILE > RandomFile;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_EGDSOCKET > EgdSocket;
- typedef cURLpp::OptionTrait< long,
- cURL::CURLOPT_SSL_VERIFYHOST > SslVerifyHost;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_SSL_CIPHER_LIST > SslCipherList;
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_KRB4LEVEL > Krb4Level;
- \end{verbatim}
- \subsubsection{Others options}
- \begin{verbatim}
- typedef cURLpp::OptionTrait< std::string,
- cURL::CURLOPT_KRB4LEVEL > Krb4Level;
- \end{verbatim}
- \section{How the enhance cURLpp}
- Need to be written.
- \section{Exceptions issues}
- As previously said, cURLpp (libcurl in fact) offer the possibility to reimplement the data
- writing/reading functions. Those functions called from within libcurl might
- raise exceptions. Raising an exception in C code might cause problems. cURLpp
- protect you from doing so\footnote{This feature will be added only in the
- 0.6.0 version}. All exceptions are caught by cURLpp before they could
- cause damage to libcurl. If you want to raise an exception within traits, you need
- to do this:
- \begin{verbatim}
- cURLpp::raiseException(MyException(``Exception Raised'');
- \end{verbatim}
- Then, the \verb+cURLpp::Easy::perform()+ will raise your exception at the end of
- the process. If an exception is raised but not by this mechanism, a
- \verb+cURLpp::UnknownExceptionError+ will be raised.
- \end{document}
|