U
    ÌS‚gË  ã                   @  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   ú:/tmp/pip-unpacked-wheel-rw69w2n1/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   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!   Zenabledr,   Úurlr   r   r   r   T   sP    


ÿ
þý

ÿÿþz#CorsMiddleware.add_response_headersr;   r   Úbool)r,   r?   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,   r?   r   r   r   r2   Ž   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   ZCORS_ALLOWED_ORIGIN_REGEXES)r   r,   r   r+   r   rD   •   s    þz!CorsMiddleware.regex_domain_matchc                 C  s   t t tj|j¡ƒp|  |¡S r   )r@   rE   rF   r   ZCORS_URLS_REGEXZ	path_infor3   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   )rG   ÚfunctionZreturn_valuer   r   r   rH   ¢   s     z.CorsMiddleware.check_signal.<locals>.<genexpr>)r   ÚsendrI   )r   r   Zsignal_responsesr   r   r   r3       s    zCorsMiddleware.check_signal)r?   r   c                   s&   dd„ t jD ƒ}t‡ fdd„|D ƒƒS )Nc                 S  s   g | ]}t |ƒ‘qS r   r   )rG   Ú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)rG   r,   ©r?   r   r   rH   ¦   s   ÿz3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>)r   rB   rI   )r   r?   Zoriginsr   rP   r   rC   ¤   s    þz CorsMiddleware._url_in_whitelistN)Ú__name__Ú
__module__Ú__qualname__Zsync_capableZasync_capabler   r#   r   r   r   r2   rD   r'   r3   rC   r   r   r   r   r      s   	:r   ) Ú
__future__r   rE   Ú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   r4   r8   r5   r9   r:   r<   r=   r>   r   r   r   r   r   Ú<module>   s,   