o
    i                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 d dl
mZmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZ dZdZdZdZdZdZdZdZG dd dZ dS )    )annotationsN)	Awaitable)Callable)SplitResulturlsplit)iscoroutinefunctionmarkcoroutinefunction)HttpRequestHttpResponse)HttpResponseBase)patch_vary_headers)conf)check_request_enabledzaccess-control-allow-originzaccess-control-expose-headersz access-control-allow-credentialszaccess-control-allow-headerszaccess-control-allow-methodszaccess-control-max-agez&access-control-request-private-networkz$access-control-allow-private-networkc                   @  sx   e Zd ZdZdZd&ddZd'ddZd(ddZd)ddZd*ddZ	d+ddZ
d,ddZd-dd Zd-d!d"Zd.d#d$Zd%S )/CorsMiddlewareTget_response`Callable[[HttpRequest], HttpResponseBase] | Callable[[HttpRequest], Awaitable[HttpResponseBase]]returnNonec                 C  s(   || _ t| j | _| jrt|  d S d S N)r   r   
async_moder   )selfr    r   v/var/www/snowflake_co_dev_github/snow_flake_back_end_deploy/env/lib/python3.10/site-packages/corsheaders/middleware.py__init__   s
   zCorsMiddleware.__init__requestr	   .HttpResponseBase | Awaitable[HttpResponseBase]c                 C  sN   | j r| |S | |}|d u r| |}t|tsJ |}| || |S r   )r   	__acall__check_preflightr   
isinstancer   add_response_headersr   r   responseresultr   r   r   __call__.   s   


zCorsMiddleware.__call__r   c                   sF   |  |}|d u r| |}t|trJ |I d H }| || |S r   )r   r   r   r   r   r    r   r   r   r   ;   s   


zCorsMiddleware.__acall__HttpResponseBase | Nonec                 C  s8   |  ||_|jr|jdkrd|jv rtddidS dS )zB
        Generate a response for CORS preflight requests.
        OPTIONSzaccess-control-request-methodzcontent-length0)headersN)
is_enabled_cors_enabledmethodr'   r
   r   r   r   r   r   r   D   s   

zCorsMiddleware.check_preflightr!   c                 C  s.  t |dd}|du r| |}|s|S t|d |jd}|s"|S zt|}W n ty3   | Y S w tjsD| 	||sD| 
|sD|S tjrOtjsOd|t< n||t< tjrZd|t< ttjrgdtj|t< |jdkrdtj|t< dtj|t< tjrttj|t< tjr|jtdkrd|t< |S )	z1
        Add the respective CORS headers
        r)   Noriginr-   *truez, r%   )getattrr(   r   r'   getr   
ValueErrorr   CORS_ALLOW_ALL_ORIGINSorigin_found_in_white_listscheck_signalCORS_ALLOW_CREDENTIALSACCESS_CONTROL_ALLOW_ORIGIN ACCESS_CONTROL_ALLOW_CREDENTIALSlenCORS_EXPOSE_HEADERSjoinACCESS_CONTROL_EXPOSE_HEADERSr*   CORS_ALLOW_HEADERSACCESS_CONTROL_ALLOW_HEADERSCORS_ALLOW_METHODSACCESS_CONTROL_ALLOW_METHODSCORS_PREFLIGHT_MAX_AGEstrACCESS_CONTROL_MAX_AGECORS_ALLOW_PRIVATE_NETWORK&ACCESS_CONTROL_REQUEST_PRIVATE_NETWORK$ACCESS_CONTROL_ALLOW_PRIVATE_NETWORK)r   r   r!   enabledr-   urlr   r   r   r   Q   sP   





z#CorsMiddleware.add_response_headersr-   rB   rH   r   boolc                 C  s&   |dkr	|t jv p| |p| |S )Nnull)r   CORS_ALLOWED_ORIGINS_url_in_whitelistregex_domain_match)r   r-   rH   r   r   r   r4      s
   z*CorsMiddleware.origin_found_in_white_listsc                   s   t  fddtjD S )Nc                 3  s    | ]	}t | V  qd S r   )rematch).0domain_patternr,   r   r   	<genexpr>   s
    

z4CorsMiddleware.regex_domain_match.<locals>.<genexpr>)anyr   CORS_ALLOWED_ORIGIN_REGEXES)r   r-   r   r,   r   rM      s   z!CorsMiddleware.regex_domain_matchc                 C  s   t ttj|jp| |S r   )rI   rN   rO   r   CORS_URLS_REGEX	path_infor5   r+   r   r   r   r(      s
   zCorsMiddleware.is_enabledc                 C  s    t jd |d}tdd |D S )N)senderr   c                 s  s    | ]\}}|V  qd S r   r   )rP   functionreturn_valuer   r   r   rR      s    z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   sendrS   )r   r   signal_responsesr   r   r   r5      s   zCorsMiddleware.check_signalc                   s&   dd t jD }t fdd|D S )Nc                 S  s   g | ]}t |qS r   )r   )rP   or   r   r   
<listcomp>   s    z4CorsMiddleware._url_in_whitelist.<locals>.<listcomp>c                 3  s(    | ]}|j  j ko|j jkV  qd S r   )schemenetloc)rP   r-   rH   r   r   rR      s
    
z3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r   rK   rS   )r   rH   originsr   r`   r   rL      s   z CorsMiddleware._url_in_whitelistN)r   r   r   r   )r   r	   r   r   )r   r	   r   r   )r   r	   r   r$   )r   r	   r!   r   r   r   )r-   rB   rH   r   r   rI   )r-   rB   r   rI   )r   r	   r   rI   )rH   r   r   rI   )__name__
__module____qualname__sync_capableasync_capabler   r#   r   r   r   r4   rM   r(   r5   rL   r   r   r   r   r      s    



	

:


r   )!
__future__r   rN   collections.abcr   typingr   urllib.parser   r   asgiref.syncr   r   django.httpr	   r
   django.http.responser   django.utils.cacher   corsheaders.confr   corsheaders.signalsr   r7   r<   r8   r>   r@   rC   rE   rF   r   r   r   r   r   <module>   s(    