o
    ߥi!                     @   s>  d dl Z d dlZd dlZd dlZd dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZmZmZmZmZmZmZ d dlmZ z
d dlmZmZ W n ey[   dd	 Zd
d ZY nw ddlmZmZ ddlmZm Z  ddl
m!Z!m"Z" eddG dd dZ#eG dd dZ$de"de%de&fddZ'de%de%fddZ(dS )    N)
formatdate)sha1)chain)
CallableDictIterableListMappingOptionalSequenceTupleUnionoverloadquote)
mypyc_attrtraitc                 C      | S N )clsr   r   C/home/ubuntu/.local/lib/python3.10/site-packages/baize/responses.pyr         r   c                  O   s   dd S )Nc                 S   r   r   r   )xr   r   r   <lambda>   s    zmypyc_attr.<locals>.<lambda>r   )attrskwattrsr   r   r   r      s   r      )CookieMutableHeaders)MalformedRangeHeaderRangeNotSatisfiable)LiteralServerSentEventT)allow_interpreted_subclassesc                   @   s  e Zd Z	d!dedeeeef  ddfddZ					
				d"dedededee dedee dedede	d ddfddZ
		
				d#dedededee dedede	d ddfddZede	d deeeef  fddZede	d deeeef  fddZd d ZdS )$BaseResponse   Nstatus_codeheadersreturnc                 C   s   || _ t|| _g | _d S r   )r'   r   r(   cookies)selfr'   r(   r   r   r   __init__(   s   

zBaseResponse.__init__ /Flaxkeyvaluemax_ageexpirespathdomainsecurehttponlysamesite)strictr0   nonec
                 C   sF   d }
|d urt j t | }
| jt|||
||||||	d	 d S )Nr4   r3   r5   r6   r7   r8   r9   )datetimefromtimestamptimer*   appendr   )r+   r1   r2   r3   r4   r5   r6   r7   r8   r9   expires_datetimer   r   r   
set_cookie/   s    zBaseResponse.set_cookiec              
   C   s   | j |dd|||||d d S )Nr   r<   )rB   )r+   r1   r2   r5   r6   r7   r8   r9   r   r   r   delete_cookieM   s   

zBaseResponse.delete_cookieas_bytesTc                C      d S r   r   r+   rD   r   r   r   list_headersb   r   zBaseResponse.list_headersc                C   rE   r   r   rF   r   r   r   rG   e   r   c                C   sJ   |rg dd | j  D dd | jD S g | j  dd | jD S )zR
        Merge `self.headers` and `self.cookies` then returned as a list.
        c                 s   s(    | ]\}}| d | d fV  qdS )latin-1Nencode).0r1   r2   r   r   r   	<genexpr>n   s
    
z,BaseResponse.list_headers.<locals>.<genexpr>c                 s       | ]	}d t |fV  qdS )s
   set-cookieN)bytesrK   cookier   r   r   rL   r       c                 s   rM   )z
set-cookieN)strrO   r   r   r   rL   w   rQ   )r(   itemsr*   rF   r   r   r   rG   h   s   )r&   N)r-   r.   Nr/   NFFr0   )r-   r/   NFFr0   )__name__
__module____qualname__intr
   r	   rR   r,   boolr"   rB   rC   r   r   r   rN   rG   r   r   r   r   r%   &   s    

	

!	
$$r%   c                   @   s   e Zd Zdededee dejdeeef f
ddZe	dejdefdd	Z
ed
edejdefddZe	dededeeeeeef f  fddZdeeeef  dedededeeeeegef f f
ddZdS )FileResponseMixinfilepathcontent_typedownload_namestat_resultr)   c                 C   s`   dt |jddd| | dd}|s|dkr.|ptj|}d| dt| }||d	< |S )
NrN   Tusegmt")zaccept-rangeszlast-modifiedetagzapplication/octet-streamzattachment; filename="z"; filename*=utf-8''zcontent-disposition)r   st_mtimegenerate_etagosr5   basenamer   )r+   rZ   r[   r\   r]   r(   content_dispositionr   r   r   generate_common_headers}   s   z)FileResponseMixin.generate_common_headersc                 C   s$   | j  d| j }t|d S )N-ascii)rb   st_sizer   rJ   	hexdigest)r]   datar   r   r   rc      s   zFileResponseMixin.generate_etagif_range_raw_linec                 C   s(   |d|  | dkp|t|jddkS )z^
        Judge whether if-range is consistent with the value of etag or last-modified
        r`   Tr^   )rc   r   rb   )r   rm   r]   r   r   r   judge_if_range   s   z FileResponseMixin.judge_if_rangerange_raw_linemax_sizec                    s4  z| j ddd\}}W n
 ty   t w |dkrtd fddtd|D }t|d	kr5td
