\section{\module{urllib} ---
         Open arbitrary resources by URL}

\declaremodule{standard}{urllib}
\modulesynopsis{Open an arbitrary network resource by URL (requires sockets).}

\index{WWW}
\index{World Wide Web}
\index{URL}


This module provides a high-level interface for fetching data across
the World Wide Web.  In particular, the \function{urlopen()} function
is similar to the built-in function \function{open()}, but accepts
Universal Resource Locators (URLs) instead of filenames.  Some
restrictions apply --- it can only open URLs for reading, and no seek
operations are available.

It defines the following public functions:

\begin{funcdesc}{urlopen}{url\optional{, data\optional{, proxies}}}
Open a network object denoted by a URL for reading.  If the URL does
not have a scheme identifier, or if it has \file{file:} as its scheme
identifier, this opens a local file (without universal newlines);
otherwise it opens a socket to a server somewhere on the network.  If
the connection cannot be made, or if the server returns an error code,
the \exception{IOError} exception is raised.  If all went well, a
file-like object is returned.  This supports the following methods:
\method{read()}, \method{readline()}, \method{readlines()}, \method{fileno()},
\method{close()}, \method{info()} and \method{geturl()}.  It also has
proper support for the iterator protocol.
One caveat: the \method{read()} method, if the size argument is
omitted or negative, may not read until the end of the data stream;
there is no good way to determine that the entire stream from a socket
has been read in the general case.

Except for the \method{info()} and \method{geturl()} methods,
these methods have the same interface as for
file objects --- see section \ref{bltin-file-objects} in this
manual.  (It is not a built-in file object, however, so it can't be
used at those few places where a true built-in file object is
required.)

The \method{info()} method returns an instance of the class
\class{mimetools.Message} containing meta-information associated
with the URL.  When the method is HTTP, these headers are those
returned by the server at the head of the retrieved HTML page
(including Content-Length and Content-Type).  When the method is FTP,
a Content-Length header will be present if (as is now usual) the
server passed back a file length in response to the FTP retrieval
request. A Content-Type header will be present if the MIME type can
be guessed.  When the method is local-file, returned headers will include
a Date representing the file's last-modified time, a Content-Length
giving file size, and a Content-Type containing a guess at the file's
type. See also the description of the
\refmodule{mimetools}\refstmodindex{mimetools} module.

The \method{geturl()} method returns the real URL of the page.  In
some cases, the HTTP server redirects a client to another URL.  The
\function{urlopen()} function handles this transparently, but in some
cases the caller needs to know which URL the client was redirected
to.  The \method{geturl()} method can be used to get at this
redirected URL.

If the \var{url} uses the \file{http:} scheme identifier, the optional
\var{data} argument may be given to specify a \code{POST} request
(normally the request type is \code{GET}).  The \var{data} argument
must be in standard \mimetype{application/x-www-form-urlencoded} format;
see the \function{urlencode()} function below.

The \function{urlopen()} function works transparently with proxies
which do not require authentication.  In a \UNIX{} or Windows
environment, set the \envvar{http_proxy}, \envvar{ftp_proxy} or
\envvar{gopher_proxy} environment variables to a URL that identifies
the proxy server before starting the Python interpreter.  For example
(the \character{\%} is the command prompt):

\begin{verbatim}
% http_proxy="http://www.someproxy.com:3128"
% export http_proxy
% python
...
\end{verbatim}

In a Windows environment, if no proxy environment variables are set,
proxy settings are obtained from the registry's Internet Settings
section.

In a Macintosh environment, \function{urlopen()} will retrieve proxy
information from Internet\index{Internet Config} Config.

Alternatively, the optional \var{proxies} argument may be used to
explicitly specify proxies.  It must be a dictionary mapping scheme
names to proxy URLs, where an empty dictionary causes no proxies to be
used, and \code{None} (the default value) causes environmental proxy
settings to be used as discussed above.  For example:

