This commit is contained in:
Jakub Roztocil 2020-06-15 23:02:16 +02:00
parent 9c68d7dd87
commit 37200eb055
4 changed files with 40 additions and 40 deletions

View File

@ -11,7 +11,6 @@ from urllib.parse import urlparse, urlunparse
import requests import requests
# noinspection PyPackageRequirements # noinspection PyPackageRequirements
import urllib3 import urllib3
from requests.cookies import remove_cookie_by_name
from httpie import __version__ from httpie import __version__
from httpie.cli.dicts import RequestHeadersDict from httpie.cli.dicts import RequestHeadersDict
@ -96,6 +95,8 @@ def collect_messages(
**send_kwargs_merged, **send_kwargs_merged,
**send_kwargs, **send_kwargs,
) )
# noinspection PyProtectedMember
expired_cookies += get_expired_cookies( expired_cookies += get_expired_cookies(
headers=response.raw._original_response.msg._headers headers=response.raw._original_response.msg._headers
) )
@ -116,6 +117,7 @@ def collect_messages(
if httpie_session.is_new() or not args.session_read_only: if httpie_session.is_new() or not args.session_read_only:
httpie_session.cookies = requests_session.cookies httpie_session.cookies = requests_session.cookies
httpie_session.remove_cookies( httpie_session.remove_cookies(
# TODO: take path & domain into account?
cookie['name'] for cookie in expired_cookies cookie['name'] for cookie in expired_cookies
) )
httpie_session.save() httpie_session.save()

View File

@ -9,7 +9,7 @@ from typing import Iterable, Optional, Union
from urllib.parse import urlsplit from urllib.parse import urlsplit
from requests.auth import AuthBase from requests.auth import AuthBase
from requests.cookies import RequestsCookieJar, create_cookie, remove_cookie_by_name from requests.cookies import RequestsCookieJar, create_cookie
from httpie.cli.dicts import RequestHeadersDict from httpie.cli.dicts import RequestHeadersDict
from httpie.config import BaseConfigDict, DEFAULT_CONFIG_DIR from httpie.config import BaseConfigDict, DEFAULT_CONFIG_DIR

View File

@ -89,25 +89,25 @@ def get_content_type(filename):
return content_type return content_type
def get_expired_cookies(headers: List[Tuple[str, str]], curr_timestamp: float = None) -> List[dict]: def get_expired_cookies(
expired_cookies = [] headers: List[Tuple[str, str]],
cookie_headers = [] now: float = None
curr_timestamp = curr_timestamp or time.time() ) -> List[dict]:
now = now or time.time()
for header_name, content in headers: attr_sets: List[Tuple[str, str]] = parse_ns_headers(
if header_name == 'Set-Cookie': value for name, value in headers
cookie_headers.append(content) if name.lower() == 'set-cookie'
)
extracted_cookies = [ cookies = [
dict(cookie, name=cookie[0][0]) # The first attr name is the cookie name.
for cookie in parse_ns_headers(cookie_headers) dict(attrs[1:], name=attrs[0][0])
for attrs in attr_sets
] ]
return [
for cookie in extracted_cookies: {
if "expires" in cookie and cookie['expires'] <= curr_timestamp:
expired_cookies.append({
'name': cookie['name'], 'name': cookie['name'],
'path': cookie.get('path', '/') 'path': cookie.get('path', '/')
}) }
for cookie in cookies
return expired_cookies if cookie.get('expires', float('Inf')) <= now
]

View File

@ -193,6 +193,12 @@ class TestSession(SessionTestBase):
class TestExpiredCookies: class TestExpiredCookies:
def setup_method(self, method):
self.config_dir = mk_config_dir()
def teardown_method(self, method):
shutil.rmtree(self.config_dir)
@pytest.mark.parametrize( @pytest.mark.parametrize(
argnames=['initial_cookie', 'expired_cookie'], argnames=['initial_cookie', 'expired_cookie'],
argvalues=[ argvalues=[
@ -201,14 +207,11 @@ class TestExpiredCookies:
] ]
) )
def test_removes_expired_cookies_from_session_obj(self, initial_cookie, expired_cookie, httpbin): def test_removes_expired_cookies_from_session_obj(self, initial_cookie, expired_cookie, httpbin):
config_dir = mk_config_dir() session = Session(self.config_dir)
session = Session(config_dir)
session['cookies'] = initial_cookie session['cookies'] = initial_cookie
session.remove_cookies([expired_cookie]) session.remove_cookies([expired_cookie])
assert expired_cookie not in session.cookies assert expired_cookie not in session.cookies
shutil.rmtree(config_dir)
def test_expired_cookies(self, httpbin): def test_expired_cookies(self, httpbin):
orig_session = { orig_session = {
'cookies': { 'cookies': {
@ -220,8 +223,7 @@ class TestExpiredCookies:
}, },
} }
} }
config_dir = mk_config_dir() session_path = self.config_dir / 'test-session.json'
session_path = config_dir / 'test-session.json'
session_path.write_text(json.dumps(orig_session)) session_path.write_text(json.dumps(orig_session))
r = http( r = http(
@ -235,10 +237,8 @@ class TestExpiredCookies:
assert 'to_stay' in updated_session['cookies'] assert 'to_stay' in updated_session['cookies']
assert 'to_expire' not in updated_session['cookies'] assert 'to_expire' not in updated_session['cookies']
shutil.rmtree(config_dir)
@pytest.mark.parametrize( @pytest.mark.parametrize(
argnames=['raw_header', 'timestamp', 'expected'], argnames=['headers', 'now', 'expected_expired'],
argvalues=[ argvalues=[
( (
[ [
@ -271,11 +271,9 @@ class TestExpiredCookies:
('Connection', 'keep-alive') ('Connection', 'keep-alive')
], ],
datetime(2020, 6, 11).timestamp(), datetime(2020, 6, 11).timestamp(),
[ []
]
) )
] ]
) )
def test_get_expired_cookies_manages_multiple_cookie_headers(self, raw_header, timestamp, expected): def test_get_expired_cookies_manages_multiple_cookie_headers(self, headers, now, expected_expired):
assert get_expired_cookies(raw_header, curr_timestamp=timestamp) == expected assert get_expired_cookies(headers, now=now) == expected_expired