
    hT                         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 G d de      Z G d de      Zy)    N)urlparse)http)patch_vary_headers)MiddlewareMixin)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-Agec                       e Zd Zd Zd Zd Zy)CorsPostCsrfMiddlewarec                     t         j                  r;d|j                  v r,|j                  d   }||j                  d<   |j                  d= yyy)zj
        Put the HTTP_REFERER back to its original value and delete the
        temporary storage
        ORIGINAL_HTTP_REFERERHTTP_REFERERN)r   CORS_REPLACE_HTTPS_REFERERMETA)selfrequesthttp_referers      Y/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/corsheaders/middleware.py_https_referer_replace_reversez5CorsPostCsrfMiddleware._https_referer_replace_reverse   sL    
 **/F',,/V"<<(?@L+7GLL(45 0W*    c                 &    | j                  |       y Nr   r   r   s     r   process_requestz&CorsPostCsrfMiddleware.process_request       ++G4r   c                 &    | j                  |       y r   r   r   r   callbackcallback_argscallback_kwargss        r   process_viewz#CorsPostCsrfMiddleware.process_view"   r   r   N)__name__
__module____qualname__r   r   r!    r   r   r
   r
      s    6r   r
   c                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)CorsMiddlewarec                    |j                   j                  d      }|j                         r|rd|j                   vrt        |      }t        j
                  s| j                  ||      sy	 |j                   d   }d|j                   d   z  }|j                   j                         |_         ||j                   d<   ||j                   d<   yyyy# t        $ r Y yw xY w)a  
        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
        HTTP_ORIGINr   Nr   zhttps://%s/	HTTP_HOST)	r   get	is_securer   r   CORS_ALLOW_ALL_ORIGINSorigin_found_in_white_listscopyKeyError)r   r   originurlr   	http_hosts         r   _https_referer_replacez%CorsMiddleware._https_referer_replace(   s     !!-0 'w||; 6"C//88E&||N;)GLL,EE	&||0028D45/8^, <   $  s   +AC 	CCc                     | j                  |      |_        |j                  r[t        j                  r| j	                  |       |j
                  dk(  r*d|j                  v rt        j                         }d|d<   |S yyy)a  
        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
        OPTIONS"HTTP_ACCESS_CONTROL_REQUEST_METHOD0zContent-LengthN)	
is_enabled_cors_enabledr   r   r4   methodr   r   HttpResponse)r   r   responses      r   r   zCorsMiddleware.process_requestG   s}     !% 8  ..++G4 )+8GLLH,,.-0)*	 I , !r   c                 ^    |j                   r!t        j                  r| j                  |       y)z9
        Do the referer replacement here as well
        N)r:   r   r   r4   r   s        r   r!   zCorsMiddleware.process_view]   s&       T%D%D''0r   c                 @   t        |dd      }|| j                  |      }|s|S t        |dg       |j                  j	                  d      }|s|S t        |      }t        j                  r	d|t        <   t        j                  s%| j                  ||      s| j                  |      s|S t        j                  rt        j                  s
d|t        <   n	||t        <   t        t        j                        r&dj                  t        j                        |t         <   |j"                  dk(  rsdj                  t        j$                        |t&        <   dj                  t        j(                        |t*        <   t        j,                  rt        j,                  |t.        <   |S )	z1
        Add the respective CORS headers
        r:   NOriginr)   true*z, r6   )getattrr9   r   r   r+   r   r   CORS_ALLOW_CREDENTIALS ACCESS_CONTROL_ALLOW_CREDENTIALSr-   r.   check_signalACCESS_CONTROL_ALLOW_ORIGIN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ACCESS_CONTROL_MAX_AGE)r   r   r=   enabledr1   r2   s         r   process_responsezCorsMiddleware.process_responsee   sV    '?D9?oog.GO8hZ0!!-0O v&&9?H56 ++44VSA%%g.O&&t/J/J47H014:H01t''(6:ii((7H23 >>Y&59YYt?V?V5WH1259YYt?V?V5WH12**373N3N/0r   c                     |dk(  xr |t         j                  v xs$ | j                  |      xs | j                  |      S )Nnull)r   CORS_ALLOWED_ORIGINS_url_in_whitelistregex_domain_match)r   r1   r2   s      r   r.   z*CorsMiddleware.origin_found_in_white_lists   sE    vE&D,E,E"E /%%c*/&&v.	
r   c                 b    t         j                  D ]  }t        j                  ||      s|c S  y r   )r   CORS_ALLOWED_ORIGIN_REGEXESrematch)r   r1   domain_patterns      r   rX   z!CorsMiddleware.regex_domain_match   s*    ">> 	Nxx/	r   c                     t        t        j                  t        j                  |j
                              xs | j                  |      S r   )boolr[   r\   r   CORS_URLS_REGEX	path_inforF   r   s     r   r9   zCorsMiddleware.is_enabled   s<    HHT))7+<+<=
 (w'	(r   c                 T    t        j                  d |      }t        d |D              S )N)senderr   c              3   &   K   | ]	  \  }}|  y wr   r%   ).0functionreturn_values      r   	<genexpr>z.CorsMiddleware.check_signal.<locals>.<genexpr>   s     O$:Hl<Os   )r   sendany)r   r   signal_responsess      r   rF   zCorsMiddleware.check_signal   s'    055T7SO>NOOOr   c                     t         j                  D cg c]  }t        |       }}t        fd|D              S c c}w )Nc              3      K   | ]8  }|j                   j                   k(  xr |j                  j                  k(   : y wr   )schemenetloc)re   r1   r2   s     r   rh   z3CorsMiddleware._url_in_whitelist.<locals>.<genexpr>   s;      
 MMSZZ'GFMMSZZ,GG
s   >A)r   rV   r   rj   )r   r2   ooriginss    `  r   rW   z CorsMiddleware._url_in_whitelist   s@    (,(A(AB18A;BB 
!
 
 	
 Cs   <N)r"   r#   r$   r4   r   r!   rS   r.   rX   r9   rF   rW   r%   r   r   r'   r'   '   s1    > ,.`

(
P
r   r'   )r[   urllib.parser   djangor   django.utils.cacher   django.utils.deprecationr   corsheaders.confr   corsheaders.signalsr   rG   rK   rE   rM   rO   rQ   r
   r'   r%   r   r   <module>rx      sX    	 !  1 4 ! 5;  ? #E  = = 1 _ (H
_ H
r   