\begin{verbatim}
# Use http://www.someproxy.com:3128 for http proxying
proxies = {'http': 'http://www.someproxy.com:3128'}
filehandle = urllib.urlopen(some_url, proxies=proxies)
# Don't use any proxies
filehandle = urllib.urlopen(some_url, proxies={})
# Use proxies from environment - both versions are equivalent
filehandle = urllib.urlopen(some_url, proxies=None)
filehandle = urllib.urlopen(some_url)
\end{verbatim}

The \function{urlopen()} function does not support explicit proxy
specification.  If you need to override environmental proxy settings,
use \class{URLopener}, or a subclass such as \class{FancyURLopener}.

Proxies which require authentication for use are not currently
supported; this is considered an implementation limitation.

\versionchanged[Added the \var{proxies} support]{2.3}
\end{funcdesc}

\begin{funcdesc}{urlretrieve}{url\optional{, filename\optional{,
                              reporthook\optional{, data}}}}
Copy a network object denoted by a URL to a local file, if necessary.
If the URL points to a local file, or a valid cached copy of the
object exists, the object is not copied.  Return a tuple
\code{(\var{filename}, \var{headers})} where \var{filename} is the
local file name under which the object can be found, and \var{headers}
is whatever the \method{info()} method of the object returned by
\function{urlopen()} returned (for a remote object, possibly cached).
Exceptions are the same as for \function{urlopen()}.

The second argument, if present, specifies the file location to copy
to (if absent, the location will be a tempfile with a generated name).
The third argument, if present, is a hook function that will be called
once on establishment of the network connection and once after each
block read thereafter.  The hook will be passed three arguments; a
count of blocks transferred so far, a block size in bytes, and the
total size of the file.  The third argument may be \code{-1} on older
FTP servers which do not return a file size in response to a retrieval
request.

If the \var{url} uses the \file{http:} scheme identifier, the optional
\var{data} argument may be given to specify a \code{POST} request
(normally the request type is \code{GET}).  The \var{data} argument
must in standard \mimetype{application/x-www-form-urlencoded} format;
see the \function{urlencode()} function below.

\versionchanged[
\function{urlretrieve()} will raise \exception{ContentTooShortError}
when it detects that the amount of data available 
was less than the expected amount (which is the size reported by a 
\var{Content-Length} header). This can occur, for example, when the 
download is interrupted.

The \var{Content-Length} is treated as a lower bound: if there's more data 
to read, urlretrieve reads more data, but if less data is available, 
it raises the exception.

You can still retrieve the downloaded data in this case, it is stored 
in the \member{content} attribute of the exception instance.

If no \var{Content-Length} header was supplied, urlretrieve can
not check the size of the data it has downloaded, and just returns it. 
In this case you just have to assume that the download was successful]{2.5}

\end{funcdesc}

\begin{datadesc}{_urlopener}
The public functions \function{urlopen()} and
\function{urlretrieve()} create an instance of the
\class{FancyURLopener} class and use it to perform their requested
actions.  To override this functionality, programmers can create a
subclass of \class{URLopener} or \class{FancyURLopener}, then assign
an instance of that class to the
\code{urllib._urlopener} variable before calling the desired function.
For example, applications may want to specify a different
\mailheader{User-Agent} header than \class{URLopener} defines.  This
can be accomplished with the following code:

\begin{verbatim}
import urllib

class AppURLopener(urllib.FancyURLopener):
    version = "App/1.7"

urllib._urlopener = AppURLopener()
\end{verbatim}
\end{datadesc}

\begin{funcdesc}{urlcleanup}{}
Clear the cache that may have been built up by previous calls to
\function{urlretrieve()}.
\end{funcdesc}

\begin{funcdesc}{quote}{string\optional{, safe}}
Replace special characters in \var{string} using the \samp{\%xx} escape.
Letters, digits, and the characters \character{_.-} are never quoted.
The optional \var{safe} parameter specifies additional characters
that should not be quoted --- its default value is \code{'/'}.

