o
    ND©iì  ã                   @   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   úI/var/www/Datamplify/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 ]}| |  ||¡¡ 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   f  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_streami  s   z#ResponseParser._create_event_streamc                 C   s   t |ƒd S ©Nr   )Úlistr;   r   r   r   Ú_get_first_keyn  r    zResponseParser._get_first_keyc                    sŠ   ˆ j rC| ¡ }| dd ¡ dd„ | ¡ D ƒ}t|ƒdkr%d}t|ˆ j ƒ‚|  |¡}‡ fdd„ˆ jD ƒ}||vrCd}t	 
|| ¡ d	S d
S )NÚ__typec                 S   ó   i | ]\}}|d ur||“qS r   r   ©Ú.0ÚkÚvr   r   r   Ú
<dictcomp>u  ó    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_namesÚmsgr   r   r   Ú _has_unknown_tagged_union_memberq  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Ç  sB   





ÿ

ÿ
ÿ
€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_boolean1  s   z%BaseXMLResponseParser._handle_booleanc                 C   ó   t |ƒS r   ©Úfloatrè   r   r   r   Ú_handle_float8  ó   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_integer@  rî   z%BaseXMLResponseParser._handle_integerc                 C   r{   r   r   rè   r   r   r   Ú_handle_stringD  s   z$BaseXMLResponseParser._handle_stringc                 C   rï   r   ©r3   rè   r   r   r   Ú_handle_blobH  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   R  s   


zQueryParser._do_error_parsec                 C   ó   | j ||ddS )NF©Úinject_metadata©Ú_parse_body_as_xmlrm   r   r   r   rH   b  rÃ   z#QueryParser._do_modeled_error_parsec                 C   r  )NTr  r  rm   r   r   r   rJ   e  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  h  s   


ÿzQueryParser._parse_body_as_xmlc                 C   s   |   |¡}|| S r   )rÉ   )r   Úelement_nameÚxml_root_nodeÚmappingr   r   r   r  w  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ý   Q  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Œ   r2  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¡   r1  é   )é   é   é   é   rK  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )rC  r*   )r   rD  rG  Úadditional_info_to_num_bytesÚ	num_bytesr   r   r   r5  3  s   üÿÿz&BaseCBORParser._parse_unsigned_integerc                 C   s   d|   ||¡ S )Néÿÿÿÿ)r5  ©r   rD  rG  r   r   r   r6  H  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_INFOr5  Ú_read_from_streamÚ_handle_break_coderC  rw   Újoin)r   rD  rG  ÚlengthÚchunksrE  r   r   r   r7  L  s   

ú
z!BaseCBORParser._parse_byte_stringc                 C   s   |   ||¡ d¡S )Nr,   )r7  r'  rR  r   r   r   r8  \  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   ©rI  )r‡   Ú_©r   rD  r   r   r   c  s    z/BaseCBORParser._parse_array.<locals>.<listcomp>)rT  r5  ÚrangerV  rw   rI  )r   rD  rG  rX  r”   r   r\  r   r9  `  s   


ÿzBaseCBORParser._parse_arrayc                 C   s\   i }|| j kr|  ||¡}t|ƒD ]}|  ||¡ q|S |  |¡s,|  ||¡ |  |¡r!|S r   )rT  r5  r]  Ú_parse_key_value_pairrV  )r   rD  rG  r”   rX  r[  r   r   r   r:  k  s   


ÿzBaseCBORParser._parse_mapc                 C   s,   |   |¡}|   |¡}|d ur|||< d S d S r   rZ  )r   rD  r”   r´   r<   r   r   r   r^  x  s
   

