
    h2                          d dl Z d dlmZ d dlmZ ddlmZmZmZm	Z	m
Z
mZ  e j        e          Z G d d          Zd ZdS )	    N)unquote_plus)request   )
ACL_ORIGINget_cors_optionsget_regexp_patternparse_resourcesset_cors_headers	try_matchc                        e Zd ZdZddZd ZdS )CORSa  
    Initializes Cross Origin Resource sharing for the application. The
    arguments are identical to `cross_origin`, with the addition of a
    `resources` parameter. The resources parameter defines a series of regular
    expressions for resource paths to match and optionally, the associated
    options to be applied to the particular resource. These options are
    identical to the arguments to `cross_origin`.

    The settings for CORS are determined in the following order

    1. Resource level settings (e.g when passed as a dictionary)
    2. Keyword argument settings
    3. App level configuration settings (e.g. CORS_*)
    4. Default settings

    Note: as it is possible for multiple regular expressions to match a
    resource path, the regular expressions are first sorted by length,
    from longest to shortest, in order to attempt to match the most
    specific regular expression. This allows the definition of a
    number of specific resource options, with a wildcard fallback
    for all other resources.

    :param resources:
        The series of regular expression and (optionally) associated CORS
        options to be applied to the given resource path.

        If the argument is a dictionary, it's keys must be regular expressions,
        and the values must be a dictionary of kwargs, identical to the kwargs
        of this function.

        If the argument is a list, it is expected to be a list of regular
        expressions, for which the app-wide configured options are applied.

        If the argument is a string, it is expected to be a regular expression
        for which the app-wide configured options are applied.

        Default : Match all and apply app-level configuration

    :type resources: dict, iterable or string

    :param origins:
        The origin, or list of origins to allow requests from.
        The origin(s) may be regular expressions, case-sensitive strings,
        or else an asterisk.

        ..  note::

            origins must include the schema and the port (if not port 80),
            e.g.,
            `CORS(app, origins=["http://localhost:8000", "https://example.com"])`.

        Default : '*'
    :type origins: list, string or regex

    :param methods:
        The method or list of methods which the allowed origins are allowed to
        access for non-simple requests.

        Default : [GET, HEAD, POST, OPTIONS, PUT, PATCH, DELETE]
    :type methods: list or string

    :param expose_headers:
        The header or list which are safe to expose to the API of a CORS API
        specification.

        Default : None
    :type expose_headers: list or string

    :param allow_headers:
        The header or list of header field names which can be used when this
        resource is accessed by allowed origins. The header(s) may be regular
        expressions, case-sensitive strings, or else an asterisk.

        Default : '*', allow all headers
    :type allow_headers: list, string or regex

    :param supports_credentials:
        Allows users to make authenticated requests. If true, injects the
        `Access-Control-Allow-Credentials` header in responses. This allows
        cookies and credentials to be submitted across domains.

        :note: This option cannot be used in conjunction with a '*' origin

        Default : False
    :type supports_credentials: bool

    :param max_age:
        The maximum time for which this CORS request maybe cached. This value
        is set as the `Access-Control-Max-Age` header.

        Default : None
    :type max_age: timedelta, integer, string or None

    :param send_wildcard: If True, and the origins parameter is `*`, a wildcard
        `Access-Control-Allow-Origin` header is sent, rather than the
        request's `Origin` header.

        Default : False
    :type send_wildcard: bool

    :param vary_header:
        If True, the header Vary: Origin will be returned as per the W3
        implementation guidelines.

        Setting this header when the `Access-Control-Allow-Origin` is
        dynamically generated (e.g. when there is more than one allowed
        origin, and an Origin than '*' is returned) informs CDNs and other
        caches that the CORS headers are dynamic, and cannot be cached.

        If False, the Vary header will never be injected or altered.

        Default : True
    :type vary_header: bool

    :param allow_private_network:
        If True, the response header `Access-Control-Allow-Private-Network`
        will be set with the value 'true' whenever the request header
        `Access-Control-Request-Private-Network` has a value 'true'.

        If False, the response header `Access-Control-Allow-Private-Network`
        will be set with the value 'false' whenever the request header
        `Access-Control-Request-Private-Network` has a value of 'true'.

        If the request header `Access-Control-Request-Private-Network` is
        not present or has a value other than 'true', the response header
        `Access-Control-Allow-Private-Network` will not be set.

        Default : True
    :type allow_private_network: bool
    Nc                 8    || _         | | j        |fi | d S d S N)_optionsinit_app)selfappkwargss      V/var/www/html/prod/cognitive/venv/lib/python3.11/site-packages/flask_cors/extension.py__init__zCORS.__init__   s5    ?DM#((((((( ?    c                    t          | j        |          t                              d                    }fd|D             }d |D             }t                              d|           t          |                                                             dd          rBfd}t          d          r. |j	                  _	         |j
                  _
        d S d S d S )	N	resourcesc                 <    g | ]\  }}|t          |          fS  )r   ).0patternoptsr   optionss      r   
<listcomp>z!CORS.init_app.<locals>.<listcomp>   s0    fff'SWg/WdCCDfffr   c                 4    i | ]\  }}t          |          |S r   )r   )r   r   r   s      r   
<dictcomp>z!CORS.init_app.<locals>.<dictcomp>   s'    ^^^'4-g66^^^r   z#Configuring CORS with resources: %sintercept_exceptionsTc                       fd}|S )Nc            	      L                           | i |                    S r   )make_response)argsr   r   cors_after_requestfs     r   wrapped_functionzICORS.init_app.<locals>._after_request_decorator.<locals>.wrapped_function   s1    --c.?.?4@R6@R@R.S.STTTr   r   )r)   r*   r   r(   s   ` r   _after_request_decoratorz/CORS.init_app.<locals>._after_request_decorator   s6    U U U U U U U ('r   handle_exception)r   r   r	   getLOGdebugmake_after_request_functionafter_requesthasattrr,   handle_user_exception)r   r   r   r   resources_humanr+   r(   r   s    `    @@r   r   zCORS.init_app   s<    #3v>> $GKK$<$<==	
 gffff\efff	 _^T]^^^		7III8CC,--- ;;-t44 
	`( ( ( ( ( ( s.// `'?'?@T'U'U$,D,DSE^,_,_)))
	` 
	`` `r   r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r      sI        A AF) ) ) )
"` "` "` "` "`r   r   c                       fd}|S )Nc                    | j         ;| j                             t                    rt                              d           | S t          t          j                  }D ][\  }}t          ||          rFt                              dt          j        t          |          |           t          | |            n\t                              d           | S )Nz*CORS have been already evaluated, skippingz=Request to '%r' matches CORS resource '%s'. Using options: %szNo CORS rule matches)headersr-   r   r.   r/   r   r   pathr   r   r
   )respnormalized_path	res_regexres_optionsr   s       r   r(   z7make_after_request_function.<locals>.cors_after_request   s    <#(8(8(D(D#IIBCCCK&w|44&/ 	. 	."I{)44 		SL&y11	   !{333 II,---r   r   )r   r(   s   ` r   r0   r0      s$        ( r   )loggingurllib.parser   flaskr   corer   r   r   r	   r
   r   	getLoggerr5   r.   r   r0   r   r   r   <module>rF      s     % % % % % %       p p p p p p p p p p p p p p p pg!!k` k` k` k` k` k` k` k`\    r   