我们从Python开源项目中,提取了以下20个代码示例,用于说明如何使用http.cookies.Morsel()。
def setcookie(name, value, expires='', domain=None, secure=False, httponly=False, path=None): """Sets a cookie.""" morsel = Morsel() name, value = safestr(name), safestr(value) morsel.set(name, value, quote(value)) if isinstance(expires, int) and expires < 0: expires = -1000000000 morsel['expires'] = expires morsel['path'] = path or ctx.homepath+'/' if domain: morsel['domain'] = domain if secure: morsel['secure'] = secure value = morsel.OutputString() if httponly: value += '; httponly' header('Set-Cookie', value)
def cookies(self): """A dictionary of Cookie.Morsel objects.""" if not hasattr(self, "_cookies"): self._cookies = Cookie.SimpleCookie() if "Cookie" in self.headers: try: parsed = parse_cookie(self.headers["Cookie"]) except Exception: pass else: for k, v in parsed.items(): try: self._cookies[k] = v except Exception: # SimpleCookie imposes some restrictions on keys; # parse_cookie does not. Discard any cookies # with disallowed keys. pass return self._cookies
def make_request_headers(self, method, host, headers, cookies): _headers = [] if not headers.get('host'): _headers.append('Host: ' + host + (':443' if method.lower() == 'connect' else '')) if method.lower() == 'post' and not self.data: _headers.append('Content-Length: 0') if self.data: data = self.make_request_data(self.data) _headers.append('Content-Length: {}'.format(len(data.encode('utf-8')))) if isinstance(self.data, dict) and not headers.get('Content-Type'): _headers.append('Content-Type: application/x-www-form-urlencoded') # add cookies if cookies: if isinstance(cookies, (DictCookie, SimpleCookie)): _cookies = [] for k in cookies: # TODO, path ? if isinstance(cookies[k], Morsel): v = cookies[k].value else: v = cookies[k] _cookies.append('{}={};'.format(k, v)) cookie = 'Cookie: ' + ' '.join(_cookies) _headers.append(cookie) elif isinstance(cookies, dict): _cookies = [] for k, v in cookies.items(): _cookies.append('{}={};'.format(k, v)) cookie = 'Cookie: ' + ' '.join(_cookies) _headers.append(cookie) # make headers for k, v in headers.items(): _headers.append(k + ': ' + v) return '\r\n'.join(_headers)
def test_reserved_keys(self): M = cookies.Morsel() # tests valid and invalid reserved keys for Morsels for i in M._reserved: # Test that all valid keys are reported as reserved and set them self.assertTrue(M.isReservedKey(i)) M[i] = '%s_value' % i for i in M._reserved: # Test that valid key values come out fine self.assertEqual(M[i], '%s_value' % i) for i in "the holy hand grenade".split(): # Test that invalid keys raise CookieError self.assertRaises(cookies.CookieError, M.__setitem__, i, '%s_value' % i)
def header(self): """Generates HTTP header for this cookie.""" if self._send_cookie: morsel = Morsel() cookie_value = Session.encode_sid(self._config.secret, self._sid) if self._config.encrypt_key: cipher = AESCipher(self._config.encrypt_key) cookie_value = cipher.encrypt(cookie_value) if sys.version_info > (3, 0): cookie_value = cookie_value.decode() morsel.set(self._config.cookie_name, cookie_value, cookie_value) # domain if self._config.domain: morsel["domain"] = self._config.domain # path if self._config.path: morsel["path"] = self._config.path # expires if self._expire_cookie: morsel["expires"] = "Wed, 01-Jan-1970 00:00:00 GMT" elif self._backend_client.expires: morsel["expires"] = self._backend_client.expires.strftime(EXPIRES_FORMAT) # secure if self._config.secure: morsel["secure"] = True # http only if self._config.http_only: morsel["httponly"] = True return morsel.OutputString() else: return None
def cookies(self): """A dictionary of Cookie.Morsel objects.""" if not hasattr(self, "_cookies"): self._cookies = Cookie.SimpleCookie() if "Cookie" in self.headers: try: self._cookies.load( native_str(self.headers["Cookie"])) except Exception: self._cookies = {} return self._cookies
def set_cookie(self, name, value, domain=None, expires=None, path="/", expires_days=None, **kwargs): """Sets the given cookie name/value with the given options. Additional keyword arguments are set on the Cookie.Morsel directly. See https://docs.python.org/2/library/cookie.html#Cookie.Morsel for available attributes. """ # The cookie library only accepts type str, in both python 2 and 3 name = escape.native_str(name) value = escape.native_str(value) if re.search(r"[\x00-\x20]", name + value): # Don't let us accidentally inject bad stuff raise ValueError("Invalid cookie %r: %r" % (name, value)) if not hasattr(self, "_new_cookie"): self._new_cookie = Cookie.SimpleCookie() if name in self._new_cookie: del self._new_cookie[name] self._new_cookie[name] = value morsel = self._new_cookie[name] if domain: morsel["domain"] = domain if expires_days is not None and not expires: expires = datetime.datetime.utcnow() + datetime.timedelta( days=expires_days) if expires: morsel["expires"] = httputil.format_timestamp(expires) if path: morsel["path"] = path for k, v in kwargs.items(): if k == 'max_age': k = 'max-age' # skip falsy values for httponly and secure flags because # SimpleCookie sets them regardless if k in ['httponly', 'secure'] and not v: continue morsel[k] = v
def set_cookie(self, name, value, domain=None, expires=None, path="/", expires_days=None, **kwargs): """Sets the given cookie name/value with the given options. Additional keyword arguments are set on the Cookie.Morsel directly. See http://docs.python.org/library/cookie.html#morsel-objects for available attributes. """ # The cookie library only accepts type str, in both python 2 and 3 name = escape.native_str(name) value = escape.native_str(value) if re.search(r"[\x00-\x20]", name + value): # Don't let us accidentally inject bad stuff raise ValueError("Invalid cookie %r: %r" % (name, value)) if not hasattr(self, "_new_cookie"): self._new_cookie = Cookie.SimpleCookie() if name in self._new_cookie: del self._new_cookie[name] self._new_cookie[name] = value morsel = self._new_cookie[name] if domain: morsel["domain"] = domain if expires_days is not None and not expires: expires = datetime.datetime.utcnow() + datetime.timedelta( days=expires_days) if expires: morsel["expires"] = httputil.format_timestamp(expires) if path: morsel["path"] = path for k, v in kwargs.items(): if k == 'max_age': k = 'max-age' # skip falsy values for httponly and secure flags because # SimpleCookie sets them regardless if k in ['httponly', 'secure'] and not v: continue morsel[k] = v
def filter_cookies(self, request_url=URL()): """Returns this jar's cookies filtered by their attributes.""" self._do_expiration() filtered = SimpleCookie() hostname = request_url.raw_host or "" is_not_secure = request_url.scheme not in ("https", "wss") for cookie in self: name = cookie.key domain = cookie["domain"] # Send shared cookies if not domain: filtered[name] = cookie.value continue if not self._unsafe and is_ip_address(hostname): continue if (domain, name) in self._host_only_cookies: if domain != hostname: continue elif not self._is_domain_match(domain, hostname): continue if not self._is_path_match(request_url.path, cookie["path"]): continue if is_not_secure and cookie["secure"]: continue # It's critical we use the Morsel so the coded_value # (based on cookie version) is preserved mrsl_val = cookie.get(cookie.key, Morsel()) mrsl_val.set(cookie.key, cookie.value, cookie.coded_value) filtered[name] = mrsl_val return filtered