o
    ).h                     @  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 d dlmZ d dl	m
Z
 d dl	mZ d d	lmZ d d
l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   U/var/www/supernova/superenvnew/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__1   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   G   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    T   sP   





z#CorsMiddleware.add_response_headersr.   rC   rI   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.   rI   r   r   r   r5      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   rN      s   z!CorsMiddleware.regex_domain_matchc                 C  s   t ttj|jp| |S r   )rJ   rO   rP   r   CORS_URLS_REGEX	path_infor6   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   )rQ   functionreturn_valuer   r   r   rS      s    z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   sendrT   )r   r   signal_responsesr   r   r   r6      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   )rQ   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)rQ   r.   rI   r   r   rS      s
    
z3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r   rL   rT   )r   rI   originsr   ra   r   rM      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.   rC   rI   r   r   rJ   )r.   rC   r   rJ   )r   r
   r   rJ   )rI   r   r   rJ   )__name__
__module____qualname__sync_capableasync_capabler   r$   r   r   r    r5   rN   r)   r6   rM   r   r   r   r   r      s    



	

:


r   ) 
__future__r   rO   typingr   r   urllib.parser   r   asgiref.syncr   r	   django.httpr
   r   django.http.responser   django.utils.cacher   corsheaders.confr   corsheaders.signalsr   r8   r=   r9   r?   rA   rD   rF   rG   r   r   r   r   r   <module>   s.    