o
    <&ßaX¬  ã                   @   sz  d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
mZ ddlmZmZmZmZ e e¡ZeZG dd„ deƒZdd	„ Z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ƒ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$eƒZ%G d$d%„ d%e$eƒZ&eee#e%e&d&œZ'd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|
    +---------------------+       +--------------+        +--------------+
              ^         ^          ^           ^           ^        ^
              |         |          |           |           |        |
              |         |          |           |           |        |
              |        ++----------+-+       +-+-----------++       |
              |        |RestXMLParser|       |RestJSONParser|       |
        +-----+-----+  +-------------+       +--------------+  +----+-----+
        |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``).  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)ÚsixÚETreeÚXMLParseError)ÚEventStreamÚNoInitialResponseError)Úparse_timestampÚmerge_dictsÚis_json_value_headerÚlowercase_dictc                   @   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   ú2/usr/lib/python3/dist-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$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.

    zutf-8Nc                 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   r,   Ò   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ƒrd| 	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: %sÚheaderszResponse body:
%sÚ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
   )r   Úresponser"   ÚparsedÚresponse_metadatar7   r   r   r   ÚparseØ   s&   


zResponseParser.parsec                 C   s   |d uo
|j  dd¡S )NÚ	exceptionF)ÚmetadatarG   )r   r"   r   r   r   rB     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 )Nr9   iô  r8   Ts   <html>)ÚstripÚ
startswith)r   rJ   r8   r   r   r   r@     s   ûz)ResponseParser._is_generic_error_responsec                 C   s4   t  d¡ t|d ƒtj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.r9   r    ©ÚCodeÚMessage©ÚErrorr;   )r>   r?   Ústrr   ÚmovesÚhttp_clientÚ	responsesrG   ©r   rJ   r   r   r   rA     s   


ÿÿüz&ResponseParser._do_generic_error_parsec                 C   ó   t d| jj ƒ‚)Nz%s._do_parse©ÚNotImplementedErrorÚ	__class__r   ©r   rJ   r"   r   r   r   rE   *  ó   zResponseParser._do_parsec                 C   r\   )Nz%s._do_error_parser]   r`   r   r   r   rD   -  ó   
ÿzResponseParser._do_error_parsec                 C   r\   )Nz%s._do_modeled_error_parser]   )r   rJ   r"   rK   r   r   r   rC   1  rb   z&ResponseParser._do_modeled_error_parsec                 C   s   t | d|j | jƒ}|||ƒS )Nz
_handle_%s)ÚgetattrÚ	type_nameÚ_default_handle)r   r"   ÚnodeÚhandlerr   r   r   Ú_parse_shape5  s   ÿ
zResponseParser._parse_shapec                 C   s*   g }|j }|D ]}| |  ||¡¡ q|S r   )ÚmemberÚappendrh   )r   r"   rf   rK   Úmember_shapeÚitemr   r   r   Ú_handle_list:  s
   zResponseParser._handle_listc                 C   ó   |S r   r   ©r   r"   r6   r   r   r   re   C  s   zResponseParser._default_handlec                 C   s&   | j }|d  d¡}t|d |||ƒS )NÚcontextÚoperation_namer8   )r.   rG   r   )r   rJ   r"   ÚparserÚnamer   r   r   Ú_create_event_streamF  s   z#ResponseParser._create_event_streamc                 C   s   t |ƒd S ©Nr   )Úlistr5   r   r   r   Ú_get_first_keyK  r   zResponseParser._get_first_keyc                 C   sR   |j r't|ƒdkrd}t||j ƒ‚|  |¡}||jvr'd}t || ¡ dS dS )Né   zCInvalid service response: %s must have one and only one member set.zqReceived a tagged union response with member unknown to client: %s. Please upgrade SDK for full response support.TF)Úis_tagged_unionÚlenr(   rs   rw   Úmembersr>   Úinfo)r   r"   r6   Ú	error_msgÚtagÚmsgr   r   r   Ú _has_unknown_tagged_union_memberN  s   ÿ

