U
    Rh                     @  s   d dl mZ 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ddd	d
hZG dd dZdS )    )annotationsN)HeadersMutableHeaders)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)ZDELETEGETZHEADOPTIONSZPATCHZPOSTZPUTZAcceptzAccept-LanguagezContent-LanguagezContent-Typec                   @  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typing.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|krt }d }	|d k	r"t|}	d|k}
d|k}|
 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   ?./venv/lib/python3.8/site-packages/starlette/middleware/cors.py
<listcomp>C   s     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_regexr4   r5   r6   r7   r8   r   r   r)   __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 kr`|  |||I d H  d S |dkrd|kr| j|d}||||I d H  d S | j||||dI d H  d S )	NtypeZhttpmethodr;   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)r9   r;   r<   r=   r?   headersrA   Zresponser   r   r)   __call__K   s    

zCORSMiddleware.__call__r0   )rA   r   c                 C  s.   | j r
dS | jd k	r$| j|r$dS || jkS )NT)r4   r   	fullmatchr   )r9   rA   r   r   r)   is_allowed_origin_   s
    z CORSMiddleware.is_allowed_originr   r   )rC   r   c           	      C  s   |d }|d }| d}t| j}g }| j|drD| jrN||d< n
|d || jkrb|d | jrz|d k	rz||d< n>|d k	rdd	 |d
D D ] }|	 | j
kr|d  qq|rdd| }t|d|dS tdd|dS )NrA   rB   zaccess-control-request-headersrA   r   r?   r#   c                 S  s   g | ]}|  qS r   r$   r&   r   r   r)   r*      s     z5CORSMiddleware.preflight_response.<locals>.<listcomp>,rG   zDisallowed CORS r!   i  )Zstatus_coderG   ZOK   )rD   dictr8   rJ   r6   appendr   r5   splitstripr   r.   r   )	r9   rC   Zrequested_originZrequested_methodZrequested_headersrG   ZfailuresheaderZfailure_textr   r   r)   rE   h   s,    







z!CORSMiddleware.preflight_response)r;   r<   r=   rC   r   c                   s*   t j| j||d}| |||I d H  d S )N)r=   rC   )	functoolspartialr=   r   )r9   r;   r<   r=   rC   r   r   r)   rF      s    zCORSMiddleware.simple_responser   )messager=   rC   r   c                   s   |d dkr||I d H  d S | dg  t|d}|| j |d }d|k}| jrh|rh| || n| js| j|dr| || ||I d H  d S )Nr>   zhttp.response.startrG   r@   r"   ZcookierK   )
setdefaultr   r/   r7   r4   allow_explicit_originrJ   )r9   rU   r=   rC   rG   rA   Z
has_cookier   r   r)   r=      s    

zCORSMiddleware.sendr   )rG   rA   r   c                 C  s   || d< |  d d S )Nr   r"   )Zadd_vary_header)rG   rA   r   r   r)   rW      s    z$CORSMiddleware.allow_explicit_origin)r   r   r   FNr   r   )__name__
__module____qualname__r:   rH   rJ   rE   rF   r=   staticmethodrW   r   r   r   r)   r      s           ;	&r   )Z
__future__r   rS   r,   typingZstarlette.datastructuresr   r   Zstarlette.responsesr   r   Zstarlette.typesr   r   r	   r
   r   r+   r2   r   r   r   r   r)   <module>   s   