66from abc import ABC
77from email .message import Message
88from http import cookiejar as cookielib
9+ from http .cookiejar import Cookie
910from http .cookies import Morsel
10- from typing import TYPE_CHECKING , Iterator , MutableMapping
11+ from typing import TYPE_CHECKING , Iterator , MutableMapping , Optional
1112from urllib .parse import urlparse , urlunparse
1213
1314from tls_requests .exceptions import CookieConflictError
15+ from tls_requests .types import CookieTypes
1416
1517if TYPE_CHECKING :
1618 from .request import Request
@@ -123,7 +125,8 @@ def get(self, name, default=None, domain=None, path=None):
123125 .. warning:: operation is O(n), not O(1).
124126 """
125127 try :
126- return self ._find_no_duplicates (name , domain , path )
128+ value = self ._find_no_duplicates (name , domain , path )
129+ return value
127130 except KeyError :
128131 return default
129132
@@ -332,7 +335,7 @@ def _find_no_duplicates(self, name, domain=None, path=None):
332335 # we will eventually return this as long as no cookie conflict
333336 toReturn = cookie .value
334337
335- if toReturn :
338+ if toReturn is not None :
336339 return toReturn
337340 raise KeyError (f"name={ name !r} , domain={ domain !r} , path={ path !r} " )
338341
@@ -536,28 +539,42 @@ def _prepare_cookiejar(self, cookies: CookieTypes = None) -> RequestsCookieJar:
536539 if isinstance (cookies , self .__class__ ):
537540 return cookies .cookiejar
538541
539- if isinstance (cookies , dict ):
540- return cookiejar_from_dict (cookies )
541-
542- if isinstance (cookies , (tuple , list , set )):
542+ if isinstance (cookies , (dict , tuple , list , set )):
543543 cookiejar = RequestsCookieJar ()
544+ if isinstance (cookies , dict ):
545+ cookies = cookies .items ()
546+
544547 for k , v in cookies :
545- cookiejar .set (k , v )
548+ if isinstance (v , (float , int )):
549+ v = str (v )
546550
551+ cookiejar .set (k , v )
547552 return cookiejar
548553
549554 return RequestsCookieJar ()
550555
551556 def extract_cookies (self , response : Response , request : Request ) -> None :
552557 extract_cookies_to_jar (self .cookiejar , response , request )
553558
554- def get_cookie_header (self , request : Request ):
559+ def get_cookie_header (self , request : Request ) -> str :
555560 return get_cookie_header (self .cookiejar , request )
556561
557- def set (self , name , value , ** kwargs ) -> None :
558- self .cookiejar .set (name , value , ** kwargs )
562+ def set (self , name , value , ** kwargs ) -> Optional [Cookie ]:
563+ if value is None :
564+ remove_cookie_by_name (
565+ self , name , domain = kwargs .get ("domain" ), path = kwargs .get ("path" )
566+ )
567+ return
568+
569+ if isinstance (value , Morsel ):
570+ cookie = morsel_to_cookie (value )
571+ else :
572+ cookie = create_cookie (name , value , ** kwargs )
573+
574+ self .cookiejar .set_cookie (cookie )
575+ return cookie
559576
560- def get (self , name , default = None , domain = "" , path = "/" ):
577+ def get (self , name , default = None , domain = "" , path = "/" ) -> str :
561578 return self .cookiejar .get (name , default , domain , path )
562579
563580 def delete (self , name : str , domain : str = None , path : str = None ) -> None :
@@ -581,14 +598,11 @@ def copy(self) -> "Cookies":
581598 ret .cookiejar = _copy_cookie_jar (self .cookiejar )
582599 return ret
583600
584- def __setitem__ (self , name : str , value : str ) -> None :
601+ def __setitem__ (self , name : str , value : str ) -> Optional [ Cookie ] :
585602 return self .set (name , value )
586603
587604 def __getitem__ (self , name : str ) -> str :
588- value = self .get (name )
589- if value is None :
590- raise KeyError (name )
591- return value
605+ return self .cookiejar .get (name )
592606
593607 def __delitem__ (self , name : str ) -> None :
594608 return self .delete (name )
@@ -605,5 +619,5 @@ def __bool__(self) -> bool:
605619 return False
606620
607621 def __repr__ (self ) -> str :
608- r = ", " .join ([repr (cookie ) for cookie in self .cookiejar ])
609- return "<%s[%s]>" % (self .__class__ .__name__ , r )
622+ cookiejar_repr = ", " .join ([repr (cookie ) for cookie in self .cookiejar ])
623+ return "<%s[%s]>" % (self .__class__ .__name__ , cookiejar_repr )
0 commit comments