Exemplo n.º 1
0
    def header_function(self, line: bytes):
        if self.reset_headers:
            self.headers = structures.CaseInsensitiveDict()
            self.reset_headers = False

        try:
            # Some servers return UTF-8 status
            line = line.decode('utf-8')
        except UnicodeDecodeError:
            # Fall back to latin-1
            line = line.decode('iso-8859-1')

        if self.reason is None:
            _, _, reason = line.split(' ', 2)
            self.reason = reason.strip()
            return

        if line == '\r\n':
            self.reset_headers = True
            return
        elif ':' not in line:
            return

        name, value = line.split(':', 1)
        self.headers[name] = value.strip()
Exemplo n.º 2
0
    def __init__(self,
                 prepared,
                 *,
                 curl=None,
                 timeout=None,
                 allow_redirects=True,
                 max_redirects=-1):
        self.prepared = prepared
        self.curl = curl or pycurl.Curl()
        self.timeout = timeout
        self.allow_redirects = allow_redirects
        self.max_redirects = max_redirects

        if timeout is not None:
            if isinstance(timeout, (int, float)):
                self.connect_timeout, self.read_timeout = timeout, timeout
            elif isinstance(timeout, Timeout):
                timeout.start_connect()
                self.connect_timeout = (
                    0 if timeout.connect_timeout is Timeout.DEFAULT_TIMEOUT
                    else timeout.connect_timeout)
                self.read_timeout = (
                    0 if timeout.read_timeout is Timeout.DEFAULT_TIMEOUT else
                    timeout.read_timeout)
            else:
                self.connect_timeout, self.read_timeout = timeout
        else:
            self.connect_timeout, self.read_timeout = (None, None)

        self.response_buffer = BytesIO()
        self.reason = None
        self.headers = structures.CaseInsensitiveDict()
        self.reset_headers = False
Exemplo n.º 3
0
    def prepare_headers(self, headers):
        # NOTE: Only user-defined headers, not those set by libcurl
        headers = headers or structures.CaseInsensitiveDict()

        # Filter out headers with None value
        header_names = headers.keys()
        for name in header_names:
            if headers[name] is None:
                del headers[name]

        self.headers = headers
Exemplo n.º 4
0
    def __init__(self):
        self.auth = None
        self.cert = None
        self.cookies = None
        self.headers = structures.CaseInsensitiveDict()
        self.hooks = NotImplemented
        self.max_redirects = DEFAULT_REDIRECT_LIMIT
        self.params = {}
        self.proxies = {}
        self.stream = False
        self.trust_env = True
        self.verify = True

        self.curl = pycurl.Curl()
Exemplo n.º 5
0
    def build_response(self, elapsed=None):
        status_code = self.curl.getinfo(pycurl.RESPONSE_CODE)
        if not status_code:
            return None

        response = models.Response()
        response.request = self.prepared
        response.elapsed = elapsed
        response.status_code = status_code
        response.reason = self.reason
        response.headers = structures.CaseInsensitiveDict(self.headers)
        response.encoding = self.headers.get_content_charset()
        response.url = self.prepared.url
        response.raw = self.response_buffer

        return response
Exemplo n.º 6
0
    def prepare_request(self, request: Request) -> PreparedRequest:
        prepared = PreparedRequest()

        headers = structures.CaseInsensitiveDict()
        for name, value in self.headers.items():
            headers[name] = value
        for name, value in (request.headers or {}).items():
            headers[name] = value

        prepared.prepare(
            method=request.method,
            url=request.url,
            headers=headers,
            files=request.files,
            data=request.data,
            json=request.json,
            params=_merge_params(self.params, request.params),
            auth=NotImplemented,  # TODO: Merge request with Session
            cookies=_merge_params(self.cookies, request.cookies),
            hooks=NotImplemented)  # TODO: Merge request with Session

        return prepared