# abstract factory for opener
import base64
-import ftplib
-import httplib
-import inspect
import hashlib
-import mimetypes
+import httplib
import mimetools
import os
import posixpath
import time
import urlparse
import bisect
-import cookielib
try:
from cStringIO import StringIO
class GopherError(URLError):
pass
+# copied from cookielib.py
+cut_port_re = re.compile(r":\d+$")
+def request_host(request):
+ """Return request-host, as defined by RFC 2965.
+
+ Variation from RFC: returned value is lowercased, for convenient
+ comparison.
+
+ """
+ url = request.get_full_url()
+ host = urlparse.urlparse(url)[1]
+ if host == "":
+ host = request.get_header("Host", "")
+
+ # remove port, if present
+ host = cut_port_re.sub("", host, 1)
+ return host.lower()
class Request:
self.add_header(key, value)
self.unredirected_hdrs = {}
if origin_req_host is None:
- origin_req_host = cookielib.request_host(self)
+ origin_req_host = request_host(self)
self.origin_req_host = origin_req_host
self.unverifiable = unverifiable
If any of the handlers passed as arguments are subclasses of the
default handlers, the default handlers will not be used.
"""
+ import types
+ def isclass(obj):
+ return isinstance(obj, types.ClassType) or hasattr(obj, "__bases__")
opener = OpenerDirector()
default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
skip = []
for klass in default_classes:
for check in handlers:
- if inspect.isclass(check):
+ if isclass(check):
if issubclass(check, klass):
skip.append(klass)
elif isinstance(check, klass):
opener.add_handler(klass())
for h in handlers:
- if inspect.isclass(h):
+ if isclass(h):
h = h()
opener.add_handler(h)
return opener
class HTTPCookieProcessor(BaseHandler):
def __init__(self, cookiejar=None):
+ import cookielib
if cookiejar is None:
cookiejar = cookielib.CookieJar()
self.cookiejar = cookiejar
# not entirely sure what the rules are here
def open_local_file(self, req):
import email.Utils
+ import mimetypes
host = req.get_host()
file = req.get_selector()
localfile = url2pathname(file)
class FTPHandler(BaseHandler):
def ftp_open(self, req):
+ import ftplib
+ import mimetypes
host = req.get_host()
if not host:
raise IOError, ('ftp error', 'no host given')