Example: \code{quote('/\~{}connolly/')} yields \code{'/\%7econnolly/'}.
\end{funcdesc}

\begin{funcdesc}{quote_plus}{string\optional{, safe}}
Like \function{quote()}, but also replaces spaces by plus signs, as
required for quoting HTML form values.  Plus signs in the original
string are escaped unless they are included in \var{safe}.  It also
does not have \var{safe} default to \code{'/'}.
\end{funcdesc}

\begin{funcdesc}{unquote}{string}
Replace \samp{\%xx} escapes by their single-character equivalent.

Example: \code{unquote('/\%7Econnolly/')} yields \code{'/\~{}connolly/'}.
\end{funcdesc}

\begin{funcdesc}{unquote_plus}{string}
Like \function{unquote()}, but also replaces plus signs by spaces, as
required for unquoting HTML form values.
\end{funcdesc}

\begin{funcdesc}{urlencode}{query\optional{, doseq}}
Convert a mapping object or a sequence of two-element tuples  to a
``url-encoded'' string, suitable to pass to
\function{urlopen()} above as the optional \var{data} argument.  This
is useful to pass a dictionary of form fields to a \code{POST}
request.  The resulting string is a series of
\code{\var{key}=\var{value}} pairs separated by \character{\&}
characters, where both \var{key} and \var{value} are quoted using
\function{quote_plus()} above.  If the optional parameter \var{doseq} is
present and evaluates to true, individual \code{\var{key}=\var{value}} pairs
are generated for each element of the sequence.
When a sequence of two-element tuples is used as the \var{query} argument,
the first element of each tuple is a key and the second is a value.  The
order of parameters in the encoded string will match the order of parameter
tuples in the sequence.
The \refmodule{cgi} module provides the functions
\function{parse_qs()} and \function{parse_qsl()} which are used to
parse query strings into Python data structures.
\end{funcdesc}

\begin{funcdesc}{pathname2url}{path}
Convert the pathname \var{path} from the local syntax for a path to
the form used in the path component of a URL.  This does not produce a
complete URL.  The return value will already be quoted using the
\function{quote()} function.
\end{funcdesc}

\begin{funcdesc}{url2pathname}{path}
Convert the path component \var{path} from an encoded URL to the local
syntax for a path.  This does not accept a complete URL.  This
function uses \function{unquote()} to decode \var{path}.
\end{funcdesc}

\begin{classdesc}{URLopener}{\optional{proxies\optional{, **x509}}}
Base class for opening and reading URLs.  Unless you need to support
opening objects using schemes other than \file{http:}, \file{ftp:},
\file{gopher:} or \file{file:}, you probably want to use
\class{FancyURLopener}.

By default, the \class{URLopener} class sends a
\mailheader{User-Agent} header of \samp{urllib/\var{VVV}}, where
\var{VVV} is the \module{urllib} version number.  Applications can
define their own \mailheader{User-Agent} header by subclassing
\class{URLopener} or \class{FancyURLopener} and setting the class
attribute \member{version} to an appropriate string value in the
subclass definition.

The optional \var{proxies} parameter should be a dictionary mapping
scheme names to proxy URLs, where an empty dictionary turns proxies
off completely.  Its default value is \code{None}, in which case
environmental proxy settings will be used if present, as discussed in
the definition of \function{urlopen()}, above.

Additional keyword parameters, collected in \var{x509}, are used for
authentication with the \file{https:} scheme.  The keywords
\var{key_file} and \var{cert_file} are supported; both are needed to
actually retrieve a resource at an \file{https:} URL.
\end{classdesc}

