o
    bZh                     @  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   M/var/www/html/lang_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__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   ZCORS_ALLOW_ALL_ORIGINSorigin_found_in_white_listscheck_signalZCORS_ALLOW_CREDENTIALSACCESS_CONTROL_ALLOW_ORIGIN ACCESS_CONTROL_ALLOW_CREDENTIALSlenZCORS_EXPOSE_HEADERSjoinACCESS_CONTROL_EXPOSE_HEADERSr+   ZCORS_ALLOW_HEADERSACCESS_CONTROL_ALLOW_HEADERSZCORS_ALLOW_METHODSACCESS_CONTROL_ALLOW_METHODSZCORS_PREFLIGHT_MAX_AGEstrACCESS_CONTROL_MAX_AGEZ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.   r=   rB   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.   rB   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).0Zdomain_patternr-   r   r   	<genexpr>   s
    

z4CorsMiddleware.regex_domain_match.<locals>.<genexpr>)anyr   ZCORS_ALLOWED_ORIGIN_REGEXES)r   r.   r   r-   r   rG      s   z!CorsMiddleware.regex_domain_matchc                 C  s   t ttj|jp| |S r   )rC   rH   rI   r   ZCORS_URLS_REGEXZ	path_infor5   r,   r   r   r   r)      s
   zCorsMiddleware.is_enabledc                 C  s    t jd |d}tdd |D S )N)Zsenderr   c                 s  s    | ]\}}|V  qd S r   r   )rJ   functionreturn_valuer   r   r   rK      s    z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   sendrL   )r   r   Z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   )rJ   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)rJ   r.   rB   r   r   rK      s
    
z3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r   rE   rL   )r   rB   Zoriginsr   rT   r   rF      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.   r=   rB   r   r   rC   )r.   r=   r   rC   )r   r
   r   rC   )rB   r   r   rC   )__name__
__module____qualname__Zsync_capableZasync_capabler   r$   r   r   r    r4   rG   r)   r5   rF   r   r   r   r   r      s    



	

:


r   ) 
__future__r   rH   typingr   r   urllib.parser   r   Zasgiref.syncr   r	   Zdjango.httpr
   r   Zdjango.http.responser   Zdjango.utils.cacher   Zcorsheaders.confr   Zcorsheaders.signalsr   r6   r:   r7   r;   r<   r>   r?   r@   r   r   r   r   r   <module>   s.    