a
    h                     @  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>   zAccept-LanguagezContent-LanguagezContent-TypeAcceptc                   @  s   e Zd Zd)dddddd	dd
dd	ddZdddddddZdddddZdddddZdddddddd Zd!dddd"d#d$Ze	d%ddd&d'd(Z
dS )*CORSMiddleware r   FNX  r   zSequence[str]boolz
str | NoneintNone)	appallow_originsallow_methodsallow_headersallow_credentialsallow_origin_regexexpose_headersmax_agereturnc	                 C  s  d|v rt }d }	|d ur"t|}	d|v }
d|v }|
 p:|}i }|
rLd|d< |rXd|d< |rjd||d< i }|r|d|d< nd|d< |d|t|d	 ttt|B }|r|sd||d
< |rd|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  s   g | ]}|  qS r   lower.0hr   r   U/var/www/html/assistant/venv/lib/python3.9/site-packages/starlette/middleware/cors.py
<listcomp>C       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!   simple_headerspreflight_headers)selfr   r   r   r   r    r!   r"   r#   Zcompiled_allow_origin_regexr<   r=   r>   r?   r@   r   r   r0   __init__   sN    


zCORSMiddleware.__init__r   r
   r   )scopereceivesendr$   c                   s   |d dkr$|  |||I d H  d S |d }t|d}|d}|d u r`|  |||I d H  d S |dkrd|v r| j|d}||||I d H  d S | j||||dI d H  d S )	NtypehttpmethodrC   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)rA   rC   rD   rE   rH   headersrJ   responser   r   r0   __call__K   s    

zCORSMiddleware.__call__r8   )rJ   r$   c                 C  s.   | j r
dS | jd ur$| j|r$dS || jv S )NT)r<   r!   	fullmatchr   )rA   rJ   r   r   r0   is_allowed_origin_   s
    z CORSMiddleware.is_allowed_originr   r   )rL   r$   c           	      C  s   |d }|d }| d}t| j}g }| j|drD| jrN||d< n
|d || jvrb|d | jrz|d urz||d< n>|d urdd	 |d
D D ] }|	 | j
vr|d  qq|rdd| }t|d|dS tdd|dS )NrJ   rK   zaccess-control-request-headersrJ   r&   rH   r*   c                 S  s   g | ]}|  qS r   r+   r-   r   r   r0   r1      r2   z5CORSMiddleware.preflight_response.<locals>.<listcomp>,rP   zDisallowed CORS r(   i  )status_coderP   OK   )rM   dictr@   rT   r>   appendr   r=   splitstripr   r6   r   )	rA   rL   Zrequested_originZrequested_methodZrequested_headersrP   ZfailuresheaderZfailure_textr   r   r0   rN   h   s,    







z!CORSMiddleware.preflight_response)rC   rD   rE   rL   r$   c                   s*   t j| j||d}| |||I d H  d S )N)rE   rL   )	functoolspartialrE   r   )rA   rC   rD   rE   rL   r   r   r0   rO      s    zCORSMiddleware.simple_responser	   )messagerE   rL   r$   c                   s   |d dkr||I d H  d S | dg  t|d}|| j |d }d|v }| jrh|rh| || n| js| j|dr| || ||I d H  d S )NrF   zhttp.response.startrP   rI   r)   cookierU   )
setdefaultr   r7   r?   r<   allow_explicit_originrT   )rA   ra   rE   rL   rP   rJ   Z
has_cookier   r   r0   rE      s    

zCORSMiddleware.sendr   )rP   rJ   r$   c                 C  s   || d< |  d d S )Nr&   r)   )Zadd_vary_header)rP   rJ   r   r   r0   rd      s    z$CORSMiddleware.allow_explicit_origin)r   r   r   FNr   r   )__name__
__module____qualname__rB   rR   rT   rN   rO   rE   staticmethodrd   r   r   r   r0   r      s           ;	&r   )
__future__r   r_   r4   collections.abcr   Zstarlette.datastructuresr   r   Zstarlette.responsesr   r   Zstarlette.typesr   r	   r
   r   r   r3   r:   r   r   r   r   r0   <module>   s   