Delay-import some large modules to speed up urllib2 import.

(fixes #1484793).
This commit is contained in:
Georg Brandl 2006-05-17 15:17:00 +00:00
parent e3a25838db
commit 9d6da3e2f2
1 changed files with 28 additions and 8 deletions

View File

@ -85,11 +85,8 @@ f = urllib2.urlopen('http://www.python.org/')
# abstract factory for opener # abstract factory for opener
import base64 import base64
import ftplib
import httplib
import inspect
import hashlib import hashlib
import mimetypes import httplib
import mimetools import mimetools
import os import os
import posixpath import posixpath
@ -100,7 +97,6 @@ import sys
import time import time
import urlparse import urlparse
import bisect import bisect
import cookielib
try: try:
from cStringIO import StringIO from cStringIO import StringIO
@ -168,6 +164,23 @@ class HTTPError(URLError, addinfourl):
class GopherError(URLError): class GopherError(URLError):
pass 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: class Request:
@ -185,7 +198,7 @@ class Request:
self.add_header(key, value) self.add_header(key, value)
self.unredirected_hdrs = {} self.unredirected_hdrs = {}
if origin_req_host is None: 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.origin_req_host = origin_req_host
self.unverifiable = unverifiable self.unverifiable = unverifiable
@ -413,6 +426,9 @@ def build_opener(*handlers):
If any of the handlers passed as arguments are subclasses of the If any of the handlers passed as arguments are subclasses of the
default handlers, the default handlers will not be used. 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() opener = OpenerDirector()
default_classes = [ProxyHandler, UnknownHandler, HTTPHandler, default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
@ -423,7 +439,7 @@ def build_opener(*handlers):
skip = [] skip = []
for klass in default_classes: for klass in default_classes:
for check in handlers: for check in handlers:
if inspect.isclass(check): if isclass(check):
if issubclass(check, klass): if issubclass(check, klass):
skip.append(klass) skip.append(klass)
elif isinstance(check, klass): elif isinstance(check, klass):
@ -435,7 +451,7 @@ def build_opener(*handlers):
opener.add_handler(klass()) opener.add_handler(klass())
for h in handlers: for h in handlers:
if inspect.isclass(h): if isclass(h):
h = h() h = h()
opener.add_handler(h) opener.add_handler(h)
return opener return opener
@ -1071,6 +1087,7 @@ if hasattr(httplib, 'HTTPS'):
class HTTPCookieProcessor(BaseHandler): class HTTPCookieProcessor(BaseHandler):
def __init__(self, cookiejar=None): def __init__(self, cookiejar=None):
import cookielib
if cookiejar is None: if cookiejar is None:
cookiejar = cookielib.CookieJar() cookiejar = cookielib.CookieJar()
self.cookiejar = cookiejar self.cookiejar = cookiejar
@ -1168,6 +1185,7 @@ class FileHandler(BaseHandler):
# not entirely sure what the rules are here # not entirely sure what the rules are here
def open_local_file(self, req): def open_local_file(self, req):
import email.Utils import email.Utils
import mimetypes
host = req.get_host() host = req.get_host()
file = req.get_selector() file = req.get_selector()
localfile = url2pathname(file) localfile = url2pathname(file)
@ -1188,6 +1206,8 @@ class FileHandler(BaseHandler):
class FTPHandler(BaseHandler): class FTPHandler(BaseHandler):
def ftp_open(self, req): def ftp_open(self, req):
import ftplib
import mimetypes
host = req.get_host() host = req.get_host()
if not host: if not host:
raise IOError, ('ftp error', 'no host given') raise IOError, ('ftp error', 'no host given')