Skip to content
7 changes: 7 additions & 0 deletions Doc/library/http.cookiejar.rst
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ The following classes are provided:
:meth:`load` or :meth:`revert` method is called. Subclasses of this class are
documented in section :ref:`file-cookie-jar-classes`.

.. versionchanged:: 3.8

The filename parameter supports a :term:`path-like object`.


.. class:: CookiePolicy()

Expand Down Expand Up @@ -341,6 +345,9 @@ writing.
compatible with the libwww-perl library's ``Set-Cookie3`` file format. This is
convenient if you want to store cookies in a human-readable file.

.. versionchanged:: 3.8

The filename parameter supports a :term:`path-like object`.

.. _cookie-policy-objects:

Expand Down
6 changes: 2 additions & 4 deletions Lib/http/cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
__all__ = ['Cookie', 'CookieJar', 'CookiePolicy', 'DefaultCookiePolicy',
'FileCookieJar', 'LWPCookieJar', 'LoadError', 'MozillaCookieJar']

import os
import copy
import datetime
import re
Expand Down Expand Up @@ -1762,10 +1763,7 @@ def __init__(self, filename=None, delayload=False, policy=None):
"""
CookieJar.__init__(self, policy)
if filename is not None:
try:
filename+""
except:
raise ValueError("filename must be string-like")
filename = os.fspath(filename)
self.filename = filename
self.delayload = bool(delayload)

Expand Down
25 changes: 25 additions & 0 deletions Lib/test/test_http_cookiejar.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import time
import unittest
import urllib.request
import pathlib

from http.cookiejar import (time2isoz, http2time, iso2time, time2netscape,
parse_ns_headers, join_header_words, split_header_words, Cookie,
Expand Down Expand Up @@ -313,6 +314,30 @@ def _interact(cookiejar, url, set_cookie_hdrs, hdr_name):


class FileCookieJarTests(unittest.TestCase):
def test_constructor_with_str(self):
filename = test.support.TESTFN
c = LWPCookieJar(filename)
self.assertEqual(c.filename, filename)

def test_constructor_with_path_like(self):
filename = pathlib.Path(test.support.TESTFN)
c = LWPCookieJar(filename)
self.assertEqual(c.filename, os.fspath(filename))

def test_constructor_with_none(self):
c = LWPCookieJar(None)
self.assertIsNone(c.filename)

def test_constructor_with_other_types(self):
class A:
pass

for type_ in (int, float, A):
with self.subTest(filename=type_):
with self.assertRaises(TypeError):
instance = type_()
c = LWPCookieJar(filename=instance)

def test_lwp_valueless_cookie(self):
# cookies with no value should be saved and loaded consistently
filename = test.support.TESTFN
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:class:`FileCookieJar` supports :term:`path-like object`. Contributed by Stéphane Wirtel