ÿz$BaseCBORParser._parse_key_value_pairc                 C   s6   |   ||¡}|  |¡}|dkr|  |¡S td|› ƒ‚)NrŒ   z*Found CBOR tag not supported by botocore: )r5  rI  Ú_parse_datetimer*   )r   rD  rG  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>fr1  )z>drJ  )rL  rM  rN  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)ÚstructÚunpackrU  r*   )r   rD  rG  Úadditional_info_simple_valuesÚfloat_formatsÚfloat_formatrP  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   rV  ·  s    þz!BaseCBORParser._handle_break_codec                 C   s   |   ||¡}t |d¡S )Nri  )rU  rô   rj  )r   rD  rP  Úbyter   r   r   rC  ¼  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   rD  rP  r<   r   r   r   rU  À  s   
ÿz BaseCBORParser._read_from_streamN)r   r   r   rT  rl  r   r=  rB  rI  r5  r6  r7  r8  r9  r:  r^  r;  r_  r<  rV  rC  rU  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¬   rw  ru   r   )r   rP   r$   r  r  r   rx   r=   Úparsed_bodyÚ	raw_parser,  Úbody_parsedr   r   r   rt  ñ  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   rs    s   
€÷z.BaseEventStreamParser._parse_non_payload_attrsc                 C   ó   t dƒ‚©Nrw  ©rk   ©r   r+  r   r   r   rw    ó   z)BaseEventStreamParser._initial_body_parseN)r   r   r   rJ   rI   rt  rs  rw  r   r   r   r   rr  Ë  s    rr  c                   @   ó   e Zd Zdd„ ZdS )ÚEventStreamJSONParserc                 C   ó
   |   |¡S r   ©r"  r…  r   r   r   rw    r   z)EventStreamJSONParser._initial_body_parseN©r   r   r   rw  r   r   r   r   rˆ    ó    rˆ  c                   @   r‡  )ÚEventStreamXMLParserc                 C   ó   |st  d¡S |  |¡S rÁ   ©r   ÚElementrä   ©r   rá   r   r   r   rw  $  ó   

z(EventStreamXMLParser._initial_body_parseNr‹  r   r   r   r   r  #  rŒ  r  c                   @   r‡  )ÚEventStreamCBORParserc                 C   s   |dkri S |   |  |¡¡S ©NrS  )rI  rB  r…  r   r   r   rw  +  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   8  s   zJSONParser._do_parsec                 C   s   |   |d |¡S ©Nr=   )r˜  rm   r   r   r   rH   C  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_streamrz  r˜   rQ   r   r   r   r—  F  s   
þzJSONParser._handle_event_streamc                 C   s   |   |¡}|  ||¡S r   )r"  ru   )r   Úraw_bodyr$   Úparsed_jsonr   r   r   r˜  R  s   
zJSONParser._handle_json_bodyN)	r   r   r   rˆ  r5   rJ   rH   r—  r˜  r   r   r   r   r•  3  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Ž   rs  rt  )r   rP   r$   r  r  r   r   r   r¥  c  s   ÿz!BaseRestParser._add_modeled_parsec                 C   ó   i }|   |||¡ |S r   ©r¥  r¦  r   r   r   rH   l  ó   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¤  q  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   rA  r'  r¬   rw  ru   r   )
r   rP   r$   r  r  Úpayload_member_nameÚ
body_shaper=   r,  r€  r   r   r   rt  ~  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   rs  —  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   rw  ¼  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¤  rt  rs  r°  rw  rö   rz   rü   r   r   r³   r   r£  Z  s    	r£  c                   @   r  )ÚBaseRpcV2Parserc                 C   sJ   i }|d ur#|j }|r|  |||¡}n	i }|  |||¡ |  |¡|d< |S r  )r–  r—  rt  r¤  )r   rP   r$   rQ   r–  r   r   r   rJ   Ó  s   ÿÿzBaseRpcV2Parser._do_parsec                 C   s   |d u r|S |   |||¡ d S r   )rt  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š  )rw  ru   r   )r   rP   r$   r  r,  r€  r   r   r   rt    s   zBaseRpcV2Parser._parse_payloadc                 C   r‚  rƒ  r„  r…  r   r   r   rw    r†  z#BaseRpcV2Parser._initial_body_parseN)
r   r   r   rJ   r¥  rH   r¤  rÓ   rt  rw  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   rw    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!  rQ  rc   )rw  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é   3  ó   zRestJSONParser._handle_booleanc                 C   rê   r   ró   r|   r   r   r   rõ   6  r¹  zRestJSONParser._handle_integerc                 C   rê   r   rë   r|   r   r   r   rí   9  r¹  zRestJSONParser._handle_float)r   r   r   rˆ  r5   rw  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”  )rB  rI  )r   r+  Úbody_contents_streamr   r   r   rw  C  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ÿ   )rw  rL   rd   r¤   r#  r©   r&  )r   rP   r$   r=   r¦   r.   r¥   r$  r   r   r   rI   K  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*   rw  r  rž  r   r   r   r—  k  s   
þz$RpcV2CBORParser._handle_event_streamN)r   r   r   r“  r5   rw  rI   r—  r   r   r   r   rº  @  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   rw  {  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   rw  rI   r¿  r¾  r)   rö   rü   r   r   r³   r   r¼  x  s    r¼  )Úec2Úqueryr(  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r«   r9   Úhttp.clientre   r>  r(  Úloggingrn  r°   rd  Ú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-  rr  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
ú