a
    ((a                     @   sr   d dl Z d dlZd dl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 )	    N)HeadersMutableHeaders)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)DELETEGETOPTIONSPATCHPOSTPUT>   zAccept-LanguagezContent-LanguageAcceptzContent-Typec                   @   s   e Zd Zdeeje eje eje eeeje edd	ddZ	e
eedd	d
dZeedddZeedddZe
eeeddddZeeeddddZdS )CORSMiddleware r   FNX  )	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|}	i }
d|v r6d|
d< |rBd|
d< |rTd||
d< i }d|v rjd|d< nd|d< |d|t|d	 ttt|B }|rd|vrd||d
< |rd|d< || _	|| _
|| _dd |D | _d|v | _d|v | _|	| _|
| _|| _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   `/Users/bob/PycharmProjects/fastapi/venv/lib/python3.9/site-packages/starlette/middleware/cors.py
<listcomp>=       z+CORSMiddleware.__init__.<locals>.<listcomp>)ALL_METHODSrecompilejoinupdatestrsortedSAFELISTED_HEADERSsetr   r   r   r   allow_all_originsallow_all_headersr   simple_headerspreflight_headers)selfr   r   r   r   r   r   r   r   Zcompiled_allow_origin_regexr8   r9   r   r   r*   __init__   sF    



zCORSMiddleware.__init__)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r<   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)r:   r<   r=   r>   rA   headersrC   responser   r   r*   __call__D   s    

zCORSMiddleware.__call__)rC   r   c                 C   s.   | j r
dS | jd ur$| j|r$dS || jv S )NT)r6   r   	fullmatchr   )r:   rC   r   r   r*   is_allowed_originX   s    z CORSMiddleware.is_allowed_origin)rE   r   c           	      C   s   |d }|d }| d}t| j}g }| j|drD| jsN||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 q|rdd| }t|d|dS tdd|dS )NrC   rD   zaccess-control-request-headersrC   r    rA   r$   c                 S   s   g | ]}|  qS r   r%   r'   r   r   r*   r+   }   r,   z5CORSMiddleware.preflight_response.<locals>.<listcomp>,rI   zDisallowed CORS r"   i  )status_coderI   OK   )rF   dictr9   rM   r6   appendr   r7   splitstripr   r0   r   )	r:   rE   Zrequested_originZrequested_methodZrequested_headersrI   ZfailuresheaderZfailure_textr   r   r*   rG   c   s*    






z!CORSMiddleware.preflight_response)r<   r=   r>   rE   r   c                    s*   t j| j||d}| |||I d H  d S )N)r>   rE   )	functoolspartialr>   r   )r:   r<   r=   r>   rE   r   r   r*   rH      s    zCORSMiddleware.simple_response)messager>   rE   r   c                    s   |d dkr||I d H  d S | dg  t|d}|| j |d }d|v }| jrd|rd||d< n$| js| j|dr||d< |d ||I d H  d S )	Nr?   zhttp.response.startrI   rB   r#   cookier    rN   )
setdefaultr   r1   r8   r6   rM   Zadd_vary_header)r:   rZ   r>   rE   rI   rC   Z
has_cookier   r   r*   r>      s    



zCORSMiddleware.send)r   r   r   FNr   r   )__name__
__module____qualname__r   typingSequencer2   boolintr;   r	   r   r
   rK   rM   r   r   rG   rH   r   r>   r   r   r   r*   r      s6          6(r   )rX   r.   r`   Zstarlette.datastructuresr   r   Zstarlette.responsesr   r   Zstarlette.typesr   r   r   r	   r
   r-   r4   r   r   r   r   r*   <module>   s   