Httplib2

--------------------------------------------------------------------
Introduction

A comprehensive HTTP client library, httplib2.py supports many 
features left out of other HTTP libraries.

HTTP and HTTPS
    HTTPS support is only available if the socket module was 
    compiled with SSL support. 
Keep-Alive
    Supports HTTP 1.1 Keep-Alive, keeping the socket open and 
    performing multiple requests over the same connection if 
    possible. 
Authentication
    The following three types of HTTP Authentication are 
    supported. These can be used over both HTTP and HTTPS.

        * Digest
        * Basic
        * WSSE

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. 
All Methods
    The module can handle any HTTP request method, not just GET 
    and POST.
Redirects
    Automatically follows 3XX redirects on GETs.
Compression
    Handles both 'deflate' and 'gzip' types of compression.
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.
Unit Tested
    A large and growing set of unit tests. 


For more information on this module, see:

    http://bitworking.org/projects/httplib2/


--------------------------------------------------------------------
Installation

The httplib2 module is shipped as a distutils package.  To install
the library, unpack the distribution archive, and issue the following
command:

    $ python setup.py install


--------------------------------------------------------------------
Usage
A simple retrieval:

  import httplib2
  h = httplib2.Http(".cache")
  (resp_headers, content) = h.request("http://example.org/", "GET")

The 'content' is the content retrieved from the URL. The content 
is already decompressed or unzipped if necessary.

To PUT some content to a server that uses SSL and Basic authentication:

  import httplib2
  h = httplib2.Http(".cache")
  h.add_credentials('name', 'password')
  (resp, content) = h.request("https://example.org/chapter/2", 
                            "PUT", body="This is text", 
                            headers={'content-type':'text/plain'} )

Use the Cache-Control: header to control how the caching operates.

  import httplib2
  h = httplib2.Http(".cache")
  (resp, content) = h.request("http://bitworking.org/", "GET")
  ...
  (resp, content) = h.request("http://bitworking.org/", "GET", 
                            headers={'cache-control':'no-cache'})

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. 


--------------------------------------------------------------------
Httplib2 Software License

Copyright (c) 2006 by Joe Gregorio

Permission is hereby granted, free of charge, to any person 
obtaining a copy of this software and associated documentation 
files (the "Software"), to deal in the Software without restriction, 
including without limitation the rights to use, copy, modify, merge, 
publish, distribute, sublicense, and/or sell copies of the Software, 
and to permit persons to whom the Software is furnished to do so, 
subject to the following conditions:

The above copyright notice and this permission notice shall be 
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 
SOFTWARE.

