o
    ÖèFhË  ã                   @  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   úO/var/www/html/loop/nvenv/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r†d tj¡|t< d tj¡|t< tjr†ttjƒ|t< tjr•|j t¡dkr•d|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.    