ÿz/ResponseParser._has_unknown_tagged_union_memberc                 C   s   dd|iiS )NÚSDK_UNKNOWN_MEMBERrs   r   )r   r~   r   r   r   Ú#_handle_unknown_tagged_union_membera  r   z2ResponseParser._handle_unknown_tagged_union_member©NN)r   r   r   Ú__doc__ÚDEFAULT_ENCODINGr/   r   r,   rM   rB   r@   rA   rE   rD   rC   rh   rm   re   rt   rw   r€   r‚   r   r   r   r   r)   ¶   s(    
0	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| ƒ ||¡ t d¡| _d S )Nz{.*})Úsuperr†   r   ÚreÚcompileÚ_namespace_rer0   ©r_   r   r   r   f  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 )Nrs   Úkeyr6   Ú	flattenedzUnknown tag: %s)	rŒ   r6   rF   rG   rH   rv   Ú	_node_tagrh   r(   )r   r"   rf   rK   Ú	key_shapeÚvalue_shapeÚkey_location_nameÚvalue_location_nameÚkeyval_nodeÚsingle_pairÚtag_nameÚkey_nameÚval_namer   r   r   Ú_handle_mapk  s"   

z!BaseXMLResponseParser._handle_mapc                 C   s   | j  d|j¡S ©Nr    )rŠ   Úsubr~   )r   rf   r   r   r   rŽ   €  ra   zBaseXMLResponseParser._node_tagc                    s.   |j  d¡rt|tƒs|g}tt| ƒ ||¡S )Nr�   )rF   rG   rH   rv   r‡   r†   rm   )r   r"   rf   r‹   r   r   rm   ƒ  s   z"BaseXMLResponseParser._handle_listc                 C   s  i }|j }|j dd¡r|  |¡}|  |¡}|  ||¡r&|  |¡}|  |¡S |D ]]}|| }d|jv s9|j d¡r:q(|  	||¡}	| |	¡}
|
d urR|  
||
¡||< q(|j d¡r…i }|jd }|j ¡ D ]\}}| j | d¡d d |¡}|||< qd||v r…|| ||< q(|S )	NrN   FÚlocationÚeventheaderÚxmlAttributers   ú:r   )r{   rO   rG   Ú_get_error_rootÚ_build_name_to_xml_noder€   rw   r‚   rF   Ú_member_key_namerh   ÚattribÚitemsrŠ   rš   Úsplit)r   r"   rf   rK   r{   Úxml_dictr~   Úmember_namerk   Úxml_nameÚmember_nodeÚattribsÚlocation_namerŒ   r6   Únew_keyr   r   r   Ú_handle_structure�  s@   





ÿ

ÿ
ÿ
€z'BaseXMLResponseParser._handle_structurec                 C   s2   |   |¡dkr|D ]}|   |¡dkr|  S q	|S )NÚErrorResponserV   ©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 )Nrv   r�   rs   )rd   rF   rG   ri   )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 ru   )rH   rv   r    rŽ   rj   )r   Úparent_noder¥   rl   rŒ   r   r   r   r    Ã  s   


z-BaseXMLResponseParser._build_name_to_xml_nodec              
   C   sV   zt jt  ¡ | jd�}| |¡ | ¡ }W |S  ty* } ztd||f ƒ‚d }~ww )N)ÚtargetÚencodingzTUnable to parse response (%s), invalid XML received. Further retries may succeed:
%s)r   Ú	XMLParserÚTreeBuilderr…   ÚfeedÚcloser   r(   )r   Ú
xml_stringrr   Ú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£   rv   r    Ú_replace_nodesr   )r   rK   rŒ   r6   Ú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_booleanñ  s   z%BaseXMLResponseParser._handle_booleanc                 C   ó   t |ƒS r   )ÚfloatrÁ   r   r   r   Ú_handle_floatø  ó   z#BaseXMLResponseParser._handle_floatc                 C   ó
   |   |¡S r   ©r+   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   rn   r   r   rÁ   r   r   r   Ú_handle_string  s   z$BaseXMLResponseParser._handle_stringc                 C   rÇ   r   ©r-   rÁ   r   r   r   Ú_handle_blob  rÊ   z"BaseXMLResponseParser._handle_blobrƒ   )r   r   r   r   r˜   rŽ   rm   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†   e  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 )Nr8   ÚErrorsÚ	RequestIdr;   )r½   r    r¾   r   Úpop)r   rJ   r"   Úxml_contentsr»   rK   r   r   r   rD     s   


