
    )O=d                         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          ZdS )	    N)HeadersMutableHeaders)PlainTextResponseResponse)ASGIAppMessageReceiveScopeSend)DELETEGETHEADOPTIONSPATCHPOSTPUT>   Content-TypeAccept-LanguageContent-LanguageAcceptc                   H   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Z
dedededdfdZdedefdZdedefdZdededededdf
dZdedededdfdZedededdfd            ZdS )CORSMiddleware r   FNX  appallow_originsallow_methodsallow_headersallow_credentialsallow_origin_regexexpose_headersmax_agereturnc	                 v   d|v rt           }d }	|t          j        |          }	d|v }
d|v }|
 p|}i }|
rd|d<   |rd|d<   |rd                    |          |d<   i }|rd|d<   nd|d<   |                    d                    |          t          |          d	           t          t          t          |          z            }|r|sd                    |          |d
<   |rd|d<   || _	        || _
        || _        d |D             | _        |
| _        || _        || _        |	| _        || _        || _        d S )N*Access-Control-Allow-Origintruez Access-Control-Allow-Credentials, zAccess-Control-Expose-HeadersOriginVary)zAccess-Control-Allow-MethodszAccess-Control-Max-AgeAccess-Control-Allow-Headersc                 6    g | ]}|                                 S r   lower.0hs     CD:\Sites\api_v1\venv\Lib\site-packages\starlette/middleware/cors.py
<listcomp>z+CORSMiddleware.__init__.<locals>.<listcomp>B   s     ???Aaggii???    )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#   compiled_allow_origin_regexr?   r@   rA   rB   rC   s                  r3   __init__zCORSMiddleware.__init__   s    -'M&*#)*,*5G*H*H'=0=0.?*?*TCT' 	@<?N89 	HAGN=> 	X>Bii>W>WN:;* 	C(0f%%?B;<  04		-0H0H*-g,, 	
 	
 	
 1C4F4FFGG 	Y!2 	Y@D		-@X@X<= 	KDJ@A**?????!2!2/N,"=,!2r5   scopereceivesendc                   K   |d         dk    r|                      |||           d {V  d S |d         }t          |          }|                    d          }||                      |||           d {V  d S |dk    r/d|v r+|                     |          } ||||           d {V  d S |                     ||||           d {V  d S )	NtypehttpmethodrG   originr   access-control-request-method)request_headers)r   r   getpreflight_responsesimple_response)rD   rG   rH   rI   rM   headersrO   responses           r3   __call__zCORSMiddleware.__call__J   s*     =F""((5'4000000000Fx&&&X&&>((5'4000000000FY#Bg#M#M..w.GGH(5'4000000000F""5'4"QQQQQQQQQQQr5   rO   c                 l    | j         rdS | j        | j                            |          rdS || j        v S )NT)r?   r!   	fullmatchr   )rD   rO   s     r3   is_allowed_originz CORSMiddleware.is_allowed_origin^   sK    ! 	4".43J3T3T4
 4
. 4+++r5   rQ   c                 j   |d         }|d         }|                     d          }t          | j                  }g }|                     |          r| j        r||d<   n|                    d           || j        vr|                    d           | j        r|||d<   nV|Td |                    d	          D             D ]4}|	                                | j
        vr|                    d
            n5|r*dd                    |          z   }t          |d|          S t          dd|          S )NrO   rP   zaccess-control-request-headersrO   r'   rM   r,   c                 6    g | ]}|                                 S r   r.   r0   s     r3   r4   z5CORSMiddleware.preflight_response.<locals>.<listcomp>   s     KKK17799KKKr5   ,rU   zDisallowed CORS r)   i  )status_coderU   OK   )rR   dictrC   rZ   rA   appendr   r@   splitstripr   r9   r   )	rD   rQ   requested_originrequested_methodrequested_headersrU   failuresheaderfailure_texts	            r3   rS   z!CORSMiddleware.preflight_responsei   sz   *84*+JK+//0PQQt-..!!)9!:: 	&3 J :J56OOH%%%4#555OOH%%% ! 	&7&C6GG233*KK.?.E.Ec.J.JKKK  <<>>);;;OOI...E <  	U-		(0C0CCL$\sGTTTT 3HHHHr5   c                 |   K   t          j        | j        ||          }|                     |||           d {V  d S )N)rI   rQ   )	functoolspartialrI   r   )rD   rG   rH   rI   rQ   s        r3   rT   zCORSMiddleware.simple_response   sO        WWWhhugt,,,,,,,,,,,r5   messagec                   K   |d         dk    r ||           d {V  d S |                     dg            t          |          }|                    | j                   |d         }d|v }| j        r|r|                     ||           n3| j        s,|                     |          r|                     ||            ||           d {V  d S )NrK   zhttp.response.startrU   rN   r*   cookier\   )
setdefaultr   r:   rB   r?   allow_explicit_originrZ   )rD   ro   rI   rQ   rU   rO   
has_cookies          r3   rI   zCORSMiddleware.send   s      6?333$w--F9b))) w///t*+++ *0
 ! 	8j 	8&&w7777 ' 	8D,B,B&,B,Q,Q 	8&&w777d7mmr5   rU   c                 :    || d<   |                      d           d S )Nr'   r*   )add_vary_header)rU   rO   s     r3   rs   z$CORSMiddleware.allow_explicit_origin   s'    17-.)))))r5   )r   r   r   FNr   r   )__name__
__module____qualname__r   typingSequencer;   boolOptionalintrF   r
   r	   r   rW   rZ   r   r   rS   rT   r   rI   staticmethodr   rs   r   r5   r3   r   r      s        /1.6.0"'37/1:3 :3:3 s+:3 s+	:3
 s+:3  :3 #OC0:3 ,:3 :3 
:3 :3 :3 :3xRE RG R4 RD R R R R(	, 	, 	, 	, 	, 	,$I' $Ih $I $I $I $IL--%,-48-KR-	- - - -&*=D	   2 *~ *s *t * * * \* * *r5   r   )rm   r7   rz   starlette.datastructuresr   r   starlette.responsesr   r   starlette.typesr   r   r	   r
   r   r6   r=   r   r   r5   r3   <module>r      s        				  < < < < < < < < ; ; ; ; ; ; ; ; B B B B B B B B B B B B B BJVVV d* d* d* d* d* d* d* d* d* d*r5   