U
    ڲ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-lqlwanta/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rtjsd|t< n||t< tjrd|t< ttjrd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,   