
     h                     b   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j.                  e      ZeZ G d d      Zd Zd	 Z G d
 de      Z G d d      Z  G d de       Z! G d de!      Z" G d de"      Z# G d de       Z$ G d de       Z% G d de       Z& G d de&e$      Z' G d de&e!      Z( G d de&e%      Z) G d  d!e$      Z* G d" d#e       Z+ G d$ d%e       Z, G d& d'e+e$      Z- G d( d)e,e%      Z. G d* d+e+e!      Z/e#e"e*e-e/e.d,Z0y)-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                       e Zd Zd Zd Zd Zy)ResponseParserFactoryc                     i | _         y N)	_defaultsselfs    l/home/developers/rajanand/mypropertyqr-fmb-refixing-v2/venv/lib/python3.12/site-packages/botocore/parsers.py__init__zResponseParserFactory.__init__   s	        c                 :    | j                   j                  |       y)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   kwargss     r   set_parser_defaultsz)ResponseParserFactory.set_parser_defaults   s     	f%r   c                 8    t         |   } |di | j                  S )N )PROTOCOL_PARSERSr   )r   protocol_name
parser_clss      r   create_parserz#ResponseParserFactory.create_parser   s    %m4
+DNN++r   N)__name__
__module____qualname__r   r   r    r   r   r   r   r      s    
&,r   r   c                 4    t               j                  |       S r   )r   r    )protocols    r   r    r       s     "00::r   c                       fd}|S )Nc                 V    t        |d      r|j                  }|d}n|} | ||      S )Ntext )hasattrr(   )r   shapenode_or_stringr(   funcs       r   _get_text_contentz(_text_content.<locals>._get_text_content   s8    >6*!&&D| !DD%&&r   r   )r-   r.   s   ` r   _text_contentr/      s    
' r   c                       e Zd Zy)ResponseParserErrorN)r!   r"   r#   r   r   r   r1   r1      s    r   r1   c                       e Zd ZdZdZdZdZddZd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zy)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                     |t         }|| _        || j                  }|| _        d | _        | j
                  | j                  ||      | _        y y r   )DEFAULT_TIMESTAMP_PARSER_timestamp_parser_default_blob_parser_blob_parser_event_stream_parserEVENT_STREAM_PARSER_CLS)r   timestamp_parserblob_parsers      r   r   zResponseParser.__init__   s`    #7!133K'$(!''3(,(D(D +)D% 4r   c                 ,    t        j                  |      S r   )base64	b64decoder   values     r   r;   z#ResponseParser._default_blob_parser   s     &&r   c                 :   t         j                  d|d          t         j                  d|d          |d   dk\  r[| j                  |      r| j                  |      }nJ| j	                  |      r| j                  ||      }|S | j                  ||      }n| j                  ||      }|r|j                  j                  d      r|S t        |t              rD|j                  di       }|d   |d	<   |d   }t        |      |d
<   ||d<   | j                  ||       |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: %rr6   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_metadatar6   s         r   parsezResponseParser.parse   s'   " 			((9*=>		&(89M"c)..x855h?--e455hF--h>^^He4F U((,,];M fd# &

+=r B2:=2I./ y)G/=g/Fm,):F%&00;LMr   c                 z    |j                  di       j                  di       }|j                  d      }|r||d<   y y )Ncontextchecksumresponse_algorithmChecksumAlgorithmrV   )r   rZ   r\   checksum_context	algorithms        r   rY   z.ResponseParser._add_checksum_response_metadata  sE    #<<	26:::rJ$(()=>	5>12 r   c                 F    |d uxr |j                   j                  dd      S )N	exceptionF)metadatarV   )r   r+   s     r   rQ   z&ResponseParser._is_modeled_error_shape%  s#    D KU^^%7%7U%KKr   c                 z    |d   dk\  r3d|vs|d   y|d   j                         }|j                  d      xs | S y )NrH   i  rG   Ts   <html>)strip
startswith)r   rZ   rG   s      r   rO   z)ResponseParser._is_generic_error_response(  sT     M"c)X%&)9)AF#))+D??9-9T9 *r   c                     t         j                  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.rH   r)   CodeMessageErrorrJ   )rM   rN   strhttpclient	responsesrV   r   rZ   s     r   rP   z&ResponseParser._do_generic_error_parse;  s[     			B	
 H]34;;0044]+R !#
 	
r   c                 F    t        | j                  j                   d      )Nz
._do_parseNotImplementedError	__class__r!   r   rZ   r+   s      r   rT   zResponseParser._do_parseL  s    !T^^%<%<$=Z"HIIr   c                 F    t        | j                  j                   d      )Nz._do_error_parserx   r{   s      r   rS   zResponseParser._do_error_parseO  s     !T^^%<%<$==M"NOOr   c                 F    t        | j                  j                   d      )Nz._do_modeled_error_parserx   )r   rZ   r+   r[   s       r   rR   z&ResponseParser._do_modeled_error_parseR  s%    !~~&&''?@
 	
r   c                 \    t        | d|j                   | j                        } |||      S )N_handle_)getattr	type_name_default_handle)r   r+   nodehandlers       r   _parse_shapezResponseParser._parse_shapeW  s4    HU__-.0D0D
 ud##r   c                 r    g }|j                   }|D ]#  }|j                  | j                  ||             % |S r   )memberappendr   )r   r+   r   r[   member_shapeitems         r   _handle_listzResponseParser._handle_list]  sA     || 	ADMM$++L$?@	Ar   c                     |S r   r   r   r+   rE   s      r   r   zResponseParser._default_handlef  s    r   c                 d    | j                   }|d   j                  d      }t        |d   |||      S )Nr_   operation_namerG   )r=   rV   r   )r   rZ   r+   parsernames        r   _create_event_streamz#ResponseParser._create_event_streami  s9    **	"&&'788F+UFDAAr   c                     t        |      d   S Nr   )listrD   s     r   _get_first_keyzResponseParser._get_first_keyn  s    E{1~r   c                    |j                   r|j                         }|j                  dd        |j                         D ci c]  \  }}|	|| }}}t	        |      dk7  rd}t        ||j                  z        | j                  |      }|j                  D cg c]+  }|j                  |   j                  j                  d|      - }	}||	vrt        j                  d|       yyc c}}w c c}w )N__type   CInvalid service response: %s must have one and only one member set.r   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lenr1   r   r   membersrU   rV   rM   info)
r   r+   rE   cleaned_valuekv	error_msgtagr   serialized_member_namess
             r    _has_unknown_tagged_union_memberz/ResponseParser._has_unknown_tagged_union_memberq  s     !JJLMh-!.!4!4!6A!-1M  =!Q&&  *)ejj*@AA%%m4C $mm' f%3377G'# ' 11D
 +'s   
C*C*0C0c                     dd|iiS )NSDK_UNKNOWN_MEMBERr   r   )r   r   s     r   #_handle_unknown_tagged_union_memberz2ResponseParser._handle_unknown_tagged_union_member  s    $vsm44r   c                     |d   }|j                  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   rq   QueryErrorCoder   Type)splitr   )r   coder6   errorquery_errorquery_error_componentss         r    _do_query_compatible_error_parsez/ResponseParser._do_query_compatible_error_parse  sh     23!,!2!23!7%&!+0Fq0I/3E'N+,%;A%>E'N6")!,,r   NN)r!   r"   r#   __doc__DEFAULT_ENCODINGr>   KNOWN_LOCATIONSr   r;   r]   rY   rQ   rO   rP   rT   rS   rR   r   r   r   r   r   r   r   r   r   r   r   r3   r3      s{     "
 :O'/b?L:&
"JP

$B
65r   r3   c                        e Zd Zd fd	Zd Zd Z fdZd Zd Zd Z	d Z
d	 Zd
 Zed        Zed        Zed        Zed        Zed        Zed        ZeZeZeZ xZS )BaseXMLResponseParserc                 Z    t         |   ||       t        j                  d      | _        y )Nz{.*})superr   recompile_namespace_re)r   r?   r@   rz   s      r   r   zBaseXMLResponseParser.__init__  s$    );7ZZ/r   c                    i }|j                   }|j                  }|j                  j                  d      xs d}|j                  j                  d      xs d}|j                  j                  d      rt	        |t
              s|g}|D ]\  }|D ]P  }	| j                  |	      }
|
|k(  r| j                  ||	      },|
|k(  r| j                  ||	      }Dt        d|
        |<   ^ |S )Nr   keyrE   	flattenedzUnknown tag: )	r   rE   rU   rV   rW   r   	_node_tagr   r1   )r   r+   r   r[   	key_shapevalue_shapekey_location_namevalue_location_namekeyval_nodesingle_pairtag_namekey_nameval_names                r   _handle_mapz!BaseXMLResponseParser._handle_map  s    II	kk%3377?H5)77;;FCNw"";/
48N6D 
	(K* J>>+600#00KHH!44#00kJH-hZ.HIIJ  (F8
	( r   c                 N    | j                   j                  d|j                        S Nr)   )r   subr   )r   r   s     r   r   zBaseXMLResponseParser._node_tag  s    !!%%b$((33r   c                     |j                   j                  d      rt        |t              s|g}t        |   ||      S )Nr   )rU   rV   rW   r   r   r   )r   r+   r   rz   s      r   r   z"BaseXMLResponseParser._handle_list  s;     "";/
48N6Dw#E400r   c                 H   i }|j                   }|j                  j                  dd      r| j                  |      }| j	                  |      }| j                  ||      r"| j                  |      }| j                  |      S |D ]  }||   }|j                  j                  d      }	|	| j                  v s|j                  j                  d      rN| j                  ||      }
|j                  |
      }|| j                  ||      ||<   |j                  j                  d      si }|j                  d   }|j                  j                         D ];  \  }}| j                  j                  |j!                  d      d   dz   |      }|||<   = ||v s||   ||<    |S )	Nrg   FlocationeventheaderxmlAttributer   :r   )r   rh   rV   _get_error_root_build_name_to_xml_noder   r   r   rU   r   _member_key_namer   attribr   r   r   r   )r   r+   r   r[   r   xml_dictr   member_namer   r   xml_namemember_nodeattribslocation_namer   rE   new_keys                    r   _handle_structurez'BaseXMLResponseParser._handle_structure  s   -->>k51''-D//500A%%h/C;;C@@" 	AK";/L#1155jAHD000--11-@ ,,\;GH",,x0K&&*&7&7 +'{# ++//? , : :6 B"&++"3"3"5 -JC"0044%++C03c93G (-GG$	-
 !G+*1-*@F;'3	A4 r   c                 l    | j                  |      dk(  r|D ]  }| j                  |      dk(  s|c S  |S )NErrorResponserq   r   )r   original_rootchilds      r   r   z%BaseXMLResponseParser._get_error_root  s@    >>-(O;& !>>%(G3 L! r   c                     |j                   dk(  rD|j                  j                  d      r)|j                  j                  j                  d      }||S |j                  j                  d      }||S |S )Nr   r   r   )r   rU   rV   r   )r   r+   r   list_member_serialized_nameserialized_names        r   r   z&BaseXMLResponseParser._member_key_name  sw    
 ??f$)<)<)@)@)M*/,,*D*D*H*H+' +622--11&9&""r   c                     t        |t              r| j                  |d         S i }|D ]O  }| j                  |      }||v r3t        ||   t              r||   j	                  |       @||   |g||<   K|||<   Q |S r   )rW   r   r   r   r   )r   parent_noder   r   r   s        r   r   z-BaseXMLResponseParser._build_name_to_xml_node  s     k4(//A?? 	%D..&Ch
 hsmT2SM((. &.c]D$9HSM $	% r   c                     	 t        j                  t        j                         | j                        }|j	                  |       |j                         }|S # t        $ r}t        d| d|       d }~ww xY w)N)targetencodingzUnable to parse response (z6), invalid XML received. Further retries may succeed:
)r   	XMLParserTreeBuilderr   feedcloser   r1   )r   
xml_stringr   rootes        r   _parse_xml_string_to_domz.BaseXMLResponseParser._parse_xml_string_to_dom  s    
	__((*T5J5JF KK
#<<>D   	%,QC 0GGQlT 	s   AA 	A7!A22A7c                     |j                         D ]E  \  }}t        |      r&| j                  |      }| j                  |      ||<   7|j                  ||<   G |S r   )r   r   r   _replace_nodesr(   )r   r[   r   rE   sub_dicts        r   r   z$BaseXMLResponseParser._replace_nodes'  sZ     ,,. 	)JCE{77>"11(;s#jjs	) r   c                     |dk(  ryy)NtrueTFr   r   r+   r(   s      r   _handle_booleanz%BaseXMLResponseParser._handle_boolean0  s    6>r   c                     t        |      S r   floatr   s      r   _handle_floatz#BaseXMLResponseParser._handle_float7  s    T{r   c                 $    | j                  |      S r   r:   r   s      r   _handle_timestampz'BaseXMLResponseParser._handle_timestamp;  s    %%d++r   c                     t        |      S r   intr   s      r   _handle_integerz%BaseXMLResponseParser._handle_integer?  s    4yr   c                     |S r   r   r   s      r   _handle_stringz$BaseXMLResponseParser._handle_stringC  s    r   c                 $    | j                  |      S r   r<   r   s      r   _handle_blobz"BaseXMLResponseParser._handle_blobG  s      &&r   r   )r!   r"   r#   r   r   r   r   r   r   r   r   r   r   r/   r  r  r  r  r  r  _handle_character_handle_double_handle_long__classcell__rz   s   @r   r   r     s    0*41#J .     , ,     ' ' '"N"Lr   r   c                   2    e Zd Zd Zd Zd ZddZd Zd Zy)	QueryParserc                     |d   }| j                  |      }| j                  |      }| j                  |       d|v r |j                  |j	                  d             d|v rd|j	                  d      i|d<   |S )NrG   Errors	RequestIdrJ   )r   r   r   r   r   )r   rZ   r+   xml_contentsr   r[   s         r   rS   zQueryParser._do_error_parseQ  s    ',,\:--d3F# vMM&**X./& *5vzz+7N)OF%&r   c                 *    | j                  ||d      S )NFinject_metadata_parse_body_as_xmlr{   s      r   rR   z#QueryParser._do_modeled_error_parsea  s    &&x&NNr   c                 *    | j                  ||d      S )NTr  r   r{   s      r   rT   zQueryParser._do_parsed  s    &&x&MMr   c                     |d   }| j                  |      }i }|A|}d|j                  v r| j                  |j                  d   |      }| j                  ||      }|r| j	                  ||       |S )NrG   resultWrapper)r   rU   _find_result_wrapped_shaper   _inject_response_metadata)r   rZ   r+   r  r  r   r[   starts           r   r!  zQueryParser._parse_body_as_xmlg  s    ',,\:E%"5"5577''8$ &&ue4F**48r   c                 .    | j                  |      }||   S r   )r   )r   element_namexml_root_nodemappings       r   r%  z&QueryParser._find_result_wrapped_shapev  s    ..}=|$$r   c                     | j                  |      }|j                  d      }|>| j                  |      }|j                         D ]  \  }}|j                  ||<    ||d<   y y NrJ   )r   rV   r   r(   )r   r   inject_intor+  
child_nodesub_mappingr   rE   s           r   r&  z%QueryParser._inject_response_metadataz  sq    ..t4[[!34
!66zBK)//1 .
U#(::C ..9K*+	 "r   N)T)	r!   r"   r#   rS   rR   rT   r!  r%  r&  r   r   r   r  r  P  s"     ON%:r   r  c                   *     e Zd Zd Z fdZd Z xZS )EC2QueryParserc                 p    | j                  |      }|j                  d      }|d|j                  i|d<   y y )N	requestIdr  rJ   )r   rV   r(   )r   r   r.  r+  r/  s        r   r&  z(EC2QueryParser._inject_response_metadata  s?    ..t4[[-
!/:JOO.LK*+ "r   c                 \    t         |   ||      }d|v rd|j                  d      i|d<   |S )N	RequestIDr  rJ   )r   rS   r   )r   rZ   r+   originalrz   s       r   rS   zEC2QueryParser._do_error_parse  s@     7*8U;("X\\+6,H'( r   c                     |D ]8  }| j                  |      dk(  s|D ]  }| j                  |      dk(  s|c c S  : |S )Nr  rq   r   )r   r   r   errors_childs       r   r   zEC2QueryParser._get_error_root  sP    " 	,E~~e$0$) ,L~~l3w>++,	,
 r   )r!   r"   r#   r&  rS   r   r  r  s   @r   r2  r2    s    M(r   r2  c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	BaseJSONParserc                 \   i }|j                   r|}|S |j                  }|y i }| j                  ||      r"| j                  |      }| j	                  |      S |D ]O  }||   }|j
                  j                  d|      }|j                  |      }	|	8| j                  ||   |	      ||<   Q |S )Nr   )is_document_typer   r   r   r   rU   rV   r   )
r   r+   rE   final_parsedmember_shapesr   r   r   	json_name	raw_values
             r   r   z BaseJSONParser._handle_structure  s    !! L( % "MMM} L44UEB))%0??DD, ,[9(66::6;O	!IIi0	(040A0A%k2I1L- r   c                     i }|j                   }|j                  }|j                         D ].  \  }}| j                  ||      }| j                  ||      }|||<   0 |S r   )r   rE   r   r   )	r   r+   rE   r[   r   r   r   
actual_keyactual_values	            r   r   zBaseJSONParser._handle_map  sg    II	kk++- 	.JC**9c:J,,[%@L!-F:	. r   c                 $    | j                  |      S r   r  r   s      r   r  zBaseJSONParser._handle_blob  s      ''r   c                 $    | j                  |      S r   r  r   s      r   r  z BaseJSONParser._handle_timestamp  s    %%e,,r   c                    | j                  |d         }dddi d}|d   }|j                  d|j                  dd            |d   d<   |j                  d	      }|j                  d
|xr t        |            }|Qd|v r|j                  dd      d   }d|v r|j	                  dd      d   }d|v r| j                  |||      }||d   d<   | j                  ||d          |S )NrG   r)   ro   rn   rp   r6   messagero   rq   rH   r   r   r   r   #r   rn   )_parse_body_as_jsonrV   rr   r   rsplitr   r&  )r   rZ   r+   rG   r   r6   response_coder   s           r   rS   zBaseJSONParser._do_error_parse  s   ''(89&("52N9% %)HHtxx	2.%
gy!
 !]3xx-"FC4FG d{zz#q)!,d{{{3*1-#w.<<'5 &*E'N6"&&uhy.ABr   c                 >    d|v r|d   |j                  di       d<   y y )Nx-amzn-requestidrJ   r  )
setdefault)r   r[   r6   s      r   r&  z(BaseJSONParser._inject_response_metadata  s0    (EL"FF0"5kB )r   c                     |si S |j                  | j                        }	 t        j                  |      }|S # t        $ r d|icY S w xY w)NrI  )decoder   jsonloads
ValueError)r   body_contentsrG   original_parseds       r   rK  z"BaseJSONParser._parse_body_as_json  sU    I##D$9$9:	%"jj.O"" 	% t$$	%s   8 AAN)
r!   r"   r#   r   r   r  r  rS   r&  rK  r   r   r   r;  r;    s&    2(-"H
%r   r;  c                   ~    e Zd ZdZdZed        Zd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zy)BaseCBORParser      c           	          | 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   s    r    major_type_to_parsing_method_mapz/BaseCBORParser.major_type_to_parsing_method_map  sR     ++++&&&&  ++	
 		
r   c                 R    t        j                  t        j                  |            S r   )ioBufferedReaderBytesIO)r   bytess     r   get_peekable_stream_from_bytesz-BaseCBORParser.get_peekable_stream_from_bytes  s      E!233r   c                     | j                  |d      }|dz	  }|dz  }|| j                  v r| j                  |   } |||      S t        d| d|       )Nr   r_  rZ  z8Unsupported inital byte found for data item- Major type:z, Additional info: )_read_bytes_as_intrj  r1   )r   streaminitial_byte
major_typeadditional_infomethods         r   parse_data_itemzBaseCBORParser.parse_data_item  s|     ..vq9!Q&
 '3>>>:::FF&/22%(\)<"#% r   c                 p    ddddd}|dk  r|S ||v r||   }| j                  ||      S t        d|       )Nr   r   r^     )            r{  zhInvalid CBOR integer returned from the service; unparsable additional info found for major type 0 or 1: )rr  r1   )r   rs  rv  additional_info_to_num_bytes	num_bytess        r   rb  z&BaseCBORParser._parse_unsigned_integer2  sk    	(
$ R"" <<4_EI**69==%@@O?PR r   c                 ,    d| j                  ||      z
  S )N)rb  r   rs  rv  s      r   rc  z&BaseCBORParser._parse_negative_integerG  s    D00IIIr   c                 J   || j                   k7  r$| j                  ||      }| j                  ||      S g }	 | j                  |      rnK| j	                  |d      }|dz  }| j                  ||      }|j                  | j                  ||             ]dj                  |      S )Nr   rZ  r   )INDEFINITE_ITEM_ADDITIONAL_INFOrb  _read_from_stream_handle_break_coderr  r   join)r   rs  rv  lengthchunksrt  s         r   rd  z!BaseCBORParser._parse_byte_stringK  s    dBBB11&/JF))&&99F**62#66vqA".";55foNd44VVDE  88F##r   c                 D    | j                  ||      j                  d      S )Nr4   )rd  rR  r  s      r   re  z!BaseCBORParser._parse_text_string[  s     &&v?FFwOOr   c                 ,   || j                   k7  r:| j                  ||      }t        |      D cg c]  }| j                  |       c}S g }| j	                  |      s2|j                  | j                  |             | j	                  |      s2|S c c}w r   )r  rb  rangerx  r  r   )r   rs  rv  r  _r   s         r   rf  zBaseCBORParser._parse_array_  s    dBBB11&/JF:?-HQD((0HHE--f5T11&9: --f5L Is   Bc                     i }|| j                   k7  r6| j                  ||      }t        |      D ]  }| j                  ||        |S | j	                  |      s$| j                  ||       | j	                  |      s$|S r   )r  rb  r  _parse_key_value_pairr  )r   rs  rv  r   r  r  s         r   rg  zBaseCBORParser._parse_mapj  s    dBBB11&/JF6] :**659:L --f5**659 --f5Lr   c                 X    | j                  |      }| j                  |      }||||<   y y r   )rx  )r   rs  r   r   rE   s        r   r  z$BaseCBORParser._parse_key_value_pairw  s6    ""6*$$V,E#J r   c                     | j                  ||      }| j                  |      }|dk(  r| j                  |      S t        d|       )Nr   z*Found CBOR tag not supported by botocore: )rb  rx  _parse_datetimer1   )r   rs  rv  r   rE   s        r   rh  zBaseCBORParser._parse_tag  sS    **6?C$$V,!8''..%<SEB r   c                 l    t        |t        t        f      r| j                  |      S t	        d|       )Nz Unable to parse datetime value: )rW   r  r  r:   r1   rD   s     r   r  zBaseCBORParser._parse_datetime  s8    ec5\*))%00%25': r   c                     ddd d d}||v r||   S dddd}||v r1||   \  }}t        j                  || j                  ||            d   S t        d	| d
      )NFT)            )z>er   )z>fr^  )z>drz  )r|  r}  r~  r   z0Invalid additional info found for major type 7: zI.  This indicates an unsupported simple type or an indefinite float value)structunpackr  r1   )r   rs  rv  additional_info_simple_valuesfloat_formatsfloat_formatr  s          r   ri  z&BaseCBORParser._parse_simple_and_float  s     	)
% ;;0AA
 
 m+&3O&D#L)==d44VYG  ">>O PU V
 	
r   c                     t         j                  |j                  d      d d d      | j                  k(  r!|j	                  dt
        j                         yy )Nr   bigT)r  
from_bytespeek
BREAK_CODEseekosSEEK_CUR)r   rs  s     r   r  z!BaseCBORParser._handle_break_code  sC    >>&++a.!,e4GKK2;;' Hr   c                 R    | j                  ||      }t        j                  |d      S )Nr  )r  r  r  )r   rs  r  bytes       r   rr  z!BaseCBORParser._read_bytes_as_int  s%    %%fi8~~dE**r   c                 Z    |j                  |      }t        |      |k7  rt        d      |S )NzgEnd of stream reached; this indicates a malformed CBOR response from the server or an issue in botocore)readr   r1   )r   rs  r  rE   s       r   r  z BaseCBORParser._read_from_stream  s5    I&u:"%$ 
 r   N)r!   r"   r#   r  r  r   rj  rp  rx  rb  rc  rd  re  rf  rg  r  rh  r  ri  r  rr  r  r   r   r   rY  rY  	  sm    &(#J

 

4**J$ P
D
+r   rY  c                   *    e Zd Zd Zd Zd Zd Zd Zy)BaseEventStreamParserc                 H   i }|j                   j                  d      rH|d   j                  d      }|j                  j                  |      }|r| j                  ||      ||<   |S | j	                  |||j                  |       | j                  |||j                  |       |S )NrI   r6   z:event-type)rU   rV   r   rT   _parse_non_payload_attrs_parse_payload)r   rZ   r+   r>  
event_typeevent_shapes         r   rT   zBaseEventStreamParser._do_parse  s    ""=1!),00?J--++J7K+/>>k,Z( 	 ))% %Mr   c           	      `   |d   j                  d      }|j                  j                  |      }|O| j                  |d         }| j                  ||      }d||j                  d|j                  dd            di}|S d|d   j                  d	d      |d   j                  d
d      di}|S )Nr6   z:exception-typerG   rq   ro   rI  r)   rm   z:error-codez:error-message)rV   r   _initial_body_parser   )r   rZ   r+   exception_typeexception_shaperW  rG   r   s           r   rS   z%BaseEventStreamParser._do_error_parse  s    !),001BC--++N;&"66x7GHO$$_oFD*#xx	488Ir3JKE  $Y/33M2F'	2667GLE r   c                    |j                   j                  d      r|D ]  }||   }|j                   j                  d      s$|d   }|j                  dk(  r|}nN|j                  dk(  r|j                  | j                        }n#| j                  |      }	| j                  ||	      }|||<    y  | j                  |d         }
| j                  ||
      }|j                  |       y y )NeventeventpayloadrG   blobstring)rU   rV   r   rR  r   r  r   r   )r   rZ   r+   r?  r>  r   r   rG   parsed_body	raw_parserW  body_parseds               r   r  z$BaseEventStreamParser._parse_payload  s    ""7+% ,T2--11.A#F+D#--7&*%//8;&*kk$2G2G&H$($<$<T$B	&*&7&7()' *5L&  #66x7GHO++E?CK,' ,r   c                     |d   }|D ]U  }||   }|j                   j                  d      s$||v s)||   }|j                  dk(  r| j                  |dz        }|||<   W y )Nr6   r   	timestampg     @@)rU   rV   r   r:   )	r   rZ   r+   r?  r>  r6   r   r   rE   s	            r   r  z.BaseEventStreamParser._parse_non_payload_attrs  sy     9%! 		/D(.L))--m<7?#DME#--< !% 6 6uv~ F).L&		/r   c                     t        d      Nr  ry   r   rV  s     r   r  z)BaseEventStreamParser._initial_body_parse      
 ""788r   N)r!   r"   r#   rT   rS   r  r  r  r   r   r   r  r    s     *-,/9r   r  c                       e Zd Zd Zy)EventStreamJSONParserc                 $    | j                  |      S r   rK  r  s     r   r  z)EventStreamJSONParser._initial_body_parse      ''66r   Nr!   r"   r#   r  r   r   r   r  r    s    7r   r  c                       e Zd Zd Zy)EventStreamXMLParserc                 R    |st        j                  d      S | j                  |      S r   r   Elementr   r   r   s     r   r  z(EventStreamXMLParser._initial_body_parse#  %    ==$$,,Z88r   Nr  r   r   r   r  r  "  s    9r   r  c                       e Zd Zd Zy)EventStreamCBORParserc                 P    |dk(  ri S | j                  | j                  |            S Nr   )rx  rp  r  s     r   r  z)EventStreamCBORParser._initial_body_parse*  s0    CI##//>
 	