\begin{classdesc}{FancyURLopener}{...}
\class{FancyURLopener} subclasses \class{URLopener} providing default
handling for the following HTTP response codes: 301, 302, 303, 307 and
401.  For the 30x response codes listed above, the
\mailheader{Location} header is used to fetch the actual URL.  For 401
response codes (authentication required), basic HTTP authentication is
performed.  For the 30x response codes, recursion is bounded by the
value of the \var{maxtries} attribute, which defaults to 10.

\note{According to the letter of \rfc{2616}, 301 and 302 responses to
  POST requests must not be automatically redirected without
  confirmation by the user.  In reality, browsers do allow automatic
  redirection of these responses, changing the POST to a GET, and
  \module{urllib} reproduces this behaviour.}

The parameters to the constructor are the same as those for
\class{URLopener}.

\note{When performing basic authentication, a
\class{FancyURLopener} instance calls its
\method{prompt_user_passwd()} method.  The default implementation asks
the users for the required information on the controlling terminal.  A
subclass may override this method to support more appropriate behavior
if needed.}
\end{classdesc}

\begin{excclassdesc}{ContentTooShortError}{msg\optional{, content}}
This exception is raised when the \function{urlretrieve()} function
detects that the amount of the downloaded data is less than the 
expected amount (given by the \var{Content-Length} header). The
\member{content} attribute stores the downloaded (and supposedly
truncated) data.
\versionadded{2.5}
\end{excclassdesc}

Restrictions:

\begin{itemize}

\item
Currently, only the following protocols are supported: HTTP, (versions
0.9 and 1.0), Gopher (but not Gopher-+), FTP, and local files.
\indexii{HTTP}{protocol}
\indexii{Gopher}{protocol}
\indexii{FTP}{protocol}

\item
The caching feature of \function{urlretrieve()} has been disabled
until I find the time to hack proper processing of Expiration time
headers.

\item
There should be a function to query whether a particular URL is in
the cache.

\item
For backward compatibility, if a URL appears to point to a local file
but the file can't be opened, the URL is re-interpreted using the FTP
protocol.  This can sometimes cause confusing error messages.

\item
The \function{urlopen()} and \function{urlretrieve()} functions can
cause arbitrarily long delays while waiting for a network connection
to be set up.  This means that it is difficult to build an interactive
Web client using these functions without using threads.

\item
The data returned by \function{urlopen()} or \function{urlretrieve()}
is the raw data returned by the server.  This may be binary data
(such as an image), plain text or (for example) HTML\index{HTML}.  The
HTTP\indexii{HTTP}{protocol} protocol provides type information in the
reply header, which can be inspected by looking at the
\mailheader{Content-Type} header.  For the
Gopher\indexii{Gopher}{protocol} protocol, type information is encoded
in the URL; there is currently no easy way to extract it.  If the
returned data is HTML, you can use the module
\refmodule{htmllib}\refstmodindex{htmllib} to parse it.

\item
The code handling the FTP\index{FTP} protocol cannot differentiate
between a file and a directory.  This can lead to unexpected behavior
when attempting to read a URL that points to a file that is not
accessible.  If the URL ends in a \code{/}, it is assumed to refer to
a directory and will be handled accordingly.  But if an attempt to
read a file leads to a 550 error (meaning the URL cannot be found or
is not accessible, often for permission reasons), then the path is
treated as a directory in order to handle the case when a directory is
specified by a URL but the trailing \code{/} has been left off.  This can
cause misleading results when you try to fetch a file whose read
permissions make it inaccessible; the FTP code will try to read it,
fail with a 550 error, and then perform a directory listing for the
unreadable file. If fine-grained control is needed, consider using the
\module{ftplib} module, subclassing \class{FancyURLOpener}, or changing
\var{_urlopener} to meet your needs.

\item
This module does not support the use of proxies which require
authentication.  This may be implemented in the future.

\item
Although the \module{urllib} module contains (undocumented) routines
to parse and unparse URL strings, the recommended interface for URL
manipulation is in module \refmodule{urlparse}\refstmodindex{urlparse}.