t fdd|D rDt tdd |D rQtdt|dkrY|S g }|D ]:\}}tt|D ](}|| \}	}
||
krtqg||	k r|	|||f  nt
||	t||
f||<  n|||f q]|S )zU
        Parse the Range header and make appropriate merge or cut processing
        =r   )maxsplitrN   zOnly support bytes rangec                    sl   g | ]2}|d kr|d rt |d n t |d  |d r1|d r1t |d  k r1t |d d n fqS ))r-   r-   r   r   )rW   rK   _rp   r   r   
<listcomp>   s    "2z1FileResponseMixin.parse_range.<locals>.<listcomp>z(\d*)-(\d*)r   z%Range header: range must be requestedc                 3   s.    | ]\}}d |  ko k n   V  qdS )r   Nr   )rK   startrt   ru   r   r   rL      s   , z0FileResponseMixin.parse_range.<locals>.<genexpr>c                 s   s    | ]	\}}||kV  qd S r   r   rK   rw   endr   r   r   rL      rQ   z)Range header: start must be less than end)split
ValueErrorr    refindalllenanyr!   rangeinsertminmaxr@   )ro   rp   unit
ranges_strrangesresultrw   ry   pp_startp_endr   ru   r   parse_range   s@   

	zFileResponseMixin.parse_ranger   boundaryc                    sV   t  }d| t  t t tfdd|D d|  }| fddfS )a  
        Multipart response headers generator.

        ```
        --{boundary}\n
        Content-Type: {content_type}\n
        Content-Range: bytes {start}-{end-1}/{max_size}\n
        \n
        ..........content...........\n
        --{boundary}\n
        Content-Type: {content_type}\n
        Content-Range: bytes {start}-{end-1}/{max_size}\n
        \n
        ..........content...........\n
        --{boundary}--\n
        ```
        ,   c                 3   s<    | ]\}}t t|t t|d     ||  V  qdS )r   N)r~   rR   rx   )static_header_part_lenr   r   rL      s    
z7FileResponseMixin.generate_multipart.<locals>.<genexpr>   c                    s.   d  d d|  d|d  d d dS )	Nz--z
Content-Type: z
Content-Range: bytes rh   r   r/   z

rH   rI   )rw   ry   )r   r[   rp   r   r   r      s   z6FileResponseMixin.generate_multipart.<locals>.<lambda>)r~   rR   sum)r+   r   r   rp   r[   boundary_lencontent_lengthr   )r   r[   rp   r   r   generate_multipart   s   z$FileResponseMixin.generate_multipartN)rT   rU   rV   rR   r
   rd   r]   r   rg   staticmethodrc   classmethodrX   rn   rW   r   r   r   r   r   rN   r   r   r   r   r   rY   {   sR    


2rY   eventcharsetr)   c                    sT   d| v r fdd|  d D }nd}dtt fdd|  |  |dS )	z/
    helper function for SendEventResponse
    rl   c                 3   s     | ]}d |   V  qdS )zdata: NrI   rs   r   r   r   rL     s    z'build_bytes_from_sse.<locals>.<genexpr>r      
c                    s   |  d|   S )Nz: rI   )kvr   r   r   r     s    z&build_bytes_from_sse.<locals>.<lambda>)    r   )pop
splitlinesjoinr   mapkeysvalues)r   r   rl   r   r   r   build_bytes_from_sse  s   r   iric                 C   s   t | ddS )z
    Convert an Internationalized Resource Identifier (IRI) portion to a URI portion
    that is suitable for inclusion in a URL.
    z/#%[]=:;$&()+,!?*@'~)safer   )r   r   r   r   
iri_to_uri  s   r   ))r=   rd   r|   r?   email.utilsr   hashlibr   	itertoolsr   typingr   r   r   r   r	   r
   r   r   r   r   urllib.parser   mypy_extensionsr   r   ImportErrordatastructuresr   r   
exceptionsr    r!   r"   r#   r%   rY   rR   rN   r   r   r   r   r   r   <module>   s2    0	T 
