U
    t=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 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                   @  s¸   e Zd ZdZdZdddœdd„Zddd	œd
d„Zddd	œdd„Zddd	œdd„Zddddœdd„Z	ddddœdd„Z
dddœdd„Zddd	œdd„Zddd	œd d!„Zddd"œd#d$„Zd%S )&ÚCorsMiddlewareTz`Callable[[HttpRequest], HttpResponseBase] | Callable[[HttpRequest], Awaitable[HttpResponseBase]]ÚNone)Úget_responseÚreturnc                 C  s$   || _ t| j ƒ| _| jr t| ƒ d S ©N)r   r   Ú
async_moder	   )Úselfr   © r   úV/var/www/html/mysite/school/venv/lib/python3.8/site-packages/corsheaders/middleware.pyÚ__init__!   s    zCorsMiddleware.__init__r
   z.HttpResponseBase | Awaitable[HttpResponseBase])Úrequestr   c                 C  sN   | j r|  |¡S |  |¡}|d kr>|  |¡}t|tƒs:t‚|}|  ||¡ |S r   )r   Ú	__acall__Úcheck_preflightr   Ú
isinstancer   ÚAssertionErrorÚadd_response_headers©r   r   ÚresponseÚresultr   r   r   Ú__call__1   s    


zCorsMiddleware.__call__r   c                 Ã  sD   |   |¡}|d kr4|  |¡}t|tƒr*t‚|I d H }|  ||¡ |S r   )r   r   r   r   r   r   r    r   r   r   r   >   s    


zCorsMiddleware.__acall__zHttpResponseBase | Nonec                 C  s8   |   |¡|_|jr4|jdkr4d|jkr4t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_preflight)r   r!   r   c                 C  s8  t |ddƒ}|dkr|  |¡}|s&|S t|dƒ |j d¡}|sD|S zt|ƒ}W n tk
rh   | Y S X tjsŠ|  	||¡sŠ|  
|¡sŠ|S tjr tjs d|t< n||t< tjr¶d|t< ttjƒrÐd tj¡|t< |jdk�rd tj¡|t< d tj¡|t< tj�rttjƒ|t< tj�r4|j t¡dk�r4d|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_headersrA   r   Úbool)r,   rG   r   c                 C  s&   |dkr|t jkp$|  |¡p$|  |¡S )NÚnull)r   ÚCORS_ALLOWED_ORIGINSÚ_url_in_whitelistÚregex_domain_match)r   r,   rG   r   r   r   r3   Ž   s
    ÿýz*CorsMiddleware.origin_found_in_white_lists)r,   r   c                   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   ÚCORS_ALLOWED_ORIGIN_REGEXES)r   r,   r   r+   r   rL   •   s    þz!CorsMiddleware.regex_domain_matchc                 C  s   t t tj|j¡ƒp|  |¡S r   )rH   rM   rN   r   ÚCORS_URLS_REGEXÚ	path_infor4   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   )rO   ÚfunctionÚreturn_valuer   r   r   rP   ¢   s     z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   ÚsendrQ   )r   r   Zsignal_responsesr   r   r   r4       s    zCorsMiddleware.check_signal)rG   r   c                   s&   dd„ t jD ƒ}t‡ fdd„|D ƒƒS )Nc                 S  s   g | ]}t |ƒ‘qS r   r   )rO   Ú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)rO   r,   ©rG   r   r   rP   ¦   s   ÿz3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r   rJ   rQ   )r   rG   Zoriginsr   r]   r   rK   ¤   s    þz CorsMiddleware._url_in_whitelistN)Ú__name__Ú
__module__Ú__qualname__Úsync_capableÚasync_capabler   r#   r   r   r   r3   rL   r'   r4   rK   r   r   r   r   r      s   	:r   ) Ú
__future__r   rM   Útypingr   r   Úurllib.parser   r   Úasgiref.syncr   r	   Údjango.httpr
   r   Údjango.http.responser   Údjango.utils.cacher   Úcorsheaders.confr   Zcorsheaders.signalsr   r6   r;   r7   r=   r?   rB   rD   rE   r   r   r   r   r   Ú<module>   s,   