Exemplo n.º 1
0
    def make_cookies(self, response, request):
        import time
        from http.cookiejar import split_header_words,_warn_unhandled_exception,parse_ns_headers
        """Return sequence of Cookie objects extracted from response object."""
        # get cookie-attributes for RFC 2965 and Netscape protocols
        headers = response.info()
        rfc2965_hdrs = headers.get_list("Set-Cookie2")
        ns_hdrs = headers.get_list("Set-Cookie")
        self._policy._now = self._now = int(time.time())

        rfc2965 = self._policy.rfc2965
        netscape = self._policy.netscape

        if ((not rfc2965_hdrs and not ns_hdrs) or
            (not ns_hdrs and not rfc2965) or
            (not rfc2965_hdrs and not netscape) or
            (not netscape and not rfc2965)):
            return []  # no relevant cookie headers: quick exit

        try:
            cookies = self._cookies_from_attrs_set(
                split_header_words(rfc2965_hdrs), request)
        except Exception:
            _warn_unhandled_exception()
            cookies = []

        if ns_hdrs and netscape:
            try:
                # RFC 2109 and Netscape cookies
                ns_cookies = self._cookies_from_attrs_set(
                    parse_ns_headers(ns_hdrs), request)
            except Exception:
                _warn_unhandled_exception()
                ns_cookies = []
            self._process_rfc2109_cookies(ns_cookies)

            # Look for Netscape cookies (from Set-Cookie headers) that match
            # corresponding RFC 2965 cookies (from Set-Cookie2 headers).
            # For each match, keep the RFC 2965 cookie and ignore the Netscape
            # cookie (RFC 2965 section 9.1).  Actually, RFC 2109 cookies are
            # bundled in with the Netscape cookies for this purpose, which is
            # reasonable behaviour.
            if rfc2965:
                lookup = {}
                for cookie in cookies:
                    lookup[(cookie.domain, cookie.path, cookie.name)] = None

                def no_matching_rfc2965(ns_cookie, lookup=lookup):
                    key = ns_cookie.domain, ns_cookie.path, ns_cookie.name
                    return key not in lookup
                ns_cookies = filter(no_matching_rfc2965, ns_cookies)

            if ns_cookies:
                cookies.extend(ns_cookies)

        return cookies
Exemplo n.º 2
0
    def _really_load(self, f, filename, ignore_discard, ignore_expires):
        now = time.time()
        try:
            while 1:
                line = f.readline()
                if line == "":
                    break

                # last field may be absent, so keep any trailing tab
                if line.endswith("\n"):
                    line = line[:-1]

                sline = line.strip()
                # support HttpOnly cookies (as stored by curl or old Firefox).
                if sline.startswith("#HttpOnly_"):
                    line = sline[10:]
                elif sline.startswith("#") or sline == "":
                    continue

                domain, domain_specified, path, secure, expires, name, value = line.split(
                    "\t"
                )
                secure = secure == "TRUE"
                domain_specified = domain_specified == "TRUE"
                if name == "":
                    # cookies.txt regards 'Set-Cookie: foo' as a cookie
                    # with no name, whereas http.cookiejar regards it as a
                    # cookie with no value.
                    name = value
                    value = None

                initial_dot = domain.startswith(".")
                assert domain_specified == initial_dot

                discard = False
                if expires == "":
                    expires = None
                    discard = True

                # assume path_specified is false
                c = Cookie(
                    0,
                    name,
                    value,
                    None,
                    False,
                    domain,
                    domain_specified,
                    initial_dot,
                    path,
                    False,
                    secure,
                    expires,
                    discard,
                    None,
                    None,
                    {},
                )
                if not ignore_discard and c.discard:
                    continue
                if not ignore_expires and c.is_expired(now):
                    continue
                self.set_cookie(c)

        except OSError:
            raise
        except Exception:
            _warn_unhandled_exception()
            raise OSError(
                "invalid Netscape format cookies file %r: %r" % (filename, line)
            )
