o
    rN)j%                     @  s   d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	m
Z
 d dlmZmZmZmZ d dlmZmZmZmZmZmZ dddZd ddZd!ddZd"ddZG dd dZdS )#    )annotations)islice)Any	Generator)unquoteunquote_plus	urlencode)get_server_and_porthandle_base64_response_bodyhandle_exclude_headersmaybe_encode_body)LambdaConfigLambdaContextLambdaEventQueryParamsResponseScopeinput_stringstrreturnGenerator[str, None, None]c                 c  s    | sdV  dS | dd }|  | kr(t| dd D ]}|| V  qdS t| dd D ]}|  | V  | | V  q0dS )z
    Permute all casings of a given string.
    A pretty algoritm, via @Amber
    http://stackoverflow.com/questions/6792803/finding-all-possible-case-permutations-in-python
     N   )lowerupperall_casings)r   first
sub_casing r   t/var/www/html/finance.cargoinsureonline.com/_shared/backend-venv/lib/python3.10/site-packages/mangum/handlers/alb.pyr      s   
r   multi_value_headersdict[str, list[str]]dict[str, str]c                 C  sX   i }|   D ]#\}}t|dkr)ttt|t|}t||D ]\}}|||< q q|S )zCCreate str/str key/value headers, with duplicate keys case mutated.r   )itemslenlistr   r   zip)r    headerskeyvaluescasingsvalue	cased_keyr   r   r   case_mutated_headers*   s   
r-   paramsr   bytesc                 C  s&   dd |   D } t| dd }|S )a?  Encode the query string parameters for the ALB event. The parameters must be
    decoded and then encoded again to prevent double encoding.

    According to the docs:

        "If the query parameters are URL-encoded, the load balancer does not decode
        "them. You must decode them in your Lambda function."
    c                 S  s:   i | ]\}}t |t|trt |ntd d |D qS )c                 s  s    | ]}t |V  qd S N)r   ).0elementr   r   r   	<genexpr>@   s    z9encode_query_string_for_alb.<locals>.<dictcomp>.<genexpr>)r   
isinstancer   tuple)r1   r(   r+   r   r   r   
<dictcomp>>   s
    "z/encode_query_string_for_alb.<locals>.<dictcomp>T)doseq)r#   r   encode)r.   query_stringr   r   r   encode_query_string_for_alb5   s
   	r:   eventr   list[tuple[bytes, bytes]]c                 C  s~   g }d| v r%| d   D ]\}}|D ]}||  | f qq|S | d   D ]\}}||  | f q+|S )NmultiValueHeadersr'   )r#   appendr   r8   )r;   r'   kvinner_vr   r   r   transform_headersI   s   rB   c                   @  sJ   e Zd Zedd	d
ZdddZedddZedddZdddZ	dS )ALBr;   r   contextr   configr   r   boolc                 C  s   d|v o	d|d v S )NrequestContextelbr   )clsr;   rD   rE   r   r   r   inferW   s   z	ALB.inferNonec                 C  s   || _ || _|| _d S r0   )r;   rD   rE   )selfr;   rD   rE   r   r   r   __init__[   s   
zALB.__init__r/   c                 C  s    t | jdd| jdddS )Nbody    isBase64EncodedF)	is_base64)r   r;   get)rL   r   r   r   rN   `   s   zALB.bodyr   c                 C  s   t | j}dd |D }dd |D }|dd}| jd r%t| jd nd}| jd	 }| jd
| jdi }|s=d}nt|}t|}	|df}
d|d||d d|dd||	|
ddd| j| jd}|S )Nc                 S  s   g | ]}t |qS r   )r%   )r1   xr   r   r   
<listcomp>j   s    zALB.scope.<locals>.<listcomp>c                 S  s   i | ]\}}|  |  qS r   )decode)r1   r?   r@   r   r   r   r6   l   s    zALB.scope.<locals>.<dictcomp>zx-forwarded-forr   path/
httpMethodmultiValueQueryStringParametersqueryStringParametersrO   r   httpz1.1zx-forwarded-protohttpsz3.0z2.0)versionspec_version)typemethodhttp_versionr'   rV   raw_path	root_pathschemer9   serverclientasgi	aws.eventzaws.context)rB   r;   rR   r   r:   r	   rD   )rL   r'   list_headers
uq_headers	source_iprV   http_methodr.   r9   re   rf   scoper   r   r   rm   g   s>   


z	ALB.scoperesponser   dict[str, Any]c                 C  s   i }|d D ]\}}|   }||vrg ||< || |   qt|}t|d || jd \}}|d ||d}	d| jd v }
|
rNt|| j|	d< |	S t|| j|	d< |	S )Nr'   rN   text_mime_typesstatus)
statusCoderN   rP   r=   rh   )rU   r   r>   r-   r
   rE   rm   r   )rL   rn   r    r(   r+   	lower_keyfinalized_headersfinalized_bodyis_base64_encodedoutmulti_value_headers_enabledr   r   r   __call__   s(   zALB.__call__N)r;   r   rD   r   rE   r   r   rF   )r;   r   rD   r   rE   r   r   rK   )r   r/   )r   r   )rn   r   r   ro   )
__name__
__module____qualname__classmethodrJ   rM   propertyrN   rm   ry   r   r   r   r   rC   V   s    
(rC   N)r   r   r   r   )r    r!   r   r"   )r.   r   r   r/   )r;   r   r   r<   )
__future__r   	itertoolsr   typingr   r   urllib.parser   r   r   mangum.handlers.utilsr	   r
   r   r   mangum.typesr   r   r   r   r   r   r   r-   r:   rB   rC   r   r   r   r   <module>   s     