r   Nr  r   r   r   r  r  )  s    
r   r  c                   *    e Zd ZeZ	 d Zd Zd Zd Zy)
JSONParserc                     i }|7|j                   }|r| j                  |||      }n| j                  |d   |      }| j                  ||d          |S )NrG   r6   )event_stream_name_handle_event_stream_handle_json_bodyr&  )r   rZ   r+   r[   
event_names        r   rT   zJSONParser._do_parse7  s`    00J228UJO//0@%H&&vx	/BCr   c                 ,    | j                  |d   |      S NrG   )r  r{   s      r   rR   z"JSONParser._do_modeled_error_parseB  s    %%hv&6>>r   c                     |j                   |   }| j                  ||      }	 |j                         }| j                  |j                  |      }|||<   |S # t        $ r d}t	        |      w xY wNz,First event was not of type initial-response)r   r   get_initial_responser   r1   r  payload	r   rZ   r+   r  event_stream_shapeevent_streamr  r   r[   s	            r   r  zJSONParser._handle_event_streamE  s    "]]:600;MN	1 557E ''u=)z & 	1FI%i00	1s   A A-c                 H    | j                  |      }| j                  ||      S r   )rK  r   )r   raw_bodyr+   parsed_jsons       r   r  zJSONParser._handle_json_bodyQ  s'     ..x8  44r   N)	r!   r"   r#   r  r>   rT   rR   r  r  r   r   r   r  r  2  s    32	?
5r   r  c                   T     e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Z fd
Z xZS )BaseRestParserc                 X    i }| j                  |      |d<   | j                  |||       |S r-  )_populate_response_metadata_add_modeled_parser   rZ   r+   r>  s       r   rT   zBaseRestParser._do_parseZ  s:    +/+K+K,
'( 	%>r   c                 t    ||S |j                   }| j                  ||||       | j                  ||||       y r   )r   r  r  )r   rZ   r+   r>  r?  s        r   r  z!BaseRestParser._add_modeled_parseb  sC    =%%e]L	
 	He]LIr   c                 0    i }| j                  |||       |S r   r  r  s       r   rR   z&BaseRestParser._do_modeled_error_parsek      %>r   c                 r    i }|d   }d|v r
|d   |d<   |S d|v r|d   |d<   |j                  dd      |d<   |S )Nr6   rO  r  x-amz-request-id
x-amz-id-2r)   HostIdrc   r   rZ   rh   r6   s       r   r  z*BaseRestParser._populate_response_metadatap  sf    9%($+,>$?H[!   7*$+,>$?H[! ")\2!>HXr   c                    d|j                   v r|j                   d   }||   }|j                   j                  d      r| j                  ||      }|||<   y |j                  dv r6|d   }t	        |t
              r|j                  | j                        }|||<   y | j                  |d         }| j                  ||      ||<   y | j                  |d         }| j                  ||      }	|j                  |	       y )Nr  rI   )r  r  rG   )rU   rV   r   r   rW   ro  rR  r   r  r   r   )
r   rZ   r+   r?  r>  payload_member_name
body_shaperG   rW  r  s
             r   r  zBaseRestParser._parse_payload}  s   +++ #("5"5i"@&':;J''++M:00:F4801%%);;'dE*;;t'<'<=D4801"&":":8F;K"L484E4E501 #66x7GHO++E?CK,r   c                 R   |d   }|D ]  }||   }|j                   j                  d      }|&|dk(  r| j                  ||d         ||<   D|dk(  r| j                  ||      ||<   _|dk(  se|j                   j                  d|      }	|	|v s| j                  |||	         ||<    y )Nr6   r   r7   rH   r5   r   )rU   rV   r   _parse_header_map)
r   rZ   r+   r?  r>  r6   r   r   r   header_names
             r   r  z'BaseRestParser._parse_non_payload_attrs  s     9%! 	D(.L#1155jAH\)%)%6%6 (="9&T" Y&%)%;%; '&T" X%*88<<VTJ'))-):):$gk&:*L&!	r   c                     i }|j                   j                  dd      j                         }|D ]8  }|j                         j                  |      s#|t	        |      d  }||   ||<   : |S )Nr   r)   )rU   rV   lowerrk   r   )r   r+   r6   r[   prefixr  r   s          r   r  z BaseRestParser._parse_header_map  sw     $$((4::<" 	4K  "--f5 #3v;=1&{3t	4 r   c                     t        d      r  r  r  s     r   r  z"BaseRestParser._initial_body_parse  r  r   c                     |}t        |      rCt        j                  |      j                  | j                        }t        j                  |      }|S r   )r	   rB   rC   rR  r   rS  rT  )r   r+   rE   r[   decodeds        r   r  zBaseRestParser._handle_string  sC    &&&u-44T5J5JKGZZ(Fr   c                     |j                   j                  d      }|dk(  r<t        |t              s,|j	                  d      D cg c]  }|j                          }}t        |   ||      S c c}w )Nr   r5   ,)rU   rV   rW   r   r   rj   r   r   )r   r+   r   r   r   rz   s        r   r   zBaseRestParser._handle_list  sb    &&**:6x
4(>'+zz#7!AGGI7D7w#E400 8s   A.)r!   r"   r#   rT   r  rR   r  r  r  r  r  r  r   r  r  s   @r   r  r  Y  s;    J
-2091 1r   r  c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	BaseRpcV2Parserc                     i }|K|j                   }|r| j                  |||      }ni }| j                  |||       | j                  |      |d<   |S r-  )r  r  r  r  )r   rZ   r+   r[   r  s        r   rT   zBaseRpcV2Parser._do_parse  sm     % 7 7 22e%6 ##HeV<)-)I)I*F%& r   c                 2    ||S | j                  |||       y r   )r  r  s       r   r  z"BaseRpcV2Parser._add_modeled_parse  s    =He\:r   c                 0    i }| j                  |||       |S r   r  r  s       r   rR   z'BaseRpcV2Parser._do_modeled_error_parse  r  r   c                 ,    i }|d   }d|v r|d   |d<   |S )Nr6   rO  r  r   r  s       r   r  z+BaseRpcV2Parser._populate_response_metadata  s.    9%($+,>$?H[!r   c                    i }|j                   }|j                  rp|j                         }|j                  dd        |j	                         D ci c]  \  }}|	|| }}}t        |      dk7  rd}t        ||j                  z        |D ]0  }	||	   }
|j                  |	      }|| j                  |
|      ||	<   2 |S c c}}w )Nr   r   r   )
r   r   r   r   r   r   r1   r   rV   r   )r   r+   r   r[   r   r   r   r   r   r   r   r   s               r   r   z!BaseRpcV2Parser._handle_structure  s    --   IIKMh-!.!4!4!6A!-1M  =!Q&&  *)ejj*@AA" 	K";/L((;/K&&*&7&7 +'{#		 !s   
CCc                 r    | j                  |d         }| j                  ||      }|j                  |       y r  )r  r   r   )r   rZ   r+   r>  rW  r  s         r   r  zBaseRpcV2Parser._parse_payload  s7    228F3CD''?K(r   c                     t        d      r  r  r  s     r   r  z#BaseRpcV2Parser._initial_body_parse  r  r   N)
r!   r"   r#   rT   r  rR   r  r   r  r  r   r   r   r  r    s%     ;

0)
9r   r  c                   H     e Zd ZeZd Z fdZd Zd Zd Z	d Z
e	Ze
Z xZS )RestJSONParserc                 $    | j                  |      S r   r  r  s     r   r  z"RestJSONParser._initial_body_parse  r  r   c                 L    t         |   ||      }| j                  ||       |S r   )r   rS   _inject_error_code)r   rZ   r+   r   rz   s       r   rS   zRestJSONParser._do_error_parse  s)    '%8x0r   c                 *   | j                  |d         }d }d|d   v r	|d   d   }n*d|v sd|v r"|j                  d|j                  dd            }|y t        |t              r(|j	                  dd      d	   j                  d
d      d   }||d   d<   y )NrG   zx-amzn-errortyper6   r   rn   r)   r   r   r   rJ  r  rq   )r  rV   rW   rr   r   rL  )r   r   rZ   rG   r   s        r   r  z!RestJSONParser._inject_error_code#  s     ''(89)!44I&'9:Dt^v~88FDHHVR$89D<dC ::c1%a(//Q7;D!%gvr   c                     t        |      S r   )r   r   s      r   r  zRestJSONParser._handle_boolean2  s    e$$r   c                     t        |      S r   r
  r   s      r   r  zRestJSONParser._handle_integer5  s    5zr   c                     t        |      S r   r  r   s      r   r  zRestJSONParser._handle_float8  s    U|r   )r!   r"   r#   r  r>   r  rS   r  r  r  r  r  r  r  r  s   @r   r  r    s3    37
&% #L"Nr   r  c                   "    e Zd ZeZd Zd Zd Zy)RpcV2CBORParserc                 T    |dk(  r|S | j                  |      }| j                  |      S r  )rp  rx  )r   rV  body_contents_streams      r   r  z#RpcV2CBORParser._initial_body_parseB  s8    C  #BB 
 ##$899r   c                    | j                  |d         }|j                  d|j                  dd            ddi d}|d   }|j                  d      }||j                  d	      }|t        |      }|Qd
|v r|j                  d
d      d   }d|v r|j	                  dd      d   }d|v r| j                  |||      }||d   d<   d|v r|d   |j                  di       d<   |S )NrG   rI  ro   r)   rH  rp   r6   r   rH   r   r   r   rJ  r   rq   rn   rO  rJ   r  )r  rV   rr   r   rL  r   rP  )r   rZ   r+   rG   r   r6   r   rM  s           r   rS   zRpcV2CBORParser._do_error_parseJ  s    ''(89  88Itxx	2/FG !#
 9%xx!<$LL7M(=)d{zz#q)!,d{{{3*1-#w.<<'5 &*E'N6"(DK"EE/4[A r   c                     |j                   |   }| j                  ||      }	 |j                         }| j                  |j                        }|||<   |S # t        $ r d}t	        |      w xY wr  )r   r   r  r   r1   r  r  r  s	            r   r  z$RpcV2CBORParser._handle_event_streamj  s}    "]]:600;MN	1 557E ))%--8)z & 	1FI%i00	1s   A A,N)r!   r"   r#   r  r>   r  rS   r  r   r   r   r  r  ?  s    3:@
r   r  c                   D     e Zd ZeZd Zd Zd Zd Ze	 fd       Z
 xZS )RestXMLParserc                 R    |st        j                  d      S | j                  |      S r   r  r  s     r   r  z!RestXMLParser._initial_body_parsez  r  r   c                     |d   r	 | j                  |      S | j	                  |      S # t        $ r t        j                  dd       Y 3w xY w)NrG   z2Exception caught when parsing error response body:T)exc_info)_parse_error_from_bodyr1   rM   rN   _parse_error_from_http_statusr{   s      r   rS   zRestXMLParser._do_error_parse  s]     F228<< 11(;; ' 		H!  s   )  AAc                     t        |d         t        j                  j                  j	                  |d   d      d|d   j	                  dd      |d   j	                  dd      ddS )	NrH   r)   rm   r6   r  r  )r  r  rp   )rr   rs   rt   ru   rV   rv   s     r   r$  z+RestXMLParser._parse_error_from_http_status  st     H]34;;0044]+R &i0445GL"9-11,C!
 	
r   c                 b   |d   }| j                  |      }| j                  |      }| j                  |       |j                  dk(  r:| j	                  |      }|j                  dd       |j                  dd       ||dS d|v rd|j                  d      i|d<   ddddi}t        ||       |S )	NrG   rq   r  r)   r  rp   rJ   rH  )r   r   r   r   r  r   r   )r   rZ   r  r   r[   rh   defaults          r   r#  z$RestXMLParser._parse_error_from_body  s    ',,\:--d3F#88w 77AH
 JJ{B'JJx$#BBF"*5vzz+7N)OF%&B78GV$r   c                 (    t         |   ||      }|S r   )r   r  )r   r+   r(   rz   s      r   r  zRestXMLParser._handle_string  s    w%eT2r   )r!   r"   r#   r  r>   r  rS   r$  r#  r/   r  r  r  s   @r   r  r  w  s1    29
<6
.  r   r  )ec2queryrS  z	rest-jsonzrest-xmlzsmithy-rpc-v2-cbor)1r   rB   http.clientrs   rl  rS  loggingr  r   r  botocore.compatr   r   botocore.eventstreamr   r   botocore.utilsr   r   r	   r
   r   r   	getLoggerr!   rM   r9   r   r    r/   	Exceptionr1   r3   r   r  r2  r;  rY  r  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>r2     sy  kZ   	   	 	  0 D  g!* , ,*;*	) 	W Wtn#N n#b1:' 1:h![ !H^%^ ^%B~^ ~BP9N P9f71> 7
902G 9
1> 
$5 $5Nu1^ u1pD9n D9N$#^^ $#N5o~ 5pKN$9 K^ ) r   