o
    ig                     @  s   d dl mZ d dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
mZ d dlmZmZmZmZmZ dZh dZG d	d
 d
ZdS )    )annotationsN)Sequence)HeadersMutableHeaders)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)DELETEGETHEADOPTIONSPATCHPOSTPUT>   AcceptzAccept-LanguagezContent-TypezContent-Languagec                   @  sh   e Zd Z								d3d4ddZd5ddZd6d"d#Zd7d'd(Zd8d)d*Zd9d-d.Ze	d:d1d2Z
dS );CORSMiddleware r   FNX  appr   allow_originsSequence[str]allow_methodsallow_headersallow_credentialsboolallow_origin_regex
str | Noneallow_private_networkexpose_headersmax_ageintreturnNonec
                 C  s   d|v rt }d }
|d urt|}
d|v }d|v }| p|}i }|r&d|d< |r,d|d< |r5d||d< i }|r>d|d< nd|d< |d|t|	d	 ttt|B }|rb|sbd||d
< |rhd|d< || _	|| _
|| _dd |D | _|| _|| _|| _|
| _|| _|| _|| _d S )N*Access-Control-Allow-Origintruez Access-Control-Allow-Credentials, zAccess-Control-Expose-HeadersOriginZVary)zAccess-Control-Allow-MethodszAccess-Control-Max-AgeAccess-Control-Allow-Headersc                 S     g | ]}|  qS r   lower.0hr   r   P/home/app/Keep/.python/lib/python3.10/site-packages/starlette/middleware/cors.py
<listcomp>D       z+CORSMiddleware.__init__.<locals>.<listcomp>)ALL_METHODSrecompilejoinupdatestrsortedSAFELISTED_HEADERSsetr   r   r   r   allow_all_originsallow_all_headerspreflight_explicit_allow_originr    r"   simple_headerspreflight_headers)selfr   r   r   r   r   r    r"   r#   r$   Zcompiled_allow_origin_regexr@   rA   rB   rC   rD   r   r   r4   __init__   sP   



zCORSMiddleware.__init__scoper   receiver
   sendr   c                   s   |d dkr|  |||I d H  d S |d }t|d}|d}|d u r1|  |||I d H  d S |dkrJd|v rJ| j|d}||||I d H  d S | j||||dI d H  d S )	NtypehttpmethodrG   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)rE   rG   rH   rI   rL   headersrN   responser   r   r4   __call__M   s   

zCORSMiddleware.__call__rN   r<   c                 C  s.   | j rdS | jd ur| j|rdS || jv S )NT)r@   r    	fullmatchr   )rE   rN   r   r   r4   is_allowed_origina   s
   
z CORSMiddleware.is_allowed_originrP   r   r   c           
      C  s  |d }|d }| d}| d}t| j}g }| j|dr'| jr&||d< n|d || jvr6|d | jrB|d urB||d< n|d urad	d
 |dD D ]}|	 | j
vr`|d  nqP|d urr| jrmd|d< n|d |rdd| }	t|	d|dS tdd|dS )NrN   rO   zaccess-control-request-headersz&access-control-request-private-networkrN   r)   rL   r-   c                 S  r.   r   r/   r1   r   r   r4   r5      r6   z5CORSMiddleware.preflight_response.<locals>.<listcomp>,rT   r*   z$Access-Control-Allow-Private-Networkzprivate-networkzDisallowed CORS r+   i  )status_coderT   OK   )rQ   dictrD   rX   rB   appendr   rA   splitstripr   r"   r:   r   )
rE   rP   Zrequested_originZrequested_methodZrequested_headersZrequested_private_networkrT   ZfailuresheaderZfailure_textr   r   r4   rR   j   s:   









z!CORSMiddleware.preflight_responsec                   s,   t j| j||d}| |||I d H  d S )N)rI   rP   )	functoolspartialrI   r   )rE   rG   rH   rI   rP   r   r   r4   rS      s   zCORSMiddleware.simple_responsemessager	   c                   s   |d dkr||I d H  d S | dg  t|d}|| j |d }d|v }| jr5|r5| || n| jsD| j|drD| || ||I d H  d S )NrJ   zhttp.response.startrT   rM   r,   cookierY   )
setdefaultr   r;   rC   r@   allow_explicit_originrX   )rE   re   rI   rP   rT   rN   Z
has_cookier   r   r4   rI      s   

zCORSMiddleware.sendrT   r   c                 C  s   || d< |  d d S )Nr)   r,   )Zadd_vary_header)rT   rN   r   r   r4   rh      s   z$CORSMiddleware.allow_explicit_origin)r   r   r   FNFr   r   )r   r   r   r   r   r   r   r   r   r   r    r!   r"   r   r#   r   r$   r%   r&   r'   )rG   r   rH   r
   rI   r   r&   r'   )rN   r<   r&   r   )rP   r   r&   r   )
rG   r   rH   r
   rI   r   rP   r   r&   r'   )re   r	   rI   r   rP   r   r&   r'   )rT   r   rN   r<   r&   r'   )__name__
__module____qualname__rF   rV   rX   rR   rS   rI   staticmethodrh   r   r   r   r4   r      s"    
=

	
-
r   )
__future__r   rc   r8   collections.abcr   Zstarlette.datastructuresr   r   Zstarlette.responsesr   r   Zstarlette.typesr   r	   r
   r   r   r7   r>   r   r   r   r   r4   <module>   s    