o
    è’OjÕì  ã                   @   sà  d Z ddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZ ddlmZmZ ddlmZmZmZmZmZmZ e e¡ZeZG dd„ dƒZdd	„ Zd
d„ ZG dd„ deƒZG dd„ dƒZ G dd„ de ƒZ!G dd„ de!ƒZ"G dd„ de"ƒZ#G dd„ de ƒZ$G dd„ de ƒZ%G dd„ de ƒZ&G dd„ de&e$ƒZ'G dd„ de&e!ƒZ(G d d!„ d!e&e%ƒZ)G d"d#„ d#e$ƒZ*G d$d%„ d%e ƒZ+G d&d'„ d'e ƒZ,G d(d)„ d)e+e$ƒZ-G d*d+„ d+e,e%ƒZ.G d,d-„ d-e+e!ƒZ/e#e"e*e-e/e.d.œZ0dS )/a»  Response parsers for the various protocol types.

The module contains classes that can take an HTTP response, and given
an output shape, parse the response into a dict according to the
rules in the output shape.

There are many similarities amongst the different protocols with regard
to response parsing, and the code is structured in a way to avoid
code duplication when possible.  The diagram below is a diagram
showing the inheritance hierarchy of the response classes.

::


                                +-------------------+
                                |   ResponseParser  |
                                +-------------------+
                                ^    ^    ^   ^   ^
                                |    |    |   |   |
                                |    |    |   |   +--------------------------------------------+
                                |    |    |   +-----------------------------+                  |
                                |    |    |                                 |                  |
           +--------------------+    |    +----------------+                |                  |
           |                         |                     |                |                  |
+----------+----------+       +------+-------+     +-------+------+  +------+-------+   +------+--------+
|BaseXMLResponseParser|       |BaseRestParser|     |BaseJSONParser|  |BaseCBORParser|   |BaseRpcV2Parser|
+---------------------+       +--------------+     +--------------+  +----------+---+   +-+-------------+
          ^         ^          ^           ^        ^        ^                  ^         ^
          |         |          |           |        |        |                  |         |
          |         |          |           |        |        |                  |         |
          |        ++----------+-+       +-+--------+---+    |              +---+---------+-+
          |        |RestXMLParser|       |RestJSONParser|    |              |RpcV2CBORParser|
    +-----+-----+  +-------------+       +--------------+    |              +---+---------+-+
    |QueryParser|                                            |
    +-----------+                                       +----+-----+
                                                        |JSONParser|
                                                        +----------+

The diagram above shows that there is a base class, ``ResponseParser`` that
contains logic that is similar amongst all the different protocols (``query``,
``json``, ``rest-json``, ``rest-xml``, ``smithy-rpc-v2-cbor``).  Amongst the various services
there is shared logic that can be grouped several ways:

* The ``query`` and ``rest-xml`` both have XML bodies that are parsed in the
  same way.
* The ``json`` and ``rest-json`` protocols both have JSON bodies that are
  parsed in the same way.
* The ``rest-json`` and ``rest-xml`` protocols have additional attributes
  besides body parameters that are parsed the same (headers, query string,
  status code).

This is reflected in the class diagram above.  The ``BaseXMLResponseParser``
and the BaseJSONParser contain logic for parsing the XML/JSON body,
and the BaseRestParser contains logic for parsing out attributes that
come from other parts of the HTTP response.  Classes like the
``RestXMLParser`` inherit from the ``BaseXMLResponseParser`` to get the
XML body parsing logic and the ``BaseRestParser`` to get the HTTP
header/status code/query string parsing.

Additionally, there are event stream parsers that are used by the other parsers
to wrap streaming bodies that represent a stream of events. The
BaseEventStreamParser extends from ResponseParser and defines the logic for
parsing values from the headers and payload of a message from the underlying
binary encoding protocol. Currently, event streams support parsing bodies
encoded as JSON and XML through the following hierarchy.


                                  +--------------+
                                  |ResponseParser|
                                  +--------------+
                                    ^    ^    ^
               +--------------------+    |    +------------------+
               |                         |                       |
    +----------+----------+   +----------+----------+    +-------+------+
    |BaseXMLResponseParser|   |BaseEventStreamParser|    |BaseJSONParser|
    +---------------------+   +---------------------+    +--------------+
                     ^                ^        ^                 ^
                     |                |        |                 |
                     |                |        |                 |
                   +-+----------------+-+    +-+-----------------+-+
                   |EventStreamXMLParser|    |EventStreamJSONParser|
                   +--------------------+    +---------------------+

Return Values
=============

Each call to ``parse()`` returns a dict has this form::

    Standard Response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      <response keys>
    }

    Error response

    {
      "ResponseMetadata": {"RequestId": <requestid>}
      "Error": {
        "Code": <string>,
        "Message": <string>,
        "Type": <string>,
        <additional keys>
      }
    }

é    N)ÚETreeÚXMLParseError)ÚEventStreamÚNoInitialResponseError)ÚCachedPropertyÚensure_booleanÚis_json_value_headerÚlowercase_dictÚmerge_dictsÚparse_timestampc                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚResponseParserFactoryc                 C   s
   i | _ d S ©N)Ú	_defaults©Úself© r   úV/var/www/html/pharmsmart-cdr-gen/venv/lib/python3.10/site-packages/botocore/parsers.pyÚ__init__”   ó   
zResponseParserFactory.__init__c                 K   s   | j  |¡ dS )aO  Set default arguments when a parser instance is created.

        You can specify any kwargs that are allowed by a ResponseParser
        class.  There are currently two arguments:

            * timestamp_parser - A callable that can parse a timestamp string
            * blob_parser - A callable that can parse a blob type

        N)r   Úupdate)r   Úkwargsr   r   r   Úset_parser_defaults—   s   
