| % Template for a library manual section. | |
| % PLEASE REMOVE THE COMMENTS AFTER USING THE TEMPLATE | |
| % | |
| % Complete documentation on the extended LaTeX markup used for Python | |
| % documentation is available in ``Documenting Python'', which is part | |
| % of the standard documentation for Python. It may be found online | |
| % at: | |
| % | |
| % http://www.python.org/doc/current/doc/doc.html | |
| % ==== 0. ==== | |
| % Copy this file to <mydir>/lib<mymodule>.tex, and edit that file | |
| % according to the instructions below. | |
| % ==== 1. ==== | |
| % The section prologue. Give the section a title and provide some | |
| % meta-information. References to the module should use | |
| % \refbimodindex, \refstmodindex, \refexmodindex or \refmodindex, as | |
| % appropriate. | |
| \section{\module{httplib2} | |
| A comprehensive HTTP client library. } | |
| % Choose one of these to specify the module module name. If there's | |
| % an underscore in the name, use | |
| % \declaremodule[modname]{...}{mod_name} instead. | |
| % | |
| \declaremodule{}{httplib2} % not standard, in Python | |
| % Portability statement: Uncomment and fill in the parameter to specify the | |
| % availability of the module. The parameter can be Unix, IRIX, SunOS, Mac, | |
| % Windows, or lots of other stuff. When ``Mac'' is specified, the availability | |
| % statement will say ``Macintosh'' and the Module Index may say ``Mac''. | |
| % Please use a name that has already been used whenever applicable. If this | |
| % is omitted, no availability statement is produced or implied. | |
| % | |
| % \platform{Unix} | |
| % These apply to all modules, and may be given more than once: | |
| \moduleauthor{Joe Gregorio}{joe@bitworking.org} % Author of the module code; | |
| % omit if not known. | |
| \sectionauthor{Joe Gregorio}{joe@bitworking.org} % Author of the documentation, | |
| % even if not a module section. | |
| % Leave at least one blank line after this, to simplify ad-hoc tools | |
| % that are sometimes used to massage these files. | |
| \modulesynopsis{A comprehensive HTTP client library, \module{httplib2} supports many features left out of other HTTP libraries.} | |
| % ==== 2. ==== | |
| % Give a short overview of what the module does. | |
| % If it is platform specific, mention this. | |
| % Mention other important restrictions or general operating principles. | |
| % For example: | |
| The \module{httplib2} module is a comprehensive HTTP client library with the following features: | |
| \begin{description} | |
| \item[HTTP and HTTPS] HTTPS support is only available if the socket module was compiled with SSL support. | |
| \item[Keep-Alive] Supports HTTP 1.1 Keep-Alive, keeping the socket open and performing multiple requests over the same connection if possible. | |
| \item[Authentication] The following three types of HTTP Authentication are supported. These can be used over both HTTP and HTTPS. | |
| \begin{itemize} | |
| \item Digest | |
| \item Basic | |
| \item WSSE | |
| \end{itemize} | |
| \item[Caching] | |
| The module can optionally operate with a private cache that understands the Cache-Control: header and uses both the ETag and Last-Modified cache validators. | |
| \item[All Methods] | |
| The module can handle any HTTP request method, not just GET and POST. | |
| \item[Redirects] | |
| Automatically follows 3XX redirects on GETs. | |
| \item[Compression] | |
| Handles both 'deflate' and 'gzip' types of compression. | |
| \item[Proxies] | |
| If the Socksipy module is installed then httplib2 can handle sock4, sock5 and http proxies. | |
| \item[Lost update support] | |
| Automatically adds back ETags into PUT requests to resources we have already cached. This implements Section 3.2 of Detecting the Lost Update Problem Using Unreserved Checkout | |
| \end{description} | |
| % ==== 3. ==== | |
| % List the public functions defined by the module. Begin with a | |
| % standard phrase. You may also list the exceptions and other data | |
| % items defined in the module, insofar as they are important for the | |
| % user. | |
| The \module{httplib2} module defines the following variables: | |
| % ---- 3.2. ---- | |
| % Data items are described using a ``datadesc'' block. This has only | |
| % one parameter: the item's name. | |
| \begin{datadesc}{debuglevel} | |
| The amount of debugging information to print. The default is 0. | |
| \end{datadesc} | |
| \begin{datadesc}{RETRIES} | |
| A request will be tried 'RETRIES' times if it fails at the socket/connection level. | |
| The default is 2. | |
| \end{datadesc} | |
| % --- 3.3. --- | |
| % Exceptions are described using a ``excdesc'' block. This has only | |
| % one parameter: the exception name. Exceptions defined as classes in | |
| % the source code should be documented using this environment, but | |
| % constructor parameters must be omitted. | |
| The \module{httplib2} module may raise the following Exceptions. Note that | |
| there is an option that turns exceptions into | |
| normal responses with an HTTP status code indicating | |
| an error occured. See \member{Http.force_exception_to_status_code} | |
| \begin{excdesc}{HttpLib2Error} | |
| The Base Exception for all exceptions raised by httplib2. | |
| \end{excdesc} | |
| \begin{excdesc}{RedirectMissingLocation} | |
| A 3xx redirect response code was provided but no Location: header | |
| was provided to point to the new location. | |
| \end{excdesc} | |
| \begin{excdesc}{RedirectLimit} | |
| The maximum number of redirections was reached without coming to a final URI. | |
| \end{excdesc} | |
| \begin{excdesc}{ServerNotFoundError} | |
| Unable to resolve the host name given. | |
| \end{excdesc} | |
| \begin{excdesc}{RelativeURIError} | |
| A relative, as opposed to an absolute URI, was passed into request(). | |
| \end{excdesc} | |
| \begin{excdesc}{FailedToDecompressContent} | |
| The headers claimed that the content of the response was compressed but the | |
| decompression algorithm applied to the content failed. | |
| \end{excdesc} | |
| \begin{excdesc}{UnimplementedDigestAuthOptionError} | |
| The server requested a type of Digest authentication that we | |
| are unfamiliar with. | |
| \end{excdesc} | |
| \begin{excdesc}{UnimplementedHmacDigestAuthOptionError} | |
| The server requested a type of HMACDigest authentication that we | |
| are unfamiliar with. | |
| \end{excdesc} | |
| % ---- 3.4. ---- | |
| % Other standard environments: | |
| % | |
| % classdesc - Python classes; same arguments are funcdesc | |
| % methoddesc - methods, like funcdesc but has an optional parameter | |
| % to give the type name: \begin{methoddesc}[mytype]{name}{args} | |
| % By default, the type name will be the name of the | |
| % last class defined using classdesc. The type name | |
| % is required if the type is implemented in C (because | |
| % there's no classdesc) or if the class isn't directly | |
| % documented (if it's private). | |
| % memberdesc - data members, like datadesc, but with an optional | |
| % type name like methoddesc. | |
| \begin{classdesc}{Http}{\optional{cache=None}, \optional{timeout=None}, \optional{proxy_info=None}} | |
| The class that represents a client HTTP interface. | |
| The \var{cache} parameter is either the name of a directory | |
| to be used as a flat file cache, or it must an object that | |
| implements the required caching interface. | |
| The \var{timeout} parameter is the socket level timeout. | |
| The \var{proxy_info} is an instance of \class{ProxyInfo} and is supplied | |
| if a proxy is to be used. Note that the Socksipy module must be | |
| installed for proxy support to work. | |
| \end{classdesc} | |
| \begin{classdesc}{Response}{info} | |
| Response is a subclass of \class{dict} and instances of this | |
| class are returned from calls | |
| to Http.request. The \var{info} parameter is either | |
| an \class{rfc822.Message} or an \class{httplib.HTTPResponse} object. | |
| \end{classdesc} | |
| \begin{classdesc}{FileCache}{dir_name, \optional{safe=safename}} | |
| FileCache implements a Cache as a directory of files. | |
| The \var{dir_name} parameter is | |
| the name of the directory to use. If the directory does | |
| not exist then FileCache attempts to create the directory. | |
| The optional \var{safe} parameter is a funtion which generates | |
| the cache filename for each URI. A FileCache object is | |
| constructed and used for caching when you pass a directory name | |
| into the constructor of \class{Http}. | |
| \end{classdesc} | |
| \begin{classdesc}{ProxyInfo}{proxy_type, proxy_host, proxy_port, \optional{proxy_rdns=None}, \optional{proxy_user=None}, \optional{proxy_pass=None}} | |
| The parameter \var{proxy_type} must be set to one of socks.PROXY_TYPE_XXX | |
| constants. The \var{proxy_host} and \var{proxy_port} must be set to the location | |
| of the proxy. The optional \var{proxy_rdns} should be set to True if | |
| the DNS server on the proxy should be used. The \var{proxy_user} and | |
| \var{proxy_pass} are supplied when the proxy is protected by authentication. | |
| \end{classdesc} | |
| % If your module defines new object types (for a built-in module) or | |
| % classes (for a module written in Python), you should list the | |
| % methods and instance variables (if any) of each type or class in a | |
| % separate subsection. | |
| \subsection{Http Objects} | |
| \label{http-objects} | |
| % This label is generally useful for referencing this section, but is | |
| % also used to give a filename when generating HTML. | |
| Http objects have the following methods: | |
| \begin{methoddesc}[Http]{request}{uri, \optional{method="GET", body=None, headers=None, redirections=DEFAULT_MAX_REDIRECTS, connection_type=None}} | |
| Performs a single HTTP request. | |
| The \var{uri} is the URI of the HTTP resource and can begin with either \code{http} or \code{https}. The value of \var{uri} must be an absolute URI. | |
| The \var{method} is the HTTP method to perform, such as \code{GET}, \code{POST}, \code{DELETE}, etc. There is no restriction | |
| on the methods allowed. | |
| The \var{body} is the entity body to be sent with the request. It is a string | |
| object. | |
| Any extra headers that are to be sent with the request should be provided in the | |
| \var{headers} dictionary. | |
| The maximum number of redirect to follow before raising an exception is \var{redirections}. The default is 5. | |
| The \var{connection_type} is the type of connection object to use. The supplied class | |
| should implement the interface of httplib.HTTPConnection. | |
| The return value is a tuple of (response, content), the first being and instance of the | |
| \class{Response} class, the second being a string that contains the response entity body. | |
| \end{methoddesc} | |
| \begin{methoddesc}[Http]{add_credentials}{name, password, \optional{domain=None}} | |
| Adds a name and password that will be used when a request | |
| requires authentication. Supplying the optional \var{domain} name will | |
| restrict these credentials to only be sent to the specified | |
| domain. If \var{domain} is not specified then the given credentials will | |
| be used to try to satisfy every HTTP 401 challenge. | |
| \end{methoddesc} | |
| \begin{methoddesc}[Http]{add_certificate}{key, cert, domain} | |
| Add a \var{key} and \var{cert} that will be used for an SSL connection | |
| to the specified domain. \var{keyfile} is the name of a PEM formatted | |
| file that contains your private key. \var{certfile} is a PEM formatted certificate chain file. | |
| \end{methoddesc} | |
| \begin{methoddesc}[Http]{clear_credentials}{} | |
| Remove all the names and passwords used for authentication. | |
| \end{methoddesc} | |
| \begin{memberdesc}[Http]{follow_redirects} | |
| If \code{True}, which is the default, safe redirects are followed, where | |
| safe means that the client is only doing a \code{GET} or \code{HEAD} on the | |
| URI to which it is being redirected. If \code{False} then no redirects are followed. | |
| Note that a False 'follow_redirects' takes precedence over a True 'follow_all_redirects'. | |
| Another way of saying that is for 'follow_all_redirects' to have any affect, 'follow_redirects' | |
| must be True. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Http]{forward_authorization_headers} | |
| If \code{False}, which is the default, then Authorization: headers are | |
| stripped from redirects. If \code{True} then Authorization: headers are left | |
| in place when following redirects. This parameter only applies if following | |
| redirects is turned on. Note that turning this on could cause your credentials | |
| to leak, so carefully consider the consequences. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Http]{follow_all_redirects} | |
| If \code{False}, which is the default, only safe redirects are followed, where | |
| safe means that the client is only doing a \code{GET} or \code{HEAD} on the | |
| URI to which it is being redirected. If \code{True} then all redirects are followed. | |
| Note that a False 'follow_redirects' takes precedence over a True 'follow_all_redirects'. | |
| Another way of saying that is for 'follow_all_redirects' to have any affect, 'follow_redirects' | |
| must be True. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Http]{force_exception_to_status_code} | |
| If \code{True}, which is the default, then no \module{httplib2} exceptions will be thrown. Instead, | |
| those error conditions will be turned into \class{Response} objects | |
| that will be returned normally. | |
| If \code{False}, then exceptions will be thrown. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Http]{ignore_etag} | |
| Defaults to \code{False}. If \code{True}, then any etags present in the cached response | |
| are ignored when processing the current request, i.e. httplib2 does \strong{not} use | |
| 'if-match' for PUT or 'if-none-match' when GET or HEAD requests are made. This | |
| is mainly to deal with broken servers which supply an etag, but change it capriciously. | |
| \end{memberdesc} | |
| \subsection{Cache Objects} | |
| \label{cache-objects} | |
| % This label is generally useful for referencing this section, but is | |
| % also used to give a filename when generating HTML. | |
| If you wish to supply your own caching implementation | |
| then you will need to pass in an object that supports the | |
| following methods. Note that the \module{memcache} module | |
| supports this interface natively. | |
| \begin{methoddesc}[Cache]{get}{key} | |
| Takes a string \var{key} and returns the value as a string. | |
| \end{methoddesc} | |
| \begin{methoddesc}[Cache]{set}{key, value} | |
| Takes a string \var{key} and \var{value} and stores it in the cache. | |
| \end{methoddesc} | |
| \begin{methoddesc}[Cache]{delete}{key} | |
| Deletes the cached value stored at \var{key}. The value | |
| of \var{key} is a string. | |
| \end{methoddesc} | |
| \subsection{Response Objects} | |
| \label{response-objects} | |
| % This label is generally useful for referencing this section, but is | |
| % also used to give a filename when generating HTML. | |
| Response objects are derived from \class{dict} and map | |
| header names (lower case with the trailing colon removed) | |
| to header values. In addition to the dict methods | |
| a Response object also has: | |
| \begin{memberdesc}[Response]{fromcache} | |
| If \code{true} the the response was returned from the cache. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Response]{version} | |
| The version of HTTP that the server supports. A value | |
| of 11 means '1.1'. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Response]{status} | |
| The numerical HTTP status code returned in the response. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Response]{reason} | |
| The human readable component of the HTTP response status code. | |
| \end{memberdesc} | |
| \begin{memberdesc}[Response]{previous} | |
| If redirects are followed then the \class{Response} object returned | |
| is just for the very last HTTP request and \var{previous} points to | |
| the previous \class{Response} object. In this manner they form a chain | |
| going back through the responses to the very first response. | |
| Will be \code{None} if there are no previous respones. | |
| \end{memberdesc} | |
| The Response object also populates the header \code{content-location}, that | |
| contains the URI that was ultimately requested. This is useful if | |
| redirects were encountered, you can determine the ultimate URI that | |
| the request was sent to. All Response objects contain this key value, | |
| including \code{previous} responses so you can determine the entire | |
| chain of redirects. If \member{Http.force_exception_to_status_code} is \code{True} | |
| and the number of redirects has exceeded the number of allowed number | |
| of redirects then the \class{Response} object will report the error | |
| in the status code, but the complete chain of previous responses will | |
| still be in tact. | |
| % ==== 4. ==== | |
| % Now is probably a good time for a complete example. (Alternatively, | |
| % an example giving the flavor of the module may be given before the | |
| % detailed list of functions.) | |
| \subsection{Examples \label{httplib2-example}} | |
| To do a simple \code{GET} request just supply the absolute URI | |
| of the resource: | |
| \begin{verbatim} | |
| import httplib2 | |
| h = httplib2.Http() | |
| resp, content = h.request("http://bitworking.org/") | |
| assert resp.status == 200 | |
| assert resp['content-type'] == 'text/html' | |
| \end{verbatim} | |
| Here is more complex example that does a PUT | |
| of some text to a resource that requires authentication. | |
| The Http instance also uses a file cache | |
| in the directory \code{.cache}. | |
| \begin{verbatim} | |
| import httplib2 | |
| h = httplib2.Http(".cache") | |
| h.add_credentials('name', 'password') | |
| resp, content = h.request("https://example.org/chap/2", | |
| "PUT", body="This is text", | |
| headers={'content-type':'text/plain'} ) | |
| \end{verbatim} | |
| Here is an example that connects to a server that | |
| supports the Atom Publishing Protocol. | |
| \begin{verbatim} | |
| import httplib2 | |
| h = httplib2.Http() | |
| h.add_credentials(myname, mypasswd) | |
| h.follow_all_redirects = True | |
| headers = {'Content-Type': 'application/atom+xml'} | |
| body = """<?xml version="1.0" ?> | |
| <entry xmlns="http://www.w3.org/2005/Atom"> | |
| <title>Atom-Powered Robots Run Amok</title> | |
| <id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id> | |
| <updated>2003-12-13T18:30:02Z</updated> | |
| <author><name>John Doe</name></author> | |
| <content>Some text.</content> | |
| </entry> | |
| """ | |
| uri = "http://www.example.com/collection/" | |
| resp, content = h.request(uri, "POST", body=body, headers=headers) | |
| \end{verbatim} | |
| % Note that there is no trailing ">>> " prompt shown. | |
| Here is an example of providing data to an HTML form processor. | |
| In this case we presume this is a POST form. We need to take our | |
| data and format it as "application/x-www-form-urlencoded" data and use that as a | |
| body for a POST request. | |
| \begin{verbatim} | |
| >>> import httplib2 | |
| >>> import urllib | |
| >>> data = {'name': 'fred', 'address': '123 shady lane'} | |
| >>> body = urllib.urlencode(data) | |
| >>> body | |
| 'name=fred&address=123+shady+lane' | |
| >>> h = httplib2.Http() | |
| >>> resp, content = h.request("http://example.com", method="POST", body=body) | |
| \end{verbatim} | |
| % Note that there is no trailing ">>> " prompt shown. | |
| Here is an example of using a proxy server: | |
| \begin{verbatim} | |
| import httplib2 | |
| import socks | |
| httplib2.debuglevel=4 | |
| h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 8000)) | |
| r,c = h.request("http://bitworking.org/news/") | |
| \end{verbatim} | |