zQueryParser._do_error_parsec                 C   ó   | j ||dd�S )NF©Úinject_metadata©Ú_parse_body_as_xmlr`   r   r   r   rC   #  ra   z#QueryParser._do_modeled_error_parsec                 C   rÙ   )NTrÚ   rÜ   r`   r   r   r   rE   &  ra   zQueryParser._do_parseTc                 C   s^   |d }|   |¡}i }|d ur%|}d|jv r|  |jd |¡}|  ||¡}|r-|  ||¡ |S )Nr8   ÚresultWrapper)r½   rF   Ú_find_result_wrapped_shaperh   Ú_inject_response_metadata)r   rJ   r"   rÛ   rØ   r»   rK   Ústartr   r   r   rÝ   )  s   

þzQueryParser._parse_body_as_xmlc                 C   s   |   |¡}|| S r   )r    )r   Úelement_nameÚxml_root_nodeÚmappingr   r   r   rß   8  s   
z&QueryParser._find_result_wrapped_shapec                 C   sR   |   |¡}| d¡}|d ur'|   |¡}| ¡ D ]	\}}|j||< q||d< d S d S ©Nr;   )r    rG   r£   r   )r   rf   Úinject_intorä   Ú
child_nodeÚsub_mappingrŒ   r6   r   r   r   rà   <  s   


üz%QueryParser._inject_response_metadataN)T)	r   r   r   rD   rC   rE   rÝ   rß   rà   r   r   r   r   rÔ     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    rG   r   )r   rf   ræ   rä   rç   r   r   r   rà   H  s
   

ÿz(EC2QueryParser._inject_response_metadatac                    s0   t t| ƒ ||¡}d|v rd| d¡i|d< |S )NÚ	RequestIDrÖ   r;   )r‡   ré   rD   r×   )r   rJ   r"   Úoriginalr‹   r   r   rD   N  s
   
ÿzEC2QueryParser._do_error_parsec                 C   s@   |D ]}|   |¡dkr|D ]}|   |¡dkr|    S qq|S )NrÕ   rV   r®   )r   r¯   r°   Úerrors_childr   r   r   rŸ   b  s   ÿ€zEC2QueryParser._get_error_root)r   r   r   rà   rD   rŸ   rÓ   r   r   r‹   r   ré   F  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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 )Nrs   )Úis_document_typer{   r€   rw   r‚   rF   rG   rh   )
r   r"   r6   Úfinal_parsedÚmember_shapesr~   r¦   rk   Ú	json_nameÚ	raw_valuer   r   r   r¬   m  s,   î


þ€z BaseJSONParser._handle_structurec           	      C   sF   i }|j }|j}| ¡ D ]\}}|  ||¡}|  ||¡}|||< q|S r   )rŒ   r6   r£   rh   )	r   r"   r6   rK   r�   r�   rŒ   Ú
actual_keyÚactual_valuer   r   r   r˜   †  s   
zBaseJSONParser._handle_mapc                 C   rÇ   r   rÎ   ro   r   r   r   rÏ   �  r   zBaseJSONParser._handle_blobc                 C   rÇ   r   rÈ   ro   r   r   r   rÉ   “  r   z BaseJSONParser._handle_timestampc                 C   s˜   |   |d ¡}dddœi dœ}| d| dd¡¡|d d< | d¡}| d	|o*t|ƒ¡}|d urBd
|v r<| d
d¡d }||d d< |  ||d ¡ |S )Nr8   r    ©rT   rS   rU   ÚmessagerT   rV   r9   Ú__typeú#rx   rS   r7   )Ú_parse_body_as_jsonrG   rW   Úrsplitrà   )r   rJ   r"   r8   ÚerrorÚresponse_codeÚcoder   r   r   rD   –  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   rK   r7   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_contentsr8   Úoriginal_parsedr   r   r   rú   ¶  s   
ýz"BaseJSONParser._parse_body_as_jsonN)
r   r   r   r¬   r˜   rÏ   rÉ   rD   rà   rú   r   r   r   r   rî   k  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:   r7   z:event-type)rF   rG   r{   rE   Ú_parse_non_payload_attrsÚ_parse_payload)r   rJ   r"   rð   Ú
event_typeÚevent_shaper   r   r   rE   Å  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 )Nr7   z:exception-typer8   rV   rT   r÷   r    rR   z:error-codez:error-message)rG   r{   Ú_initial_body_parserh   )r   rJ   r"   Úexception_typeÚexception_shaper  r8   rü   r   r   r   rD   Ò  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Úeventpayloadr8   ÚblobÚstring)rF   rG   rd   r  r…   r  rh   r   )r   rJ   r"   rñ   rð   rs   rk   r8   Úparsed_bodyÚ	raw_parser  Úbody_parsedr   r   r   r	  ç  s$   