z)ResponseParserFactory.set_parser_defaultsc                 C   s   t | }|di | j¤ŽS )Nr   )ÚPROTOCOL_PARSERSr   )r   Úprotocol_nameÚ
parser_clsr   r   r   Úcreate_parser£   s   z#ResponseParserFactory.create_parserN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   “   s    r   c                 C   s   t ƒ  | ¡S r   )r   r   )Úprotocolr   r   r   r   ¨   ó   r   c                    s   ‡ fdd„}|S )Nc                    s.   t |dƒr|j}|d u rd}n|}ˆ | ||ƒS )NÚtextÚ )Úhasattrr!   )r   ÚshapeÚnode_or_stringr!   ©Úfuncr   r   Ú_get_text_content²   s   
€z(_text_content.<locals>._get_text_contentr   )r'   r(   r   r&   r   Ú_text_content¬   s   r)   c                   @   s   e Zd ZdS )ÚResponseParserErrorN)r   r   r   r   r   r   r   r*   Á   s    r*   c                   @   s®   e Zd ZdZdZdZdZd)dd„Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ ZdS )*ÚResponseParserao  Base class for response parsing.

    This class represents the interface that all ResponseParsers for the
    various protocols must implement.

    This class will take an HTTP response and a model shape and parse the
    HTTP response into a dictionary.

    There is a single public method exposed: ``parse``.  See the ``parse``
    docstring for more info.

    úutf-8N)ÚheaderÚheadersÚ
statusCodec                 C   sL   |d u rt }|| _|d u r| j}|| _d | _| jd ur$|  ||¡| _d S d S r   )ÚDEFAULT_TIMESTAMP_PARSERÚ_timestamp_parserÚ_default_blob_parserÚ_blob_parserÚ_event_stream_parserÚEVENT_STREAM_PARSER_CLS©r   Útimestamp_parserÚblob_parserr   r   r   r   Û   s   

ÿÿzResponseParser.__init__c                 C   s
   t  |¡S r   )Úbase64Ú	b64decode©r   Úvaluer   r   r   r2   è   s   
z#ResponseParser._default_blob_parserc                 C   sØ   t  d|d ¡ t  d|d ¡ |d dkr5|  |¡r!|  |¡}n|  |¡r.|  ||¡}|S |  ||¡}n|  ||¡}|rE|j 	d¡rE|S t
|tƒrj| 	di ¡}|d |d	< |d }t|ƒ|d
< ||d< |  ||¡ |S )a>  Parse the HTTP response given a shape.

        :param response: The HTTP response dictionary.  This is a dictionary
            that represents the HTTP request.  The dictionary must have the
            following keys, ``body``, ``headers``, and ``status_code``.

        :param shape: The model shape describing the expected output.
        :return: Returns a dictionary representing the parsed response
            described by the model.  In addition to the shape described from
            the model, each response will also have a ``ResponseMetadata``
            which contains metadata about the response, which contains at least
            two keys containing ``RequestId`` and ``HTTPStatusCode``.  Some
            responses may populate additional keys, but ``RequestId`` will
            always be present.

        zResponse headers: %rr.   zResponse body:
%rÚbodyÚstatus_codei-  ÚeventstreamÚResponseMetadataÚHTTPStatusCodeÚHTTPHeaders)ÚLOGÚdebugÚ_is_generic_error_responseÚ_do_generic_error_parseÚ_is_modeled_error_shapeÚ_do_modeled_error_parseÚ_do_error_parseÚ	_do_parseÚserializationÚgetÚ
isinstanceÚdictr	   Ú_add_checksum_response_metadata)r   Úresponser$   ÚparsedÚresponse_metadatar.   r   r   r   Úparseî   s(   


zResponseParser.parsec                 C   s2   |  di ¡  di ¡}|  d¡}|r||d< d S d S )NÚcontextÚchecksumÚresponse_algorithmÚChecksumAlgorithm©rL   )r   rP   rR   Úchecksum_contextÚ	algorithmr   r   r   rO     s
   
ÿz.ResponseParser._add_checksum_response_metadatac                 C   s   |d uo
|j  dd¡S )NÚ	exceptionF)ÚmetadatarL   )r   r$   r   r   r   rG   %  s   z&ResponseParser._is_modeled_error_shapec                 C   sD   |d dkr d|vs|d d u rdS |d   ¡ }| d¡p| S d S )Nr>   iô  r=   Ts   <html>)ÚstripÚ
startswith)r   rP   r=   r   r   r   rE   (  s   ûz)ResponseParser._is_generic_error_responsec                 C   s2   t  d¡ t|d ƒtjj |d d¡dœi dœS )NzlReceived a non protocol specific error response from the service, unable to populate error code and message.r>   r"   ©ÚCodeÚMessage©ÚErrorr@   )rC   rD   ÚstrÚhttpÚclientÚ	responsesrL   ©r   rP   r   r   r   rF   ;  s   ÿ
ÿþùz&ResponseParser._do_generic_error_parsec                 C   ó   t | jj› d�ƒ‚)Nz
._do_parse©ÚNotImplementedErrorÚ	__class__r   ©r   rP   r$   r   r   r   rJ   L  ó   zResponseParser._do_parsec                 C   ri   )Nz._do_error_parserj   rm   r   r   r   rI   O  rn   zResponseParser._do_error_parsec                 C   ri   )Nz._do_modeled_error_parserj   )r   rP   r$   rQ   r   r   r   rH   R  s   ÿz&ResponseParser._do_modeled_error_parsec                 C   s    t | d|j› �| jƒ}|||ƒS )NÚ_handle_)ÚgetattrÚ	type_nameÚ_default_handle)r   r$   ÚnodeÚhandlerr   r   r   Ú_parse_shapeW  s   ÿ
zResponseParser._parse_shapec                 C   s>   g }|j }|D ]}|d u r| d ¡ q| |  ||¡¡ q|S r   )ÚmemberÚappendru   )r   r$   rs   rQ   Úmember_shapeÚitemr   r   r   Ú_handle_list]  s   zResponseParser._handle_listc                 C   ó   |S r   r   ©r   r$   r<   r   r   r   rr   k  s   zResponseParser._default_handlec                 C   s&   | j }|d  d¡}t|d |||ƒS )NrT   Úoperation_namer=   )r4   rL   r   )r   rP   r$   ÚparserÚnamer   r   r   Ú_create_event_streamn  s   z#ResponseParser._create_event_streamc                 C   s   t |ƒd S ©Nr   )Úlistr;   r   r   r   Ú_get_first_keys  r    zResponseParser._get_first_keyc                    s„   ˆ j r@| ¡ }| dd ¡ dd„ | ¡ D ƒ}t|ƒdkr%d}t|ˆ j ƒ‚|  |¡}‡ fdd„ˆ jD ƒ}||vr@t	 
d|¡ d	S d
S )NÚ__typec                 S   ó   i | ]\}}|d ur||“qS r   r   ©Ú.0ÚkÚvr   r   r   Ú
<dictcomp>z  ó
    ÿÿzCResponseParser._has_unknown_tagged_union_member.<locals>.<dictcomp>é   úCInvalid service response: %s must have one and only one member set.c                    s    g | ]}ˆ j | j d |¡‘qS )r   )ÚmembersrK   rL   )r‡   rv   ©r$   r   r   Ú
