o
    $6d                     @   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HEADOPTIONSPATCHPOSTPUT>   AcceptzAccept-LanguagezContent-LanguagezContent-Typec                   @   s   e Zd Z							d$dedeje deje d	eje d
edeje deje de	ddfddZ
dedededdfddZdedefddZdedefddZdededededdf
ddZdedededdfdd Zed!ededdf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|}	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   pC:\Users\jesus\OneDrive\Desktop\erpjis_fastapi\backend\jisbackend\Lib\site-packages\starlette/middleware/cors.py
<listcomp>A       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_regexr8   r9   r:   r;   r<   r   r   r,   __init__   sN   



zCORSMiddleware.__init__scopereceivesendc                    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r?   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)r=   r?   r@   rA   rD   headersrF   responser   r   r,   __call__I   s   

zCORSMiddleware.__call__rF   c                 C   s.   | j rdS | jd ur| j|rdS || jv S )NT)r8   r   	fullmatchr   )r=   rF   r   r   r,   is_allowed_origin]   s   
z CORSMiddleware.is_allowed_originrH   c           	      C   s   |d }|d }| d}t| j}g }| j|dr"| jr!||d< n|d || jvr1|d | jr=|d ur=||d< n|d ur\dd	 |d
D D ]}|	 | j
vr[|d  nqK|rldd| }t|d|dS tdd|dS )NrF   rG   zaccess-control-request-headersrF   r!   rD   r%   c                 S   r&   r   r'   r)   r   r   r,   r-      r.   z5CORSMiddleware.preflight_response.<locals>.<listcomp>,rL   zDisallowed CORS r#   i  )status_coderL   OK   )rI   dictr<   rP   r:   appendr   r9   splitstripr   r2   r   )	r=   rH   Zrequested_originZrequested_methodZrequested_headersrL   ZfailuresheaderZfailure_textr   r   r,   rJ   h   s0   






z!CORSMiddleware.preflight_responsec                    s,   t j| j||d}| |||I d H  d S )N)rA   rH   )	functoolspartialrA   r   )r=   r?   r@   rA   rH   r   r   r,   rK      s   zCORSMiddleware.simple_responsemessagec                    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 )NrB   zhttp.response.startrL   rE   r$   cookierQ   )
setdefaultr   r3   r;   r8   allow_explicit_originrP   )r=   r]   rA   rH   rL   rF   Z
has_cookier   r   r,   rA      s   

zCORSMiddleware.sendrL   c                 C   s   || d< |  d d S )Nr!   r$   )Zadd_vary_header)rL   rF   r   r   r,   r`      s   z$CORSMiddleware.allow_explicit_origin)r   r   r   FNr   r   )__name__
__module____qualname__r   typingSequencer4   boolOptionalintr>   r	   r   r
   rN   rP   r   r   rJ   rK   r   rA   staticmethodr   r`   r   r   r   r,   r      sh    	

;&

r   )r[   r0   rd   Zstarlette.datastructuresr   r   Zstarlette.responsesr   r   Zstarlette.typesr   r   r   r	   r
   r/   r6   r   r   r   r   r,   <module>   s    