öïz$BaseEventStreamParser._parse_payloadc           	      C   sZ   |d }|D ]$}|| }|j  d¡r*||v r*|| }|jdkr&|  |d ¡}|||< qd S )Nr7   rœ   Ú	timestampg     @�@)rF   rG   rd   r+   )	r   rJ   r"   rñ   rð   r7   rs   rk   r6   r   r   r   r  û  s   
€÷z.BaseEventStreamParser._parse_non_payload_attrsc                 C   ó   t dƒ‚©Nr  ©r^   ©r   r  r   r   r   r  	  ó   z)BaseEventStreamParser._initial_body_parseN)r   r   r   rE   rD   r	  r  r  r   r   r   r   r  Ã  s    r  c                   @   ó   e Zd Zdd„ ZdS )ÚEventStreamJSONParserc                 C   ó
   |   |¡S r   ©rú   r  r   r   r   r    r   z)EventStreamJSONParser._initial_body_parseN©r   r   r   r  r   r   r   r   r    ó    r  c                   @   r  )ÚEventStreamXMLParserc                 C   ó   |st  d¡S |  |¡S r™   ©r   ÚElementr½   ©r   rº   r   r   r   r    ó   

z(EventStreamXMLParser._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 )Nr8   r7   )Úevent_stream_nameÚ_handle_event_streamÚ_handle_json_bodyrà   )r   rJ   r"   rK   Ú
event_namer   r   r   rE   $  s   zJSONParser._do_parsec                 C   s   |   |d |¡S )Nr8   )r+  r`   r   r   r   rC   /  ra   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{   rt   Úget_initial_responser   r(   r+  Úpayload)	r   rJ   r"   r,  Úevent_stream_shapeÚevent_streamr  r}   rK   r   r   r   r*  2  s   
þzJSONParser._handle_event_streamc                 C   s   |   |¡}|  ||¡S r   )rú   rh   )r   Úraw_bodyr"   Úparsed_jsonr   r   r   r+  >  s   
zJSONParser._handle_json_bodyN)	r   r   r   r  r/   rE   rC   r*  r+  r   r   r   r   r(    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   rJ   r"   rð   r   r   r   rE   H  s   ÿzBaseRestParser._do_parsec                 C   s6   |d u r|S |j }|  ||||¡ |  ||||¡ d S r   )r{   r  r	  )r   rJ   r"   rð   rñ   r   r   r   r5  O  s   ÿz!BaseRestParser._add_modeled_parsec                 C   s   i }|   |||¡ |S r   )r5  r6  r   r   r   rC   W  s   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 )Nr7   rÿ   rÖ   úx-amz-request-idú
x-amz-id-2r    ÚHostId)rG   )r   rJ   rO   r7   r   r   r   r4  \  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  r8   )rF   rG   rt   rd   rH   Úbytesr  r…   r  rh   r   )
r   rJ   r"   rñ   rð   Úpayload_member_nameÚ
body_shaper8   r  r  r   r   r   r	  i  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 )Nr7   r›   Ú
statusCoder9   Úheaderrs   )rF   rG   rh   Ú_parse_header_map)
r   rJ   r"   rñ   rð   r7   rs   rk   r›   Úheader_namer   r   r   r  �  s,   
ÿ
ÿÿ€òz'BaseRestParser._parse_non_payload_attrsc                 C   sN   i }|j  dd¡ ¡ }|D ]}| ¡  |¡r$|t|ƒd … }|| ||< q|S )Nrs   r    )rF   rG   ÚlowerrQ   rz   )r   r"   r7   rK   Úprefixr@  rs   r   r   r   r?  •  s   €z BaseRestParser._parse_header_mapc                 C   r  r  r  r  r   r   r   r  ¢  r  z"BaseRestParser._initial_body_parsec                 C   s,   |}t |ƒrt |¡ | j¡}t |¡}|S r   )r	   r3   r4   r  r…   r  r  )r   r"   r6   rK   Údecodedr   r   r   rÍ   ©  s
   
zBaseRestParser._handle_stringc                    sD   |j  d¡}|dkrt|tƒsdd„ | d¡D ƒ}tt| ƒ ||¡S )Nr›   r>  c                 S   s   g | ]}|  ¡ ‘qS r   )rP   )Ú.0r¼   r   r   r   Ú
<listcomp>´  s    z/BaseRestParser._handle_list.<locals>.<listcomp>ú,)rF   rG   rH   rv   r¤   r‡   r3  rm   )r   r"   rf   r›   r‹   r   r   rm   °  s   zBaseRestParser._handle_list)r   r   r   rE   r5  rC   r4  r	  r  r?  r  rÍ   rm   rÓ   r   r   r‹   r   r3  F  s    r3  c                       s0   e Zd ZeZdd„ Z‡ fdd„Zdd„ Z‡  ZS )ÚRestJSONParserc                 C   r  r   r  r  r   r   r   r  ¼  r   z"RestJSONParser._initial_body_parsec                    s"   t t| ƒ ||¡}|  ||¡ |S r   )r‡   rG  rD   Ú_inject_error_code)r   rJ   r"   rü   r‹   r   r   rD   ¿  s   zRestJSONParser._do_error_parsec                 C   sx   |   |d ¡}d|d v r"|d d }| d¡d }||d d< d S d|v s*d|v r:| d| dd	¡¡|d d< d S d S )
Nr8   zx-amzn-errortyper7   rž   r   rV   rS   rþ   r    )r  r¤   rG   )r   rü   rJ   r8   rþ   r   r   r   rH  Ä  s   ÿÿz!RestJSONParser._inject_error_code)	r   r   r   r  r/   r  rD   rH  rÓ   r   r   r‹   r   rG  ¸  s
    rG  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   r  ×  r'  z!RestXMLParser._initial_body_parsec                 C   s@   |d rz|   |¡W S  ty   tjddd� Y nw |  |¡S )Nr8   z2Exception caught when parsing error response body:T)Úexc_info)Ú_parse_error_from_bodyr(   r>   r?   Ú_parse_error_from_http_statusr`   r   r   r   rD   Ü  s   