\end{itemize}


\subsection{URLopener Objects \label{urlopener-objs}}
\sectionauthor{Skip Montanaro}{skip@mojam.com}

\class{URLopener} and \class{FancyURLopener} objects have the
following attributes.

\begin{methoddesc}[URLopener]{open}{fullurl\optional{, data}}
Open \var{fullurl} using the appropriate protocol.  This method sets
up cache and proxy information, then calls the appropriate open method with
its input arguments.  If the scheme is not recognized,
\method{open_unknown()} is called.  The \var{data} argument
has the same meaning as the \var{data} argument of \function{urlopen()}.
\end{methoddesc}

\begin{methoddesc}[URLopener]{open_unknown}{fullurl\optional{, data}}
Overridable interface to open unknown URL types.
\end{methoddesc}

\begin{methoddesc}[URLopener]{retrieve}{url\optional{,
                                        filename\optional{,
                                        reporthook\optional{, data}}}}
Retrieves the contents of \var{url} and places it in \var{filename}.  The
return value is a tuple consisting of a local filename and either a
\class{mimetools.Message} object containing the response headers (for remote
URLs) or \code{None} (for local URLs).  The caller must then open and read the
contents of \var{filename}.  If \var{filename} is not given and the URL
refers to a local file, the input filename is returned.  If the URL is
non-local and \var{filename} is not given, the filename is the output of
\function{tempfile.mktemp()} with a suffix that matches the suffix of the last
path component of the input URL.  If \var{reporthook} is given, it must be
a function accepting three numeric parameters.  It will be called after each
chunk of data is read from the network.  \var{reporthook} is ignored for
local URLs.

If the \var{url} uses the \file{http:} scheme identifier, the optional
\var{data} argument may be given to specify a \code{POST} request
(normally the request type is \code{GET}).  The \var{data} argument
must in standard \mimetype{application/x-www-form-urlencoded} format;
see the \function{urlencode()} function below.
\end{methoddesc}

\begin{memberdesc}[URLopener]{version}
Variable that specifies the user agent of the opener object.  To get
\refmodule{urllib} to tell servers that it is a particular user agent,
set this in a subclass as a class variable or in the constructor
before calling the base constructor.
\end{memberdesc}

The \class{FancyURLopener} class offers one additional method that
should be overloaded to provide the appropriate behavior:

\begin{methoddesc}[FancyURLopener]{prompt_user_passwd}{host, realm}
Return information needed to authenticate the user at the given host
in the specified security realm.  The return value should be a tuple,
\code{(\var{user}, \var{password})}, which can be used for basic
authentication.

The implementation prompts for this information on the terminal; an
application should override this method to use an appropriate
interaction model in the local environment.
\end{methoddesc}


\subsection{Examples}
\nodename{Urllib Examples}

Here is an example session that uses the \samp{GET} method to retrieve
a URL containing parameters:

\begin{verbatim}
>>> import urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query?%s" % params)
>>> print f.read()
\end{verbatim}

The following example uses the \samp{POST} method instead:

\begin{verbatim}
>>> import urllib
>>> params = urllib.urlencode({'spam': 1, 'eggs': 2, 'bacon': 0})
>>> f = urllib.urlopen("http://www.musi-cal.com/cgi-bin/query", params)
>>> print f.read()
\end{verbatim}

The following example uses an explicitly specified HTTP proxy,
overriding environment settings:

\begin{verbatim}
>>> import urllib
>>> proxies = {'http': 'http://proxy.example.com:8080/'}
>>> opener = urllib.FancyURLopener(proxies)
>>> f = opener.open("http://www.python.org")
>>> f.read()
\end{verbatim}

The following example uses no proxies at all, overriding environment
settings:

\begin{verbatim}
>>> import urllib
>>> opener = urllib.FancyURLopener({})
>>> f = opener.open("http://www.python.org/")
>>> f.read()
\end{verbatim}
