@@ -60,13 +60,15 @@ def __init__( # pylint: disable=too-many-arguments
6060 * ,
6161 status : Union [Status , Tuple [int , str ]] = OK_200 ,
6262 headers : Union [Headers , Dict [str , str ]] = None ,
63+ cookies : Dict [str , str ] = None ,
6364 content_type : str = None ,
6465 ) -> None :
6566 """
6667 :param Request request: Request that this is a response to.
6768 :param str body: Body of response. Defaults to empty string.
6869 :param Status status: Status code and text. Defaults to 200 OK.
6970 :param Headers headers: Headers to include in response. Defaults to empty dict.
71+ :param Dict[str, str] cookies: Cookies to be sent with the response.
7072 :param str content_type: Content type of response. Defaults to None.
7173 """
7274
@@ -76,6 +78,7 @@ def __init__( # pylint: disable=too-many-arguments
7678 self ._headers = (
7779 headers .copy () if isinstance (headers , Headers ) else Headers (headers )
7880 )
81+ self ._cookies = cookies .copy () if cookies else {}
7982 self ._content_type = content_type
8083 self ._size = 0
8184
@@ -96,6 +99,9 @@ def _send_headers(
9699 headers .setdefault ("Content-Length" , content_length )
97100 headers .setdefault ("Connection" , "close" )
98101
102+ for cookie_name , cookie_value in self ._cookies .items ():
103+ headers .add ("Set-Cookie" , f"{ cookie_name } ={ cookie_value } " )
104+
99105 for header , value in headers .items ():
100106 if value is not None :
101107 response_message_header += f"{ header } : { value } \r \n "
@@ -166,6 +172,7 @@ def __init__( # pylint: disable=too-many-arguments
166172 * ,
167173 status : Union [Status , Tuple [int , str ]] = OK_200 ,
168174 headers : Union [Headers , Dict [str , str ]] = None ,
175+ cookies : Dict [str , str ] = None ,
169176 content_type : str = None ,
170177 as_attachment : bool = False ,
171178 download_filename : str = None ,
@@ -180,6 +187,7 @@ def __init__( # pylint: disable=too-many-arguments
180187 server's ``root_path``.
181188 :param Status status: Status code and text. Defaults to ``200 OK``.
182189 :param Headers headers: Headers to include in response.
190+ :param Dict[str, str] cookies: Cookies to be sent with the response.
183191 :param str content_type: Content type of response.
184192 :param bool as_attachment: If ``True``, the file will be sent as an attachment.
185193 :param str download_filename: Name of the file to send as an attachment.
@@ -193,6 +201,7 @@ def __init__( # pylint: disable=too-many-arguments
193201 super ().__init__ (
194202 request = request ,
195203 headers = headers ,
204+ cookies = cookies ,
196205 content_type = content_type ,
197206 status = status ,
198207 )
@@ -293,19 +302,22 @@ def __init__( # pylint: disable=too-many-arguments
293302 * ,
294303 status : Union [Status , Tuple [int , str ]] = OK_200 ,
295304 headers : Union [Headers , Dict [str , str ]] = None ,
305+ cookies : Dict [str , str ] = None ,
296306 content_type : str = None ,
297307 ) -> None :
298308 """
299309 :param Request request: Request object
300310 :param Generator body: Generator that yields chunks of data.
301311 :param Status status: Status object or tuple with code and message.
302312 :param Headers headers: Headers to be sent with the response.
313+ :param Dict[str, str] cookies: Cookies to be sent with the response.
303314 :param str content_type: Content type of the response.
304315 """
305316
306317 super ().__init__ (
307318 request = request ,
308319 headers = headers ,
320+ cookies = cookies ,
309321 status = status ,
310322 content_type = content_type ,
311323 )
@@ -352,17 +364,20 @@ def __init__(
352364 data : Dict [Any , Any ],
353365 * ,
354366 headers : Union [Headers , Dict [str , str ]] = None ,
367+ cookies : Dict [str , str ] = None ,
355368 status : Union [Status , Tuple [int , str ]] = OK_200 ,
356369 ) -> None :
357370 """
358371 :param Request request: Request that this is a response to.
359372 :param dict data: Data to be sent as JSON.
360373 :param Headers headers: Headers to include in response.
374+ :param Dict[str, str] cookies: Cookies to be sent with the response.
361375 :param Status status: Status code and text. Defaults to 200 OK.
362376 """
363377 super ().__init__ (
364378 request = request ,
365379 headers = headers ,
380+ cookies = cookies ,
366381 status = status ,
367382 )
368383 self ._data = data
@@ -398,6 +413,7 @@ def __init__(
398413 preserve_method : bool = False ,
399414 status : Union [Status , Tuple [int , str ]] = None ,
400415 headers : Union [Headers , Dict [str , str ]] = None ,
416+ cookies : Dict [str , str ] = None ,
401417 ) -> None :
402418 """
403419 By default uses ``permament`` and ``preserve_method`` to determine the ``status`` code to
@@ -415,6 +431,7 @@ def __init__(
415431 :param bool preserve_method: Whether to preserve the method of the request.
416432 :param Status status: Status object or tuple with code and message.
417433 :param Headers headers: Headers to include in response.
434+ :param Dict[str, str] cookies: Cookies to be sent with the response.
418435 """
419436
420437 if status is not None and (permanent or preserve_method ):
@@ -428,7 +445,7 @@ def __init__(
428445 else :
429446 status = MOVED_PERMANENTLY_301 if permanent else FOUND_302
430447
431- super ().__init__ (request , status = status , headers = headers )
448+ super ().__init__ (request , status = status , headers = headers , cookies = cookies )
432449 self ._headers .update ({"Location" : url })
433450
434451 def _send (self ) -> None :
@@ -474,14 +491,17 @@ def __init__( # pylint: disable=too-many-arguments
474491 self ,
475492 request : Request ,
476493 headers : Union [Headers , Dict [str , str ]] = None ,
494+ cookies : Dict [str , str ] = None ,
477495 ) -> None :
478496 """
479497 :param Request request: Request object
480498 :param Headers headers: Headers to be sent with the response.
499+ :param Dict[str, str] cookies: Cookies to be sent with the response.
481500 """
482501 super ().__init__ (
483502 request = request ,
484503 headers = headers ,
504+ cookies = cookies ,
485505 content_type = "text/event-stream" ,
486506 )
487507 self ._headers .setdefault ("Cache-Control" , "no-cache" )
@@ -606,11 +626,13 @@ def __init__( # pylint: disable=too-many-arguments
606626 self ,
607627 request : Request ,
608628 headers : Union [Headers , Dict [str , str ]] = None ,
629+ cookies : Dict [str , str ] = None ,
609630 buffer_size : int = 1024 ,
610631 ) -> None :
611632 """
612633 :param Request request: Request object
613634 :param Headers headers: Headers to be sent with the response.
635+ :param Dict[str, str] cookies: Cookies to be sent with the response.
614636 :param int buffer_size: Size of the buffer used to send and receive messages.
615637 """
616638 self ._check_request_initiates_handshake (request )
@@ -621,6 +643,7 @@ def __init__( # pylint: disable=too-many-arguments
621643 request = request ,
622644 status = SWITCHING_PROTOCOLS_101 ,
623645 headers = headers ,
646+ cookies = cookies ,
624647 )
625648 self ._headers .setdefault ("Upgrade" , "websocket" )
626649 self ._headers .setdefault ("Connection" , "Upgrade" )
0 commit comments