ó
P'—^c           @@  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	 Z d
 Z d Z d Z d Z d Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   i    (   t   absolute_importN(   t   http(   t   patch_vary_headers(   t   MiddlewareMixin(   t   urlparse(   t   conf(   t   check_request_enableds   Access-Control-Allow-Origins   Access-Control-Expose-Headerss    Access-Control-Allow-Credentialss   Access-Control-Allow-Headerss   Access-Control-Allow-Methodss   Access-Control-Max-Aget   CorsPostCsrfMiddlewarec           B@  s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C@  sC   t  j r? d | j k r? | j d } | | j d <| j d =n  d S(   sj   
        Put the HTTP_REFERER back to its original value and delete the
        temporary storage
        t   ORIGINAL_HTTP_REFERERt   HTTP_REFERERN(   R   t   CORS_REPLACE_HTTPS_REFERERt   META(   t   selft   requestt   http_referer(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyt   _https_referer_replace_reverse   s    c         C@  s   |  j  | ƒ d  S(   N(   R   t   None(   R   R   (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyt   process_request!   s    c         C@  s   |  j  | ƒ d  S(   N(   R   R   (   R   R   t   callbackt   callback_argst   callback_kwargs(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyt   process_view%   s    (   t   __name__t
   __module__R   R   R   (    (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR      s   	
	t   CorsMiddlewarec           B@  sY   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(	   c         C@  sÉ   | j  j d ƒ } | j ƒ  rÅ | rÅ d | j  k rÅ t | ƒ } t j r` |  j | | ƒ r` d SyN | j  d } d | j  d } | j  j ƒ  | _  | | j  d <| | j  d <WqÅ t k
 rÁ qÅ Xn  d S(   s  
        When https is enabled, django CSRF checking includes referer checking
        which breaks when using CORS. This function updates the HTTP_REFERER
        header to make sure it matches HTTP_HOST, provided that our cors logic
        succeeds
        t   HTTP_ORIGINR   NR	   s   https://%s/t	   HTTP_HOST(	   R   t   gett	   is_secureR   R   t   CORS_ORIGIN_ALLOW_ALLt   origin_found_in_white_listst   copyt   KeyError(   R   R   t   origint   urlR   t	   http_host(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyt   _https_referer_replace,   s    !c         C@  ss   |  j  | ƒ | _ | j ro t j r4 |  j | ƒ n  | j d k ro d | j k ro t j ƒ  } d | d <| Sn  d S(   s  
        If CORS preflight header, then create an
        empty body response (200 OK) and return it

        Django won't bother calling any other request
        view/exception middleware along with the requested view;
        it will call any response middlewares
        t   OPTIONSt"   HTTP_ACCESS_CONTROL_REQUEST_METHODt   0s   Content-LengthN(	   t
   is_enabledt   _cors_enabledR   R
   R$   t   methodR   R   t   HttpResponse(   R   R   t   response(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR   D   s    			
c         C@  s&   | j  r" t j r" |  j | ƒ n  d S(   s9   
        Do the referer replacement here as well
        N(   R)   R   R
   R$   R   (   R   R   R   R   R   (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR   Z   s    c         C@  sf  t  | d d ƒ } | d k r0 |  j | ƒ } n  | s: | St | d g ƒ | j j d ƒ } | sf | St | ƒ } t j rˆ d | t	 <n  t j
 r¹ |  j | | ƒ r¹ |  j | ƒ r¹ | St j
 rÙ t j rÙ d | t <n
 | | t <t t j ƒ rd j t j ƒ | t <n  | j d k rbd j t j ƒ | t <d j t j ƒ | t <t j rbt j | t <qbn  | S(	   s1   
        Add the respective CORS headers
        R)   t   OriginR   t   truet   *s   , R%   N(   t   getattrR   R(   R   R   R   R   R   t   CORS_ALLOW_CREDENTIALSt    ACCESS_CONTROL_ALLOW_CREDENTIALSR   R   t   check_signalt   ACCESS_CONTROL_ALLOW_ORIGINt   lent   CORS_EXPOSE_HEADERSt   joint   ACCESS_CONTROL_EXPOSE_HEADERSR*   t   CORS_ALLOW_HEADERSt   ACCESS_CONTROL_ALLOW_HEADERSt   CORS_ALLOW_METHODSt   ACCESS_CONTROL_ALLOW_METHODSt   CORS_PREFLIGHT_MAX_AGEt   ACCESS_CONTROL_MAX_AGE(   R   R   R,   t   enabledR!   R"   (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyt   process_responseb   s6    	

	c         C@  s7   | d k r | t  j k p6 |  j | ƒ p6 |  j | ƒ S(   Nt   null(   R   t   CORS_ORIGIN_WHITELISTt   _url_in_whitelistt   regex_domain_match(   R   R!   R"   (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR      s    c         C@  s.   x' t  j D] } t j | | ƒ r
 | Sq
 Wd  S(   N(   R   t   CORS_ORIGIN_REGEX_WHITELISTt   ret   match(   R   R!   t   domain_pattern(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyRD   —   s    c         C@  s+   t  t j t j | j ƒ ƒ p* |  j | ƒ S(   N(   t   boolRF   RG   R   t   CORS_URLS_REGEXt	   path_infoR3   (   R   R   (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR(   œ   s    c         C@  s,   t  j d d  d | ƒ } t d „  | Dƒ ƒ S(   Nt   senderR   c         s@  s   |  ] \ } } | Vq d  S(   N(    (   t   .0t   functiont   return_value(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pys	   <genexpr>¨   s   (   R   t   sendR   t   any(   R   R   t   signal_responses(    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR3   ¢   s    		c         @  s<   g  t  j D] } t | ƒ ^ q
 } t ‡  f d †  | Dƒ ƒ S(   Nc         3@  s3   |  ]) } | j  ˆ  j  k o* | j ˆ  j k Vq d  S(   N(   t   schemet   netloc(   RM   R!   (   R"   (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pys	   <genexpr>¯   s   (   R   RB   R   RQ   (   R   R"   t   ot   origins(    (   R"   s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyRC   ¬   s    "(   R   R   R$   R   R   R@   R   RD   R(   R3   RC   (    (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyR   *   s   				.				
(   t
   __future__R    RF   t   djangoR   t   django.utils.cacheR   t   django.utils.deprecationR   t#   django.utils.six.moves.urllib.parseR   t   corsheaders.confR   t   corsheaders.signalsR   R4   R8   R2   R:   R<   R>   R   R   (    (    (    s8   /tmp/pip-unpacked-wheel-smm0Wk/corsheaders/middleware.pyt   <module>   s   