Find file
Fetching contributors…
Cannot retrieve contributors at this time
executable file 208 lines (157 sloc) 7.11 KB
<html>
<head>
<!--#include virtual="header.html" -->
<title>Joe Gregorio | BitWorking | Projects | httplib2.py</title>
</head>
<body class='main' id="top" name="top" >
<div class="body">
<!--#include virtual="titlebar.html" -->
<div class="content">
<div>
<h2>Httplib2</h2>
<p>A comprehensive HTTP client library, <code>httplib2.py</code>
supports many features left out of other HTTP libraries.
</p>
<dl>
<dt>HTTP and HTTPS</dt>
<dd>HTTPS support is only available if the socket module was compiled with SSL support.
</dd>
<dt>Keep-Alive</dt>
<dd>Supports HTTP 1.1 Keep-Alive, keeping the socket
open and performing multiple requests over the same connection
if possible.
</dd>
<dt>Authentication</dt>
<dd>The following types of HTTP Authentication are supported.
These can be used over both HTTP and HTTPS.
<ul>
<li><a href="http://www.faqs.org/rfcs/rfc2617.html">Digest</a></li>
<li><a href="http://www.faqs.org/rfcs/rfc2617.html">Basic</a></li>
<li><a href="http://www.xml.com/pub/a/2003/12/17/dive.html">WSSE</a></li>
<li><a href="http://franklinmint.fm/2006/02/28/draft-sayre-http-hmac-digest.html">HMAC Digest</a></li>
<li><a href="http://code.google.com/apis/accounts/AuthForInstalledApps.html">Google Account Authentication</a></li>
</ul>
</dd>
<dt>Caching</dt>
<dd>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.
</dd>
<dt>All Methods</dt>
<dd>The module can handle any HTTP request method, not just GET and POST.</dd>
<dt>Redirects</dt>
<dd>Automatically follows 3XX redirects on GETs.</dd>
<dt>Compression</dt>
<dd>Handles both 'deflate' and 'gzip' types of compression.</dd>
<dt>Lost update support</dt>
<dd>Automatically adds back ETags into PUT requests to resources
we have already cached. This implements Section 3.2 of
<a href="http://www.w3.org/1999/04/Editing/#Table">Detecting the Lost Update Problem Using Unreserved Checkout</a></dd>
<dt>Unit Tested</dt>
<dd>A large and growing set of unit tests.</dd>
</dl>
<h3>Usage</h3>
<p>A simple retrieval:</p>
<pre><code>import httplib2
h = httplib2.Http(".cache")
resp, content = h.request("http://example.org/", "GET")
</code></pre>
<p>The 'content' is the content retrieved from the URL.
The content is already decompressed or unzipped if necessary.
The 'resp' contains all the response headers.
</p>
<p>To PUT some content to a server that uses SSL
and Basic authentication:</p>
<pre><code>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'} )
</code></pre>
<p>Use the Cache-Control: header to control
how the caching operates.</p>
<pre><code>import httplib2
h = httplib2.Http(".cache")
resp, content = h.request("http://bitworking.org/")
...
resp, content = h.request("http://bitworking.org/",
headers={'cache-control':'no-cache'})
</code></pre>
<p>The first request will be cached and since this is a request to
bitworking.org it will be set to be cached for two hours, because
that is how I have my server configured.
Any subsequent GET to that URI will return the value from the
on-disk cache and no request will be made to the server.
You can use the Cache-Control: header to change the caches behavior and
in this example the second request adds the Cache-Control: header with a value
of 'no-cache' which tells the library that the cached copy
must not be used when handling this request.
</p>
<h3>Requirements</h3>
<p>Requires Python 2.3 or later. Does not require
any libraries beyond what is found in the core library.</p>
<h3>Download/Installation</h3>
<p>The latest release of httplib2 is 0.3.0 and
can be <a href="dist">downloaded from the from
the dist directory</a>. See the
<a href="CHANGELOG">CHANGELOG</a> for what's new in this
version.</p>
<p>The httplib2 module is shipped as a distutils package. To install
the library, first unpack the distribution archive, and issue the following
command:</p>
<pre><code>$ python setup.py install</code></pre>
<p><a href="dist">Download the distribution archives from here</a>. </p>
<p> <a href="test">The resources used in the unit test cases</a>
are available also. More documentation on them will be forthcoming.</p>
<p>You can also get the sources directly from the SourceForge hosted
subversion repository.</p>
<pre>svn co https://httplib2.svn.sourceforge.net/svnroot/httplib2/trunk httplib2</pre>
<h3>Documentation</h3>
<p>In addition to the <a href="ref/">Python library style documentation</a> there
are also two articles on XML.com, <a href="http://www.xml.com/pub/a/2006/02/01/doing-http-caching-right-introducing-httplib2.html">
Doing HTTP Caching Right: Introducing httplib2</a> and
<a href="http://www.xml.com/pub/a/2006/03/29/httplib2-http-persistence-and-authentication.html">
httplib2: HTTP Persistence and Authentication </a>.
</p>
<h3>Feedback</h3>
<p>Bugs and enhancement requests are handled through
<a href="http://sourceforge.net/projects/httplib2/">SourceForge</a>, and anything is up for discussion
on the <a href="http://sourceforge.net/mail/?group_id=161082">httplib2 mailing list</a>.
</p>
<h3>To Do</h3>
<p>This module is not perfect and needs the following:</p>
<ul>
<li>Support for Proxies</li>
<li>A pluggable store for the cache is in place, with plugins for
flat files and memcached.
I eventually want to have plugins that allow keeping the cache in Berkeley DB, MySQL, etc.</li>
<li>More unit tests</li>
</ul>
<h3>Project Goal</h3>
<p>To become a worthy addition to the Python core library.</p>
<h3>Additional Information</h3>
<p>
<dl>
<dt>Author</dt>
<dd>Joe Gregorio</dd>
<dt>License</dt>
<dd>MIT</dd>
<dt>Contributors</dt>
<dd> Thomas Broyer (t.broyer@ltgt.net) </dd>
<dd> James Antill </dd>
<dd> Xavier Verges Farrero </dd>
<dd> Jonathan Feinberg </dd>
<dd> Blair Zajac </dd>
<dd> Sam Ruby</dd>
<dd> Louis Nyffenegger </dd>
<dd> (Your Name Here) </dd>
</dl>
</p>
<p style="font-size: small">This page last updated on: $LastChangedDate$.</p>
</div>
</div>
<!--#include virtual="footer.html" -->
</div>
</body>
</html>