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   ú`C:\Users\psant\Downloads\Anu Raj Backend\school\venv\Lib\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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   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   Q   sR   

ÿÿ
þý

ÿ
ÿþz#CorsMiddleware.add_response_headersr-   r<   rA   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-   rA   r   r   r   r3   ‹   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   rF   ’   s   þz!CorsMiddleware.regex_domain_matchc                 C  s   t t tj|j¡ƒp|  |¡S r   )rB   rG   rH   r   ZCORS_URLS_REGEXZ	path_infor4   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   )rI   ÚfunctionÚreturn_valuer   r   r   rJ   Ÿ   s   € z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   ÚsendrK   )r   r   Zsignal_responsesr   r   r   r4   �   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   )rI   Ú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)rI   r-   ©rA   r   r   rJ   £   s
   € ÿ
ÿz3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r   rD   rK   )r   rA   Zoriginsr   rS   r   rE   ¡   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<   rA   r   r   rB   )r-   r<   r   rB   )r   r	   r   rB   )rA   r   r   rB   )Ú__name__Ú
__module__Ú__qualname__Zsync_capableZasync_capabler   r#   r   r   r   r3   rF   r(   r4   rE   r   r   r   r   r      s    



	

:


r   )!Ú
__future__r   rG   Úcollections.abcr   Útypingr   Ú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   r5   r9   r6   r:   r;   r=   r>   r?   r   r   r   r   r   Ú<module>   s(    