3 B\wt@sdZddlZddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z ddl m Z ddl mZdd lmZd Zd Zd ZdddZGdddeZGdddeZGdddeZGdddeZGdddeZGdddeeZGdddeZeeeeedZdS) aProtocol input serializes. This module contains classes that implement input serialization for the various AWS protocol types. These classes essentially take user input, a model object that represents what the expected input should look like, and it returns a dictionary that contains the various parts of a request. A few high level design decisions: * Each protocol type maps to a separate class, all inherit from ``Serializer``. * The return value for ``serialize_to_request`` (the main entry point) returns a dictionary that represents a request. This will have keys like ``url_path``, ``query_string``, etc. This is done so that it's a) easy to test and b) not tied to a particular HTTP library. See the ``serialize_to_request`` docstring for more details. Unicode ------- The input to the serializers should be text (str/unicode), not bytes, with the exception of blob types. Those are assumed to be binary, and if a str/unicode type is passed in, it will be encoded as utf-8. N) ElementTree)six)json formatdate)parse_to_aware_datetime)percent_encode)is_json_value_header)validateiso8601z%Y-%m-%dT%H:%M:%SZz%Y-%m-%dT%H:%M:%S.%fZTcCs&t|}|r"tj}tj||}|S)N) SERIALIZERSr ZParamValidatorZParamValidationDecorator)Z protocol_nameZinclude_validation serializerZ validatorr l/private/var/folders/pf/wv4htv3x0qs2c2mp0dnn0kchsvlck3/T/pip-install-emcbgzcf/botocore/botocore/serialize.pycreate_serializer>s   rc@sbeZdZdZeZdZddZddZddZ d d Z d d Z dddZ ddZ ddZddZd S) SerializerPOSTzutf-8cCs tddS)aSerialize parameters into an HTTP request. This method takes user provided parameters and a shape model and serializes the parameters to an HTTP request. More specifically, this method returns information about parts of the HTTP request, it does not enforce a particular interface or standard for an HTTP request. It instead returns a dictionary of: * 'url_path' * 'host_prefix' * 'query_string' * 'headers' * 'body' * 'method' It is then up to consumers to decide how to map this to a Request object of their HTTP library of choice. Below is an example return value:: {'body': {'Action': 'OperationName', 'Bar': 'val2', 'Foo': 'val1', 'Version': '2014-01-01'}, 'headers': {}, 'method': 'POST', 'query_string': '', 'host_prefix': 'value.', 'url_path': '/'} :param parameters: The dictionary input parameters for the operation (i.e the user input). :param operation_model: The OperationModel object that describes the operation. serialize_to_requestN)NotImplementedError)self parametersoperation_modelr r rrPs$zSerializer.serialize_to_requestcCsdd|jidd}|S)N/)url_path query_stringmethodheadersbody)DEFAULT_METHOD)r serializedr r r_create_default_requestvs z"Serializer._create_default_requestcCs|jdkrt}nt}|j|S)Nr) microsecond ISO8601_MICROISO8601strftime)rvaluetimestamp_formatr r r_timestamp_iso8601s zSerializer._timestamp_iso8601cCsttj|jS)N)intcalendartimegm timetuple)rr&r r r_timestamp_unixtimestampsz#Serializer._timestamp_unixtimestampcCs"t|tjr|j|}t|ddS)NT)usegmt) isinstancedatetimer-r)rr&r r r_timestamp_rfc822s  zSerializer._timestamp_rfc822NcCs8|dkr|j}|j}t|}t|d|}||}|S)Nz _timestamp_%s)TIMESTAMP_FORMATlowerrgetattr)rr&r' datetime_obj converterZ final_valuer r r_convert_timestamp_to_strs z$Serializer._convert_timestamp_to_strcCs|jjd|S)Nname) serializationget)rshape default_namer r r_get_serialized_nameszSerializer._get_serialized_namecCs.t|tjr|j|j}tj|jj|jS)N) r/r text_typeencodeDEFAULT_ENCODINGbase64 b64encodestripdecode)rr&r r r _get_base64s  zSerializer._get_base64csV|j}|dkrdS|d}|jj}dd|jD}tfdd|D}|jf|S)NZ hostPrefixcSs g|]\}}|jjdr|qS)Z hostLabel)r9r:).0memberr;r r r sz2Serializer._expand_host_prefix..c3s|]}||fVqdS)Nr )rFr8)rr r sz1Serializer._expand_host_prefix..)Zendpoint input_shapemembersitemsdictformat)rrrZoperation_endpointZhost_prefix_expressionZ input_membersZ host_labelsZ format_kwargsr )rr_expand_host_prefixszSerializer._expand_host_prefix)N)__name__ __module__ __qualname__rrMMAP_TYPEr@rr!r(r-r1r7r=rErOr r r rrGs&  rc@speZdZdZddZdddZdddZdd d Zdd d Zdd dZ dddZ dddZ dddZ ddZ dS) QuerySerializerr cCs|j}|j}|jjd|j|d<ddi|d<|j}|j|d<|jd|d<|dk rd|j|||||d<|j ||}|dk r||d <|S) Nrz Content-Typez0application/x-www-form-urlencoded; charset=utf-8rZActionZ apiVersionVersionr host_prefix) rJr!httpr:rrSr8metadata _serializerO)rrrr;r body_paramsrVr r rrs    z$QuerySerializer.serialize_to_requestrcCs(t|d|j|j}|||||ddS)Nz_serialize_type_%s)prefix)r4 type_name_default_serialize)rr r&r;r[rr r rrYs zQuerySerializer._serializec CsT|j}xH|jD]<\}}||}|j||}|rx8t|dD]*\}}d||f}|j}|j||||q WdS)Nrbz%s.%s)rgrGrY) rr r&r;r[rhrirjrkr r rrl;s z"EC2Serializer._serialize_type_listN)r)rPrQrR__doc__r=rlr r r rrw$s rwc@sReZdZdZddZdddZddZd d Zd d Zd dZ ddZ ddZ dS)JSONSerializerZ unixtimestampc Csd|jd|jf}|jd}|j}|jjd|j|d<|d|d|d<|j}|j}|dk rp|j|||t j |j |j |d<|j ||}|dk r||d <|S) Nz%s.%sZ targetPrefixZ jsonVersionrzapplication/x-amz-json-%s)z X-Amz-Targetz Content-TyperrrV)rXr8r!rWr:rrSrJrYrdumpsr?r@rO) rrrtargetZ json_versionr rrJrVr r rrEs"     z#JSONSerializer.serialize_to_requestNcCs&t|d|j|j}|||||dS)Nz_serialize_type_%s)r4r\r])rr r&r;r^rr r rrY\s zJSONSerializer._serializec Csh|dk r|j}|||<|}|j}x@|jD]4\}}||} d| jkrP| jd}|j||| |q,WdS)Nr8)rSrKrLr9rY) rr r&r;r^Znew_serializedrKZ member_key member_valuer_r r rr`as  z(JSONSerializer._serialize_type_structurecCs<|j}|||<x&|jD]\}}|j|||j|qWdS)N)rSrLrYr&)rr r&r;r^Zmap_objZsub_keyZ sub_valuer r rrorsz"JSONSerializer._serialize_type_mapcCsBg}|||<x0|D](}i}|j|||jd|j|dqWdS)NZ __current__)rYrGappend)rr r&r;r^list_objZ list_itemwrapperr r rrlxs  z#JSONSerializer._serialize_type_listcCs |||<dS)Nr )rr r&r;r^r r rr]sz!JSONSerializer._default_serializecCs|j||jjd||<dS)Nrq)r7r9r:)rr r&r;r^r r rrrsz(JSONSerializer._serialize_type_timestampcCs|j|||<dS)N)rE)rr r&r;r^r r rrpsz#JSONSerializer._serialize_type_blob)N) rPrQrRr2rrYr`rorlr]rrrpr r r rrzBs  rzc@sdeZdZdZdZdZddddgZdd Zd d Zd d Z ddZ ddZ ddZ ddZ ddZdS)BaseRestSerializera=Base class for rest protocols. The only variance between the various rest protocols is the way that the body is serialized. All other aspects (headers, uri, etc.) are the same and logic for serializing those aspects lives here. Subclasses must implement the ``_serialize_body_params`` method. r Zrfc822uri querystringheaderrc Cs|j}|jjd|j|d<|j}|dkr<|jd|d<|S|j}|j|j|j|jd}x.|jD]"\}}|dkr|qj|j||||qjW|j |jd|d|d<|d|d<|dr|d|d<|j ||||||j ||} | dk r| |d <|S) NrZ requestUrir)uri_path_kwargsquery_string_kwargs body_kwargsrrrrrrV) r!rWr:rrJrKrSrL_partition_parameters_render_uri_template_serialize_payloadrO) rrrr r; shape_members partitioned param_name param_valuerVr r rrs:         z'BaseRestSerializer.serialize_to_requestcCs^i}xLtjd|D]<}|jdr>t||dddd||<qt||||<qW|jf|S)Nz{(.*?)}+rbz/~)saferc)refindallendswithrrN)rZ uri_templateparamsZencoded_paramsZtemplate_paramr r rrs z'BaseRestSerializer._render_uri_templatec Cs|jjd}|dk rB||jdkrB|j|d}|j|}||d<nL|dk rr|j|}|dk r|j||||d<n|dr|j|d||d<dS)Npayloadblobstringrrr)rr)r9r:r\_encode_payload_serialize_body_params) rrrr r;rZpayload_memberZ body_payloadrZr r rrs     z%BaseRestSerializer._serialize_payloadcCst|tjr|j|jS|S)N)r/rr>r?r@)rrr r rrs  z"BaseRestSerializer._encode_payloadc Cs||}|jjd}|jjd|}|dkr8||d|<n|dkrt|trZ|dj|n\t|trzt|j|d|<n<|jdkr|jjd|j }|j |||d|<n ||d|<n\|d kr||} |j | |} t| |d |<n.|d kr|} |j | |d |n ||d |<dS) Nlocationr8rrrr timestamprqrrr) r9r:r/rMupdateboolstrr3r\QUERY_STRING_TIMESTAMP_FORMATr7_convert_header_value_do_serialize_header_map) rrrrrrGrkey_namer'r;r& header_prefixr r rrs4       z(BaseRestSerializer._partition_parameterscCs*x$|jD]\}}||}|||<q WdS)N)rL)rrrZ user_inputr^valZfull_keyr r rr.sz+BaseRestSerializer._do_serialize_header_mapcCs tddS)Nr)r)rrr;r r rr3sz)BaseRestSerializer._serialize_body_paramscCs`|jdkr|d|d7}|d|j|<xj|jD]^\}} |j|} | jjd|} | dkrdS| jjdr| jd} | |j| <qV|j| | || qVWdS)NZ xmlNamespacexmlnsr[z:%srr8Z xmlAttribute)r SubElementr9r:attribrLrKrY) rrrr;r8Zstructure_nodeZnamespace_metadataZattribute_namer^r&r_ member_nameZxml_attribute_namer r rr`\s"        z+RestXMLSerializer._serialize_type_structurec CsX|j}|jjdr|}|}n|jjdd}tj||}x|D]}|j||||qr)rrrr;r8rr r rr]s z$RestXMLSerializer._default_serializeN) rPrQrRr2rrYr`rlrorurprrr]r r r rrMs  r)Zec2queryrz rest-jsonzrest-xml)T)ryrrAr*r0Z xml.etreerZbotocore.compatrrrZbotocore.utilsrrrZbotocorer ZDEFAULT_TIMESTAMP_FORMATr$r#robjectrrTrwrzrrrr r r r r's8       uhM7a