<listcomp>„  s    ÿÿzCResponseParser._has_unknown_tagged_union_member.<locals>.<listcomp>zqReceived a tagged union response with member unknown to client: %s. Please upgrade SDK for full response support.TF)Úis_tagged_unionÚcopyÚpopÚitemsÚlenr*   r   rƒ   rŽ   rC   Úinfo)r   r$   r<   Úcleaned_valueÚ	error_msgÚtagÚserialized_member_namesr   r�   r   Ú _has_unknown_tagged_union_memberv  s*   ÿÿ

þýz/ResponseParser._has_unknown_tagged_union_memberc                 C   s   dd|iiS )NÚSDK_UNKNOWN_MEMBERr   r   )r   r™   r   r   r   Ú#_handle_unknown_tagged_union_member‘  r    z2ResponseParser._handle_unknown_tagged_union_memberc                 C   sN   |d }|  d¡}t|ƒdkr%|d r%||d d< |d |d d< |d S |S )	zë
        Error response may contain an x-amzn-query-error header to translate
        errors codes from former `query` services into other protocols. We use this
        to do our lookup in the errorfactory for modeled errors.
        úx-amzn-query-errorú;é   r   rc   ÚQueryErrorCoderŒ   ÚType)Úsplitr•   )r   Úcoder.   ÚerrorÚquery_errorÚquery_error_componentsr   r   r   Ú _do_query_compatible_error_parse”  s   
z/ResponseParser._do_query_compatible_error_parse©NN)r   r   r   Ú__doc__ÚDEFAULT_ENCODINGr5   ÚKNOWN_LOCATIONSr   r2   rS   rO   rG   rE   rF   rJ   rI   rH   ru   rz   rr   r€   rƒ   r›   r�   r¨   r   r   r   r   r+   Å   s.    
1r+   c                       s¾   e Zd Zd"‡ fdd„	Zdd„ Zdd„ Z‡ fdd	„Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZed d!„ ƒZeZeZeZ‡  ZS )#ÚBaseXMLResponseParserNc                    s   t ƒ  ||¡ t d¡| _d S )Nz{.*})Úsuperr   ÚreÚcompileÚ_namespace_rer6   ©rl   r   r   r   ¥  s   zBaseXMLResponseParser.__init__c                 C   s®   i }|j }|j}|j d¡pd}|j d¡pd}|j d¡r&t|tƒs&|g}|D ],}|D ]#}	|  |	¡}
|
|kr>|  ||	¡}q,|
|krI|  ||	¡}q,td|
› �ƒ‚|||< q(|S )Nr   Úkeyr<   Ú	flattenedzUnknown tag: )	r³   r<   rK   rL   rM   r‚   Ú	_node_tagru   r*   )r   r$   rs   rQ   Ú	key_shapeÚvalue_shapeÚkey_location_nameÚvalue_location_nameÚkeyval_nodeÚsingle_pairÚtag_nameÚkey_nameÚval_namer   r   r   Ú_handle_map©  s"   

z!BaseXMLResponseParser._handle_mapc                 C   s   | j  d|j¡S ©Nr"   )r±   Úsubr™   )r   rs   r   r   r   rµ   ¾  ó   zBaseXMLResponseParser._node_tagc                    s*   |j  d¡rt|tƒs|g}tƒ  ||¡S )Nr´   )rK   rL   rM   r‚   r®   rz   )r   r$   rs   r²   r   r   rz   Á  s   z"BaseXMLResponseParser._handle_listc                 C   s  i }|j }|j dd¡r|  |¡}|  |¡}|  ||¡r&|  |¡}|  |¡S |D ]c}|| }|j d¡}	|	| j	v s?|j d¡r@q(|  
||¡}
| |
¡}|d urX|  ||¡||< q(|j d¡r‹i }|jd }|j ¡ D ]\}}| j | d¡d d |¡}|||< qj||v r‹|| ||< q(|S )	Nr[   FÚlocationÚeventheaderÚxmlAttributer   ú:r   )rŽ   r\   rL   Ú_get_error_rootÚ_build_name_to_xml_noder›   rƒ   r�   rK   r¬   Ú_member_key_nameru   Úattribr”   r±   rÁ   r£   )r   r$   rs   rQ   rŽ   Úxml_dictr™   Úmember_namerx   rÃ   Úxml_nameÚmember_nodeÚattribsÚlocation_namer³   r<   Únew_keyr   r   r   Ú_handle_structureË  sD   



ÿ
þ