Exemplo n.º 3
0
def str2cookie(self, cookstr, ignore_discard, ignore_expires):
    magic = cookstr.split('\n')[0]
    if not self.magic_re.search(magic):
        msg = ("It does not look like a Set-Cookie3 (LWP) format " "string")
        raise LoadError(msg)

    now = time.time()

    header = "Set-Cookie3:"
    boolean_attrs = ("port_spec", "path_spec", "domain_dot", "secure",
                     "discard")
    value_attrs = ("version", "port", "path", "domain", "expires", "comment",
                   "commenturl")

    try:
        for line in cookstr.split('\n'):
            # while 1:
            # line = f.readline()
            if line == "": break
            if not line.startswith(header):
                continue
            line = line[len(header):].strip()

            for data in split_header_words([line]):
                name, value = data[0]
                standard = {}
                rest = {}
                for k in boolean_attrs:
                    standard[k] = False
                for k, v in data[1:]:
                    if k is not None:
                        lc = k.lower()
                    else:
                        lc = None
                    # don't lose case distinction for unknown fields
                    if (lc in value_attrs) or (lc in boolean_attrs):
                        k = lc
                    if k in boolean_attrs:
                        if v is None: v = True
                        standard[k] = v
                    elif k in value_attrs:
                        standard[k] = v
                    else:
                        rest[k] = v

                h = standard.get
                expires = h("expires")
                discard = h("discard")
                if expires is not None:
                    expires = iso2time(expires)
                if expires is None:
                    discard = True
                domain = h("domain")
                domain_specified = domain.startswith(".")
                c = Cookie(h("version"), name, value, h("port"),
                           h("port_spec"), domain, domain_specified,
                           h("domain_dot"), h("path"), h("path_spec"),
                           h("secure"), expires, discard, h("comment"),
                           h("commenturl"), rest)
                if not ignore_discard and c.discard:
                    continue
                if not ignore_expires and c.is_expired(now):
                    continue
                self.set_cookie(c)
    except OSError:
        raise
    except Exception:
        _warn_unhandled_exception()
        raise LoadError("invalid Set-Cookie3 format string")
Exemplo n.º 4
0
    def _really_load(self, f, filename, ignore_discard, ignore_expires):
        now = time.time()

        magic = f.readline()
        if not re.search(self.magic_re, magic):
            f.close()
            raise LoadError(
                "%r does not look like a Netscape format cookies file" %
                filename)

        try:
            while 1:
                line = f.readline()
                if line == "": break

                # last field may be absent, so keep any trailing tab
                if line.endswith("\n"): line = line[:-1]

                # skip comments and blank lines XXX what is $ for?
                if (line.strip().startswith(("#", "$")) or
                    line.strip() == ""):
                    continue

                domain, domain_specified, path, secure, expires, name, value = \
                        line.split("\t")
                secure = (secure == "TRUE")
                domain_specified = (domain_specified == "TRUE")
                if name == "":
                    # cookies.txt regards 'Set-Cookie: foo' as a cookie
                    # with no name, whereas cookielib regards it as a
                    # cookie with no value.
                    name = value
                    value = None

                initial_dot = domain.startswith(".")
                assert domain_specified == initial_dot

                discard = False
                # curl and Wget set expires to 0 for session cookies.
                if expires == "0" or expires == "":

                    expires = None
                    discard = True

                # assume path_specified is false
                c = Cookie(0, name, value,
                           None, False,
                           domain, domain_specified, initial_dot,
                           path, False,
                           secure,
                           expires,
                           discard,
                           None,
                           None,
                           {})
                if not ignore_discard and c.discard:
                    continue
                if not ignore_expires and c.is_expired(now):
                    continue
                self.set_cookie(c)

        except IOError:
            raise
        except Exception:
            _warn_unhandled_exception()
            raise LoadError("invalid Netscape format cookies file %r: %r" %
                            (filename, line))