import urllib
import urllib2
import socket
-import codecs
import zlib
-
from urllib2 import HTTPError
from urlparse import urlparse, urlunparse, urljoin
from datetime import datetime
-from .config import settings
-from .monkeys import Request as _Request, HTTPBasicAuthHandler, HTTPForcedBasicAuthHandler, HTTPDigestAuthHandler, HTTPRedirectHandler
from .structures import CaseInsensitiveDict
from .packages.poster.encode import multipart_encode
from .packages.poster.streaminghttp import register_openers, get_handlers
-from .utils import dict_from_cookiejar, get_unicode_from_response, stream_decode_response_unicode, decode_gzip, stream_decode_gzip
+from .utils import (dict_from_cookiejar, get_unicode_from_response, stream_decode_response_unicode, decode_gzip, stream_decode_gzip)
from .status_codes import codes
from .exceptions import Timeout, URLRequired, TooManyRedirects
+from .monkeys import Request as _Request
+from .monkeys import (
+ HTTPBasicAuthHandler, HTTPForcedBasicAuthHandler,
+ HTTPDigestAuthHandler, HTTPRedirectHandler)
REDIRECT_STATI = (codes.moved, codes.found, codes.other, codes.temporary_moved)
"""
def __init__(self,
- url=None, headers=dict(), files=None, method=None, data=dict(),
- params=dict(), auth=None, cookies=None, timeout=None, redirect=False,
- allow_redirects=False, proxies=None, hooks=None):
+ url=None,
+ headers=dict(),
+ files=None,
+ method=None,
+ data=dict(),
+ params=dict(),
+ auth=None,
+ cookies=None,
+ timeout=None,
+ redirect=False,
+ allow_redirects=False,
+ proxies=None,
+ hooks=None,
+ config=None):
#: Float describes the timeout of the request.
# (Use socket.setdefaulttimeout() as fallback)
#: CookieJar to attach to :class:`Request <Request>`.
self.cookies = cookies
+ #: Dictionary of configurations for this request.
+ self.config = config
+
#: True if Request has been sent.
self.sent = False
self.hooks = hooks
# Header manipulation and defaults.
-
- if settings.accept_gzip:
- settings.base_headers.update({'Accept-Encoding': 'gzip'})
+ if self.config.get('accept_gzip'):
+ self.headers.update({'Accept-Encoding': 'gzip'})
if headers:
headers = CaseInsensitiveDict(self.headers)
else:
headers = CaseInsensitiveDict()
- for (k, v) in settings.base_headers.items():
+ for (k, v) in self.config.get('base_headers', {}).items():
if k not in headers:
headers[k] = v
def build(resp):
response = Response()
+ response.config = self.config
response.status_code = getattr(resp, 'code', None)
try:
r.raw.close()
- if not len(history) < settings.max_redirects:
+ if not len(history) < self.config.get('max_redirects'):
raise TooManyRedirects()
history.append(r)
method = self.method
request = Request(
- url, self.headers, self.files, method,
- self.data, self.params, self.auth, self.cookies,
- redirect=True
+ url=url,
+ headers=self.headers,
+ files=self.files,
+ method=method,
+ # data=self.data,
+ # params=self.params,
+ auth=self.auth,
+ cookies=self.cookies,
+ redirect=True,
+ config=self.config
)
request.send()
r = request.response
self._checks()
# Logging
- if settings.verbose:
- settings.verbose.write('%s %s %s\n' % (
+ if self.config.get('verbose'):
+ self.config.get('verbose').write('%s %s %s\n' % (
datetime.now().isoformat(), self.method, self.url
))
if not 'timeout' in str(err):
raise
- if settings.timeout_fallback:
+ if self.config.get('timeout_fallback'):
# fall-back and use global socket timeout (This is not thread-safe!)
old_timeout = socket.getdefaulttimeout()
socket.setdefaulttimeout(self.timeout)
resp = opener(req)
- if settings.timeout_fallback:
+ if self.config.get('timeout_fallback'):
# restore global timeout
socket.setdefaulttimeout(old_timeout)
#: A dictionary of Cookies the server sent back.
self.cookies = None
+ #: Dictionary of configurations for this request.
+ self.config = None
+
def __repr__(self):
return '<Response [%s]>' % (self.status_code)
if 'gzip' in self.headers.get('content-encoding', ''):
gen = stream_decode_gzip(gen)
if decode_unicode is None:
- decode_unicode = settings.decode_unicode
+ decode_unicode = self.config.get('decode_unicode')
if decode_unicode:
gen = stream_decode_response_unicode(gen, self)
return gen
pass
# Decode unicode content.
- if settings.decode_unicode:
+ if self.config.get('decode_unicode'):
self._content = get_unicode_from_response(self)
self._content_consumed = True