ÿ
ÿ
€z'BaseXMLResponseParser._handle_structurec                 C   s2   |   |¡dkr|D ]}|   |¡dkr|  S q	|S )NÚErrorResponserc   ©rµ   )r   Úoriginal_rootÚchildr   r   r   rÇ   ð  s   ÿz%BaseXMLResponseParser._get_error_rootc                 C   sL   |j dkr|j d¡r|jj d¡}|d ur|S |j d¡}|d ur$|S |S )Nr‚   r´   r   )rq   rK   rL   rv   )r   r$   rÌ   Úlist_member_serialized_nameÚserialized_namer   r   r   rÉ   ÷  s   ÿz&BaseXMLResponseParser._member_key_namec                 C   st   t |tƒr|  |d ¡S i }|D ]'}|  |¡}||v r3t || tƒr*||  |¡ q|| |g||< q|||< q|S r�   )rM   r‚   rÈ   rµ   rw   )r   Úparent_noderË   ry   r³   r   r   r   rÈ     s   


z-BaseXMLResponseParser._build_name_to_xml_nodec              
   C   sZ   zt jt  ¡ | jd�}| |¡ | ¡ }W |S  ty, } z
td|› d|› �ƒ‚d }~ww )N)ÚtargetÚencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   Ú	XMLParserÚTreeBuilderr«   ÚfeedÚcloser   r*   )r   Ú
xml_stringr~   ÚrootÚer   r   r   Ú_parse_xml_string_to_dom  s   
ÿ

ûÿÿ€ÿz.BaseXMLResponseParser._parse_xml_string_to_domc                 C   sB   |  ¡ D ]\}}t|ƒr|  |¡}|  |¡||< q|j||< q|S r   )r”   r‚   rÈ   Ú_replace_nodesr!   )r   rQ   r³   r<   Úsub_dictr   r   r   rä   ,  s   
z$BaseXMLResponseParser._replace_nodesc                 C   s   |dkrdS dS )NÚtrueTFr   ©r   r$   r!   r   r   r   Ú_handle_boolean5  s   z%BaseXMLResponseParser._handle_booleanc                 C   ó   t |ƒS r   ©Úfloatrç   r   r   r   Ú_handle_float<  ó   z#BaseXMLResponseParser._handle_floatc                 C   ó
   |   |¡S r   ©r1   rç   r   r   r   Ú_handle_timestamp@  ó   
z'BaseXMLResponseParser._handle_timestampc                 C   ré   r   ©Úintrç   r   r   r   Ú_handle_integerD  rí   z%BaseXMLResponseParser._handle_integerc                 C   r{   r   r   rç   r   r   r   Ú_handle_stringH  s   z$BaseXMLResponseParser._handle_stringc                 C   rî   r   ©r3   rç   r   r   r   Ú_handle_blobL  rñ   z"BaseXMLResponseParser._handle_blobr©   )r   r   r   r   r¿   rµ   rz   rÒ   rÇ   rÉ   rÈ   rã   rä   r)   rè   rì   rð   rô   rõ   r÷   Ú_handle_characterÚ_handle_doubleÚ_handle_longÚ__classcell__r   r   r²   r   r­   ¤  s4    
%	





r­   c                   @   s>   e Zd Zdd„ Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )ÚQueryParserc                 C   s\   |d }|   |¡}|  |¡}|  |¡ d|v r| | d¡¡ d|v r,d| d¡i|d< |S )Nr=   ÚErrorsÚ	RequestIdr@   )rã   rÈ   rä   r   r“   )r   rP   r$   Úxml_contentsrá   rQ   r   r   r   rI   V  s   


zQueryParser._do_error_parsec                 C   ó   | j ||dd�S )NF©Úinject_metadata©Ú_parse_body_as_xmlrm   r   r   r   rH   f  rÂ   z#QueryParser._do_modeled_error_parsec                 C   r   )NTr  r  rm   r   r   r   rJ   i  rÂ   zQueryParser._do_parseTc                 C   s^   |d }|   |¡}i }|d ur%|}d|jv r|  |jd |¡}|  ||¡}|r-|  ||¡ |S )Nr=   ÚresultWrapper)rã   rK   Ú_find_result_wrapped_shaperu   Ú_inject_response_metadata)r   rP   r$   r  rÿ   rá   rQ   Ústartr   r   r   r  l  s   


ÿzQueryParser._parse_body_as_xmlc                 C   s   |   |¡}|| S r   )rÈ   )r   Úelement_nameÚxml_root_nodeÚmappingr   r   r   r  {  s   
z&QueryParser._find_result_wrapped_shapec                 C   sR   |   |¡}| d¡}|d ur'|   |¡}| ¡ D ]	\}}|j||< q||d< d S d S ©Nr@   )rÈ   rL   r”   r!   )r   rs   Úinject_intor  Ú
child_nodeÚsub_mappingr³   r<   r   r   r   r    s   


üz%QueryParser._inject_response_metadataN)T)	r   r   r   rI   rH   rJ   r  r  r  r   r   r   r   rü   U  s    
rü   c                       s,   e Zd Zdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚEC2QueryParserc                 C   s2   |   |¡}| d¡}|d urd|ji|d< d S d S )NÚ	requestIdrþ   r@   )rÈ   rL   r!   )r   rs   r  r  r  r   r   r   r  Š  s
   

ÿz(EC2QueryParser._inject_response_metadatac                    s,   t ƒ  ||¡}d|v rd| d¡i|d< |S )NÚ	RequestIDrþ   r@   )r®   rI   r“   )r   rP   r$   Úoriginalr²   r   r   rI   �  s
   
ÿzEC2QueryParser._do_error_parsec                 C   s@   |D ]}|   |¡dkr|D ]}|   |¡dkr|    S qq|S )Nrý   rc   rÔ   )r   rÕ   rÖ   Úerrors_childr   r   r   rÇ   ¤  s   ÿ€zEC2QueryParser._get_error_root)r   r   r   r  rI   rÇ   rû   r   r   r²   r   r  ‰  s    r  c                   @   óD   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dS )ÚBaseJSONParserc           
      C   s’   i }|j r	|}|S |j}|d u rd S i }|  ||¡r$|  |¡}|  |¡S |D ] }|| }|j d|¡}| |¡}	|	d urF|  || |	¡||< q&|S )Nr   )Úis_document_typerŽ   r›   rƒ   r�   rK   rL   ru   )
