FTP with urllib2 behind a proxy

Anand Pillai pythonguy at Hotpop.com
Thu Aug 14 02:10:10 EDT 2003


jjl at pobox.com (John J. Lee) wrote in message news:<87wudhoh5c.fsf at pobox.com>...
> pythonguy at Hotpop.com (Anand Pillai) writes:
The code obviously caters to the bottom-line, in case
the programmer does not want to worry about environment
variables, would like to install the handlers himself
and his proxy needs authentication.

In the last case, the HTTP_PROXY env variable does not
help and you need to install the proxy handler yourself.
 
I copied this stuff from my program which needs all these
and more ( a USER-AGENT header for example ).

-Anand

> > You need to install a proxyhandler, authhandler,
> > ftphandler and httphandler. Then build yourself
> > an opener, that opens the doors for you ... :-)
> > 
> > The following does the trick.
> > 
> > proxy_handler = urllib2.ProxyHandler( {'http': 'myhttpproxy:80',
> >                                        'https' : 'myhttpsproxy:443',
> >                                        'ftp'    : 'myftpproxy:21' } )
> > 
> > opener= urllib2.build_opener(proxy_handler, urllib2.HTTPBasicAuthHandler(),
> >                              urllib2.HTTPHandler, urllib2.HTTPSHandler,
> >                              urllib2.FTPHandler)
> > 
> > # install this opener
> > urllib2.install_opener(opener)
> > 
> > # Go ahead, knock knock!
> > 
> > req=urlli2.Request('ftp://ftp.gnu.org')
> > data=urllib2.urlopen(req).read()
> 
> A couple of things to add: you don't need to add handlers that already
> get added by default by build_opener (FTPHandler and HTTPHandler, for
> example).  ProxyHandler is one of these default handlers, so if your
> environment is set up for it (http_proxy, etc. environment variables),
> you don't need to supply a ProxyHandler (of course, if your
> environ. *isn't*, then you do need to supply one, to give it the proxy
> details).  You don't need Request objects (unless you want to add
> headers to a Request, or pass Requests around).  You don't need to
> install a global opener, unless your code expects it -- it's just a
> convenience (or an inconvenience, sometimes).
> 
> Actually, did the OP say proxy basic auth. was involved?  Don't
> recall.  I've never needed it for proxies, but there seems to be a
> ProxyBasicAuthHandler in urllib2, so I guess that's what you meant to
> use, rather than HTTPBasicAuthHandler (which is for website auth., not
> proxy auth).
> 
> So, after all that, you end up with:
> 
> opener = urllib2.build_opener(urllib2.ProxyBasicAuthHandler)
> data = opener.open('ftp://ftp.gnu.org').read()
> 
> (I like to close the response explicitly, though)
> 
> 
> John




More information about the Python-list mailing list