U
    &%e                     @   sv   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 )    N)HeadersMutableHeaders)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)DELETEGETHEADOPTIONSPATCHPOSTPUTAcceptzAccept-LanguagezContent-LanguagezContent-Typec                   @   s   e Zd Zdeeje eje eje eej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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|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   X/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/starlette/middleware/cors.py
<listcomp>A   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_regexr6   r7   r8   r9   r:   r   r   r+   __init__   sN    


zCORSMiddleware.__init__)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typehttpmethodr=   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)r;   r=   r>   r?   rB   headersrD   responser   r   r+   __call__I   s    

zCORSMiddleware.__call__)rD   r   c                 C   s.   | j r
dS | jd k	r$| j|r$dS || jkS )NT)r6   r   	fullmatchr   )r;   rD   r   r   r+   is_allowed_origin]   s    z CORSMiddleware.is_allowed_origin)rF   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 )NrD   rE   zaccess-control-request-headersrD   r!   rB   r%   c                 S   s   g | ]}|  qS r   r&   r(   r   r   r+   r,      s     z5CORSMiddleware.preflight_response.<locals>.<listcomp>,rJ   zDisallowed CORS r#   i  )status_coderJ   OK   )rG   dictr:   rN   r8   appendr   r7   splitstripr   r0   r   )	r;   rF   Zrequested_originZrequested_methodZrequested_headersrJ   ZfailuresheaderZfailure_textr   r   r+   rH   h   s,    







z!CORSMiddleware.preflight_response)r=   r>   r?   rF   r   c                    s*   t j| j||d}| |||I d H  d S )N)r?   rF   )	functoolspartialr?   r   )r;   r=   r>   r?   rF   r   r   r+   rI      s    zCORSMiddleware.simple_response)messager?   rF   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.startrJ   rC   r$   cookierO   )
setdefaultr   r1   r9   r6   allow_explicit_originrN   )r;   r[   r?   rF   rJ   rD   Z
has_cookier   r   r+   r?      s    

zCORSMiddleware.send)rJ   rD   r   c                 C   s   || d< |  d d S )Nr!   r$   )Zadd_vary_header)rJ   rD   r   r   r+   r^      s    z$CORSMiddleware.allow_explicit_origin)r   r   r   FNr   r   )__name__
__module____qualname__r   typingSequencer2   boolOptionalintr<   r	   r   r
   rL   rN   r   r   rH   rI   r   r?   staticmethodr   r^   r   r   r   r+   r      sD          ;'     r   )rY   r.   rb   Zstarlette.datastructuresr   r   Zstarlette.responsesr   r   Zstarlette.typesr   r   r   r	   r
   r-   r4   r   r   r   r   r+   <module>   s   