r   r$   r<   Úfinal_parsedÚmember_shapesr™   rÌ   rx   Ú	json_nameÚ	raw_valuer   r   r   rÒ   ®  s*   î


ÿ€z BaseJSONParser._handle_structurec           	      C   sF   i }|j }|j}| ¡ D ]\}}|  ||¡}|  ||¡}|||< q|S r   )r³   r<   r”   ru   )	r   r$   r<   rQ   r¶   r·   r³   Ú
actual_keyÚactual_valuer   r   r   r¿   Ç  s   
zBaseJSONParser._handle_mapc                 C   rî   r   rö   r|   r   r   r   r÷   Ñ  r   zBaseJSONParser._handle_blobc                 C   rî   r   rï   r|   r   r   r   rð   Ô  r   z BaseJSONParser._handle_timestampc                 C   sÎ   |   |d ¡}dddœi dœ}|d }| d| dd¡¡|d d< | d	¡}| d
|o.t|ƒ¡}|d ur]d|v r@| dd¡d }d|v rL| dd¡d }d|v rW|  |||¡}||d d< |  ||d ¡ |S )Nr=   r"   ©ra   r`   rb   r.   Úmessagera   rc   r>   r„   rÆ   rŒ   r   ú#rž   r`   )Ú_parse_body_as_jsonrL   rd   r£   Úrsplitr¨   r  )r   rP   r$   r=   r¥   r.   Úresponse_coder¤   r   r   r   rI   ×  s(   	ÿ
ÿzBaseJSONParser._do_error_parsec                 C   s$   d|v r|d |  di ¡d< d S d S )Núx-amzn-requestidr@   rþ   )Ú
setdefault)r   rQ   r.   r   r   r   r  û  s
   ÿÿz(BaseJSONParser._inject_response_metadatac                 C   s@   |si S |  | j¡}zt |¡}|W S  ty   d|i Y S w )Nr  )Údecoder«   ÚjsonÚloadsÚ
ValueError)r   Úbody_contentsr=   Úoriginal_parsedr   r   r   r!    s   
ýz"BaseJSONParser._parse_body_as_jsonN)
r   r   r   rÒ   r¿   r÷   rð   rI   r  r!  r   r   r   r   r  ­  s    
$r  c                   @   s˜   e Zd ZdZdZedd„ ƒZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#S )$ÚBaseCBORParseré   éÿ   c              	   C   s&   | j | j| j| j| j| j| j| jdœS )N)r   rŒ   r    é   é   é   é   é   )Ú_parse_unsigned_integerÚ_parse_negative_integerÚ_parse_byte_stringÚ_parse_text_stringÚ_parse_arrayÚ
_parse_mapÚ
_parse_tagÚ_parse_simple_and_floatr   r   r   r   Ú major_type_to_parsing_method_map  s   øz/BaseCBORParser.major_type_to_parsing_method_mapc                 C   s   t  t  |¡¡S r   )ÚioÚBufferedReaderÚBytesIO)r   Úbytesr   r   r   Úget_peekable_stream_from_bytes  rÂ   z-BaseCBORParser.get_peekable_stream_from_bytesc                 C   sN   |   |d¡}|d? }|d@ }|| jv r| j| }|||ƒS td|› d|› �ƒ‚)NrŒ   r1  r-  z8Unsupported inital byte found for data item- Major type:z, Additional info: )Ú_read_bytes_as_intr<  r*   )r   ÚstreamÚinitial_byteÚ
major_typeÚadditional_infoÚmethodr   r   r   Úparse_data_item"  s   


ÿþÿzBaseCBORParser.parse_data_itemc                 C   sD   dddddœ}|dk r|S ||v r|| }|   ||¡S td|› �ƒ‚)NrŒ   r    r0  é   )é   é   é   é   rJ  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )rB  r*   )r   rC  rF  Úadditional_info_to_num_bytesÚ	num_bytesr   r   r   r4  7  s   üÿÿz&BaseCBORParser._parse_unsigned_integerc                 C   s   d|   ||¡ S )Néÿÿÿÿ)r4  ©r   rC  rF  r   r   r   r5  L  rÂ   z&BaseCBORParser._parse_negative_integerc                 C   sr   || j kr|  ||¡}|  ||¡S g }	 |  |¡rn|  |d¡}|d@ }|  ||¡}| |  ||¡¡ qd |¡S )NTrŒ   r-  ó    )ÚINDEFINITE_ITEM_ADDITIONAL_INFOr4  Ú_read_from_streamÚ_handle_break_coderB  rw   Újoin)r   rC  rF  ÚlengthÚchunksrD  r   r   r   r6  P  s   