þÿ
zRestXMLParser._do_error_parsec                 C   sH   t |d ƒtjjj |d d¡dœ|d  dd¡|d  dd¡dœdœS )	Nr9   r    rR   r7   r7  r8  )rÖ   r9  rU   )rW   r   rX   rY   rZ   rG   r[   r   r   r   rL  ö  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 )	Nr8   rV   rÖ   r    r9  rU   r;   rö   )r½   r    r¾   r~   r4  r×   r   )r   rJ   rØ   r»   rK   rO   Údefaultr   r   r   rK    s   






z$RestXMLParser._parse_error_from_bodyc                    s   t t| ƒ ||¡}|S r   )r‡   rI  rÍ   rÁ   r‹   r   r   rÍ     s   zRestXMLParser._handle_string)r   r   r   r"  r/   r  rD   rL  rK  r'   rÍ   rÓ   r   r   r‹   r   rI  Ó  s    rI  )Úec2Úqueryr  z	rest-jsonzrest-xml)(r„   rˆ   r3   r  ÚloggingÚbotocore.compatr   r   r   Úbotocore.eventstreamr   r   Úbotocore.utilsr   r   r	   r
   Ú	getLoggerr   r>   r*   Úobjectr   r   r'   Ú	Exceptionr(   r)   r†   rÔ   ré   rî   r  r  r"  r(  r3  rG  rI  r   r   r   r   r   Ú<module>   sD   h
 0 -5%XN'rN
û