ú
z!BaseCBORParser._parse_byte_stringc                 C   s   |   ||¡ d¡S )Nr,   )r6  r&  rQ  r   r   r   r7  `  rn   z!BaseCBORParser._parse_text_stringc                    sZ   |ˆ j krˆ  ˆ|¡}‡ ‡fdd„t|ƒD ƒS g }ˆ  ˆ¡s+| ˆ  ˆ¡¡ ˆ  ˆ¡r|S )Nc                    s   g | ]}ˆ   ˆ¡‘qS r   ©rH  )r‡   Ú_©r   rC  r   r   r�   g  s    z/BaseCBORParser._parse_array.<locals>.<listcomp>)rS  r4  ÚrangerU  rw   rH  )r   rC  rF  rW  r”   r   r[  r   r8  d  s   


ÿzBaseCBORParser._parse_arrayc                 C   s\   i }|| j kr|  ||¡}t|ƒD ]}|  ||¡ q|S |  |¡s,|  ||¡ |  |¡r!|S r   )rS  r4  r\  Ú_parse_key_value_pairrU  )r   rC  rF  r”   rW  rZ  r   r   r   r9  o  s   


ÿzBaseCBORParser._parse_mapc                 C   s,   |   |¡}|   |¡}|d ur|||< d S d S r   rY  )r   rC  r”   r³   r<   r   r   r   r]  |  s
   

ÿz$BaseCBORParser._parse_key_value_pairc                 C   s6   |   ||¡}|  |¡}|dkr|  |¡S td|› �ƒ‚)NrŒ   z*Found CBOR tag not supported by botocore: )r4  rH  Ú_parse_datetimer*   )r   rC  rF  r™   r<   r   r   r   r:  „  s   

ÿzBaseCBORParser._parse_tagc                 C   s&   t |ttfƒr|  |¡S td|› �ƒ‚)Nz Unable to parse datetime value: )rM   ró   rë   r1   r*   r;   r   r   r   r^  Ž  s
   
ÿzBaseCBORParser._parse_datetimec                 C   sf   ddd d dœ}||v r|| S ddddœ}||v r+|| \}}t  ||  ||¡¡d S td	|› d
�ƒ‚)NFT)é   é   é   é   )z>er    )z>fr0  )z>drI  )rK  rL  rM  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)ÚstructÚunpackrT  r*   )r   rC  rF  Úadditional_info_simple_valuesÚfloat_formatsÚfloat_formatrO  r   r   r   r;  ™  s*   üýÿþ
ÿz&BaseCBORParser._parse_simple_and_floatc                 C   s6   t  | d¡d d… d¡| jkr| dtj¡ dS d S )NrŒ   ÚbigT)ró   Ú
from_bytesÚpeekÚ
BREAK_CODEÚseekÚosÚSEEK_CURr[  r   r   r   rU  »  s    þz!BaseCBORParser._handle_break_codec                 C   s   |   ||¡}t |d¡S )Nrh  )rT  ró   ri  )r   rC  rO  Úbyter   r   r   rB  À  s   z!BaseCBORParser._read_bytes_as_intc                 C   s"   |  |¡}t|ƒ|krtdƒ‚|S )NzgEnd of stream reached; this indicates a malformed CBOR response from the server or an issue in botocore)Úreadr•   r*   )r   rC  rO  r<   r   r   r   rT  Ä  s   
ÿz BaseCBORParser._read_from_streamN)r   r   r   rS  rk  r   r<  rA  rH  r4  r5  r6  r7  r8  r9  r]  r:  r^  r;  rU  rB  rT  r   r   r   r   r,    s(    

"r,  c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚBaseEventStreamParserc                 C   sj   i }|j  d¡r!|d  d¡}|j |¡}|r|  ||¡||< |S |  |||j|¡ |  |||j|¡ |S )Nr?   r.   z:event-type)rK   rL   rŽ   rJ   Ú_parse_non_payload_attrsÚ_parse_payload)r   rP   r$   r  Ú
event_typeÚevent_shaper   r   r   rJ   Ð  s   ÿü
ÿzBaseEventStreamParser._do_parsec              	   C   sˆ   |d   d¡}|j  |¡}|d ur/|  |d ¡}|  ||¡}d||  d|  dd¡¡dœi}|S d|d   d	d¡|d   d
d¡dœi}|S )Nr.   z:exception-typer=   rc   ra   r  r"   r_   z:error-codez:error-message)rL   rŽ   Ú_initial_body_parseru   )r   rP   r$   Úexception_typeÚexception_shaper+  r=   r¥   r   r   r   rI   à  s"   þÿûþÿz%BaseEventStreamParser._do_error_parsec                 C   sª   |j  d¡rS|D ]6}|| }|j  d¡r>|d }|jdkr |}n|jdkr,| | j¡}n|  |¡}	|  ||	¡}|||<  d S q|  |d ¡}
|  ||
¡}| |¡ d S d S )NÚeventÚeventpayloadr=   ÚblobÚstring)rK   rL   rq   r&  r«   rv  ru   r   )r   rP   r$   r  r  r   rx   r=   Úparsed_bodyÚ	raw_parser+  Úbody_parsedr   r   r   rs  õ  s(   


ÿôíz$BaseEventStreamParser._parse_payloadc           	      C   sZ   |d }|D ]$}|| }|j  d¡r*||v r*|| }|jdkr&|  |d ¡}|||< qd S )Nr.   rÄ   Ú	timestampg     @�@)rK   rL   rq   r1   )	r   rP   r$   r  r  r.   r   rx   r<   r   r   r   rr    s   
€÷z.BaseEventStreamParser._parse_non_payload_attrsc                 C   ó   t dƒ‚©Nrv  ©rk   ©r   r*  r   r   r   rv    ó   z)BaseEventStreamParser._initial_body_parseN)r   r   r   rJ   rI   rs  rr  rv  r   r   r   r   rq  Ï  s    rq  c                   @   ó   e Zd Zdd„ ZdS )ÚEventStreamJSONParserc                 C   ó
   |   |¡S r   ©r!  r„  r   r   r   rv  #  r   z)EventStreamJSONParser._initial_body_parseN©r   r   r   rv  r   r   r   r   r‡  "  ó    r‡  c                   @   r†  )ÚEventStreamXMLParserc                 C   ó   |st  d¡S |  |¡S rÀ   ©r   ÚElementrã   ©r   rà   r   r   r   rv  (  ó   

z(EventStreamXMLParser._initial_body_parseNrŠ  r   r   r   r   rŒ  '  r‹  rŒ  c                   @   r†  )ÚEventStreamCBORParserc                 C   s   |dkri S |   |  |¡¡S ©NrR  )rH  rA  r„  r   r   r   rv  /  s
   ÿz)EventStreamCBORParser._initial_body_parseNrŠ  r   r   r   r   r’  .  r‹  r’  c                   @   s2   e Zd ZeZ	 dd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú
JSONParserc                 C   sJ   i }|d ur|j }|r|  |||¡}n|  |d |¡}|  ||d ¡ |S )Nr=   r.   )Úevent_stream_nameÚ_handle_event_streamÚ_handle_json_bodyr  )r   rP   r$   rQ   Ú
event_namer   r   r   rJ   <  s   zJSONParser._do_parsec                 C   s   |   |d |¡S ©Nr=   )r—  rm   r   r   r   rH   G  rÂ   z"JSONParser._do_modeled_error_parsec           	      C   sX   |j | }|  ||¡}z| ¡ }W n ty   d}t|ƒ‚w |  |j|¡}|||< |S ©Nz,First event was not of type initial-response)rŽ   r€   Úget_initial_responser   r*   r—  Úpayload©	r   rP   r$   r˜  Úevent_stream_shapeÚevent_streamry  r˜   rQ   r   r   r   r–  J  s   
þzJSONParser._handle_event_streamc                 C   s   |   |¡}|  ||¡S r   )r!  ru   )r   Úraw_bodyr$   Úparsed_jsonr   r   r   r—  V  s   
zJSONParser._handle_json_bodyN)	r   r   r   r‡  r5   rJ   rH   r–  r—  r   r   r   r   r”  7  s    r”  c                       sd   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Z‡ fdd„Z‡  ZS )ÚBaseRestParserc                 C   s$   i }|   |¡|d< |  |||¡ |S r  )Ú_populate_response_metadataÚ_add_modeled_parse©r   rP   r$   r  r   r   r   rJ   _  s   ÿzBaseRestParser._do_parsec                 C   s6   |d u r|S |j }|  ||||¡ |  ||||¡ d S r   )rŽ   rr  rs  )r   rP   r$   r  r  r   r   r   r¤  g  s   ÿz!BaseRestParser._add_modeled_parsec                 C   ó   i }|   |||¡ |S r   ©r¤  r¥  r   r   r   rH   p  ó   z&BaseRestParser._do_modeled_error_parsec                 C   sL   i }|d }d|v r|d |d< |S d|v r$|d |d< |  dd¡|d< |S )Nr.   r$  rþ   úx-amz-request-idú
x-amz-id-2r"   ÚHostIdrX   ©r   rP   r\   r.   r   r   r   r£  u  s   úz*BaseRestParser._populate_response_metadatac           
      C   s¾   d|j v rK|j d }|| }|j  d¡r |  ||¡}|||< d S |jdv r:|d }t|tƒr4| | j¡}|||< d S |  |d ¡}|  	||¡||< d S |  |d ¡}|  	||¡}	| 
|	¡ d S )Nrœ  r?   )r|  r{  r=   )rK   rL   r€   rq   rM   r@  r&  r«   rv  ru   r   )
r   rP   r$   r  r  Úpayload_member_nameÚ
body_shaper=   r+  r  r   r   r   rs  ‚  s$   



ÿzBaseRestParser._parse_payloadc           
      C   sž   |d }|D ]F}|| }|j  d¡}|d u rq|dkr&|  ||d ¡||< q|dkr3|  ||¡||< q|dkrL|j  d|¡}	|	|v rL|  |||	 ¡||< qd S )Nr.   rÃ   r/   r>   r-   r   )rK   rL   ru   Ú_parse_header_map)
r   rP   r$   r  r  r.   r   rx   rÃ   Úheader_namer   r   r   rr  ›  s,   
ÿ
ÿÿ€ðz'BaseRestParser._parse_non_payload_attrsc                 C   sN   i }|j  dd¡ ¡ }|D ]}| ¡  |¡r$|t|ƒd … }|| ||< q|S )Nr   r"   )rK   rL   Úlowerr^   r•   )r   r$   r.   rQ   Úprefixr°  r   r   r   r   r¯  ³  s   €z BaseRestParser._parse_header_mapc                 C   r�  r‚  rƒ  r„  r   r   r   rv  À  r…  z"BaseRestParser._initial_body_parsec                 C   s,   |}t |ƒrt |¡ | j¡}t |¡}|S r   )r   r9   r:   r&  r«   r'  r(  )r   r$   r<   rQ   Údecodedr   r   r   rõ   Ç  s
   
zBaseRestParser._handle_stringc                    s@   |j  d¡}|dkrt|tƒsdd„ | d¡D ƒ}tƒ  ||¡S )NrÃ   r-   c                 S   s   g | ]}|  ¡ ‘qS r   )r]   )r‡   râ   r   r   r   r�   Ò  s    z/BaseRestParser._handle_list.<locals>.<listcomp>ú,)rK   rL   rM   r‚   r£   r®   rz   )r   r$   rs   rÃ   r²   r   r   rz   Î  s   zBaseRestParser._handle_list)r   r   r   rJ   r¤  rH   r£  rs  rr  r¯  rv  rõ   rz   rû   r   r   r²   r   r¢  ^  s    	r¢  c                   @   r  )ÚBaseRpcV2Parserc                 C   sJ   i }|d ur#|j }|r|  |||¡}n	i }|  |||¡ |  |¡|d< |S r  )r•  r–  rs  r£  )r   rP   r$   rQ   r•  r   r   r   rJ   ×  s   ÿÿzBaseRpcV2Parser._do_parsec                 C   s   |d u r|S |   |||¡ d S r   )rs  r¥  r   r   r   r¤  ç  s   z"BaseRpcV2Parser._add_modeled_parsec                 C   r¦  r   r§  r¥  r   r   r   rH   ì  r¨  z'BaseRpcV2Parser._do_modeled_error_parsec                 C   s$   i }|d }d|v r|d |d< |S )Nr.   r$  rþ   r   r¬  r   r   r   r£  ñ  s
   z+BaseRpcV2Parser._populate_response_metadatac           
      C   sŒ   i }|j }|jr*| ¡ }| dd ¡ dd„ | ¡ D ƒ}t|ƒdkr*d}t||j ƒ‚|D ]}|| }| |¡}	|	d urC|  	||	¡||< q,|S )Nr„   c                 S   r…   r   r   r†   r   r   r   rŠ   þ  r‹   z5BaseRpcV2Parser._handle_structure.<locals>.<dictcomp>rŒ   r�   )
rŽ   r‘   r’   r“   r”   r•   r*   r   rL   ru   )
r   r$   rs   rQ   rŽ   r—   r˜   rÌ   rx   rÎ   r   r   r   rÒ   ø  s*   ÿÿ
ÿ€z!BaseRpcV2Parser._handle_structurec                 C   s(   |   |d ¡}|  ||¡}| |¡ d S r™  )rv  ru   r   )r   rP   r$   r  r+  r  r   r   r   rs    s   zBaseRpcV2Parser._parse_payloadc                 C   r�  r‚  rƒ  r„  r   r   r   rv    r…  z#BaseRpcV2Parser._initial_body_parseN)
r   r   r   rJ   r¤  rH   r£  rÒ   rs  rv  r   r   r   r   rµ  Ö  s    rµ  c                       sP   e Zd ZeZdd„ Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Z	dd„ Z
e	Ze
Z‡  ZS )ÚRestJSONParserc                 C   rˆ  r   r‰  r„  r   r   r   rv     r   z"RestJSONParser._initial_body_parsec                    s   t ƒ  ||¡}|  ||¡ |S r   )r®   rI   Ú_inject_error_code)r   rP   r$   r¥   r²   r   r   rI   #  s   zRestJSONParser._do_error_parsec                 C   s’   |   |d ¡}d }d|d v r|d d }nd|v sd|v r(| d| dd¡¡}|d u r.d S t|tƒrA| dd¡d	  d
d¡d }||d d< d S )Nr=   zx-amzn-errortyper.   r¤   r`   r"   rÆ   rŒ   r   r   rP  rc   )rv  rL   rM   rd   r£   r"  )r   r¥   rP   r=   r¤   r   r   r   r·  (  s   
z!RestJSONParser._inject_error_codec                 C   ré   r   )r   r|   r   r   r   rè   7  ó   zRestJSONParser._handle_booleanc                 C   ré   r   rò   r|   r   r   r   rô   :  r¸  zRestJSONParser._handle_integerc                 C   ré   r   rê   r|   r   r   r   rì   =  r¸  zRestJSONParser._handle_float)r   r   r   r‡  r5   rv  rI   r·  rè   rô   rì   rú   rù   rû   r   r   r²   r   r¶    s    r¶  c                   @   s(   e Zd ZeZdd„ Zdd„ Zdd„ ZdS )ÚRpcV2CBORParserc                 C   s    |dkr|S |   |¡}|  |¡S r“  )rA  rH  )r   r*  Úbody_contents_streamr   r   r   rv  G  s   ÿ
z#RpcV2CBORParser._initial_body_parsec                 C   sÜ   |   |d ¡}| d| dd¡¡ddœi dœ}|d }| d¡}|d u r1| d	¡}|d ur1t|ƒ}|d ur^d
|v rA| d
d¡d }d|v rM| dd¡d }d|v rX|  |||¡}||d d< d|v rl|d | di ¡d< |S )Nr=   r  ra   r"   r  rb   r.   r„   r>   rÆ   rŒ   r   r   rž   rc   r`   r$  r@   rþ   )rv  rL   rd   r£   r"  r¨   r%  )r   rP   r$   r=   r¥   r.   r¤   r#  r   r   r   rI   O  s6   þû

ÿÿzRpcV2CBORParser._do_error_parsec           	      C   sV   |j | }|  ||¡}z| ¡ }W n ty   d}t|ƒ‚w |  |j¡}|||< |S rš  )rŽ   r€   r›  r   r*   rv  rœ  r�  r   r   r   r–  o  s   
þz$RpcV2CBORParser._handle_event_streamN)r   r   r   r’  r5   rv  rI   r–  r   r   r   r   r¹  D  s
     r¹  c                       sD   e Zd ZeZdd„ Zdd„ Zdd„ Zdd„ Ze	‡ fd	d
„ƒZ
‡  ZS )ÚRestXMLParserc                 C   r�  rÀ   rŽ  r�  r   r   r   rv    r‘  z!RestXMLParser._initial_body_parsec                 C   s@   |d rz|   |¡W S  ty   tjddd� Y nw |  |¡S )Nr=   z2Exception caught when parsing error response body:T)Úexc_info)Ú_parse_error_from_bodyr*   rC   rD   Ú_parse_error_from_http_statusrm   r   r   r   rI   „  s   
þÿ
zRestXMLParser._do_error_parsec                 C   sF   t |d ƒtjj |d d¡dœ|d  dd¡|d  dd¡dœdœS )	Nr>   r"   r_   r.   r©  rª  )rþ   r«  rb   )rd   re   rf   rg   rL   rh   r   r   r   r¾  Ÿ  s   
ÿþþùz+RestXMLParser._parse_error_from_http_statusc                 C   s’   |d }|   |¡}|  |¡}|  |¡ |jdkr.|  |¡}| dd¡ | dd¡ ||dœS d|v r;d| d¡i|d< ddddœi}t||ƒ |S )	Nr=   rc   rþ   r"   r«  rb   r@   r  )rã   rÈ   rä   r™   r£  r“   r
   )r   rP   rÿ   rá   rQ   r\   Údefaultr   r   r   r½  ­  s   






z$RestXMLParser._parse_error_from_bodyc                    s   t ƒ  ||¡}|S r   )r®   rõ   rç   r²   r   r   rõ   Ä  s   zRestXMLParser._handle_string)r   r   r   rŒ  r5   rv  rI   r¾  r½  r)   rõ   rû   r   r   r²   r   r»  |  s    r»  )Úec2Úqueryr'  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1rª   r9   Úhttp.clientre   r=  r'  Úloggingrm  r¯   rc  Úbotocore.compatr   r   Úbotocore.eventstreamr   r   Úbotocore.utilsr   r   r   r	   r
   r   Ú	getLoggerr   rC   r0   r   r   r)   Ú	Exceptionr*   r+   r­   rü   r  r  r,  rq  r‡  rŒ  r’  r”  r¢  rµ  r¶  r¹  r»  r   r   r   r   r   Ú<module>   sX   m 
	 ` 24$a BS	'xG'8O
ú