o
    iE                     @   sR  d Z ddlmZ ddlZee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mZ ddlmZmZ ddlmZ ddlmZmZ dd	lmZ dd
lmZ dZdZdZ e!dZ"e!dZ#dj$Z%dd Z&dd Z'dd Z(d%ddZ)g dZ*g dZ+dd Z,G dd deZ-e!dZ.e!d Z/e!d!Z0e!d"Z1G d#d$ d$e2Z3dS )&zThe ``spyne.protocol.http`` module contains the HttpRpc protocol
implementation.

This module is EXPERIMENTAL. You may not recognize the code here next time you
look at it.
    )print_functionN)BODY_STYLE_WRAPPEDMethodDescriptorPushBase)six	coroutineBreak)string_typesBytesIO)ResourceNotFoundError)BINARY_ENCODING_URLSAFE_BASE64File)DateTime)SimpleDictDocumenti @  i   z\\[0-3][0-7][0-7]z[\\]. c                 C   s4   zdd l }W n ty   | d Y S w || S )Nr   idna)r   ImportErrorencode)textr    r   S/var/www/html/LicenciasMIG/venv/lib/python3.10/site-packages/spyne/protocol/http.py_host_to_bytes9   s   
r   c                 C   sn  | du s
t | dk r| S | d dks| d dkr| S | dd } d}t | }g }d|  kr2|k rn t|S t| |}t| |}|sU|sU|| |d  	 t|S d }}|r`|d}|rg|d}|r|ro||k r|| ||  || |d   |d }n|| ||  |tt| |d |d  d |d }d|  kr|k s7t|S  t|S )	zHandle double quotes and escaping in cookie values.
    This method is copied verbatim from the Python 3.5 standard
    library (http.cookies._unquote) so we don't have to depend on
    non-public interfaces.
    N   r   "         )	len
_OctalPattsearch
_QuotePattappendstartchrint	_nulljoin)strinreso_matchq_matchjkr   r   r   _unquote_cookieB   s@   


$r/   c                 C   sb   i }|  dD ]'}d|v r| dd\}}nd|}}| | }}|s(|r.t|||< q|S )a<  Parse a ``Cookie`` HTTP header into a dict of name/value pairs.
    This function attempts to mimic browser cookie parsing behavior;
    it specifically does not follow any of the cookie-related RFCs
    (because browsers don't either).
    The algorithm used is identical to that used by Django version 1.9.10.
    ;=r   r   )splitstripr/   )cookieretvalchunkkeyvalr   r   r   _parse_cookies   s   
r9   Tc                    s   	 d fdd	}|S )Nc                    sH   | t ks dkr dkrtjd d}|S tjdd}|S t }|S )NFzwb+)dirdelete)r:   )SWAP_DATA_TO_FILE_THRESHOLDtempfileNamedTemporaryFiler
   )total_content_lengthfilenamecontent_typecontent_lengthr5   r;   r:   r   r   stream_factory   s   z*get_stream_factory.<locals>.stream_factoryNr   )r:   r;   rD   r   rC   r   get_stream_factory   s   rF   )MonTueWedThuFriSatSun)w00tJanFebMarAprMayJunJulAugSepOctNovDecc                 C   sj   t |tr/|jd ur|tj}n|jtjd}dt|  |j	t
|j |j|j|j|jf S | ||S )N)tzinfoz#%s, %02d %s %04d %02d:%02d:%02d GMT)
issubclassr   r[   
astimezonepytzutcreplace_weekdayweekdayday_monthmonthyearhourminutesecond
to_unicode)protr8   clsr   r   r   _header_to_bytes   s   

rm   c                       s   e Zd ZdZdZeZdZee	j
Z
e
d 			d$ fd	d
	Zdd Zdd ZeeeZdd Zd%ddZdd Zdd Zdd Zedd Zdd Zd&ddZd d! Z fd"d#Z  ZS )'HttpRpca  The so-called HttpRpc protocol implementation. It only works with Http
    (wsgi and twisted) transports.

    :param app: An :class:'spyne.application.Application` instance.
    :param validator: Validation method to use. One of (None, 'soft')
    :param mime_type: Default mime type to set. Default is
        'application/octet-stream'
    :param tmp_dir: Temporary directory to store partial file uploads. Default
        is to use the OS default.
    :param tmp_delete_on_close: The ``delete`` argument to the
        :class:`tempfile.NamedTemporaryFile`.
        See: http://docs.python.org/2/library/tempfile.html#tempfile.NamedTemporaryFile.
    :param ignore_uncap: As HttpRpc can't serialize complex models, it throws a
        server exception when the return type of the user function is Complex.
        Passing ``True`` to this argument prevents that by ignoring the return
        value.
    
text/plainzUTF-8httpNTF.c
           
         s2   t t| j||||||	d || _|| _|| _d S )N)ignore_uncap
hier_delimstrict_arrays)superrn   __init__tmp_dirtmp_delete_on_closeparse_cookie)
selfapp	validator	mime_typerw   rx   rr   ry   rs   rt   	__class__r   r   rv      s   
zHttpRpc.__init__c                 C      | j S rE   )_HttpRpc__tmp_delete_on_closerz   r   r   r   get_tmp_delete_on_close   s   zHttpRpc.get_tmp_delete_on_closec                 C   s   || _ t| j| j | _d S rE   )r   rF   rw   rD   )rz   r8   r   r   r   set_tmp_delete_on_close   s   
zHttpRpc.set_tmp_delete_on_closec                 C   s8   |dks	|| j u r| j | _d S |d u rd | _d S t|)Nsoft)SOFT_VALIDATIONr|   
ValueError)rz   r|   r   r   r   set_validator   s
   
zHttpRpc.set_validatorc                 C   s:   |j jdsJ d|j j|j f |j j|_||j _d S )Nrp   z@This protocol only works with an http transport, not %r, (in %r))	transporttypeendswithreqin_documentrequest_encoding)rz   ctxin_string_encodingr   r   r   create_in_document   s   
zHttpRpc.create_in_documentc           	      C   s   |t jksJ |jj| || | jrR|jdd }|d u r%|jdd }|d urR|D ]&}t	d| t
|}| D ]\}}|j|g }|| ||j|< q;q+t	d|j  t	d|j  d S )Nr4   CookiezLoading cookie string %rz	header : %rz	body   : %r)r   REQUESTr   itselfdecompose_incoming_envelopery   in_header_docgetloggerdebugr9   itemsr"   in_body_doc)	rz   r   message_typecookiescookie_stringr4   r.   vlr   r   r   r      s&   
z#HttpRpc.decompose_incoming_envelopec                 C   s   || j fv sJ | jd| |jd u rt|jt|jdd }|d u r(|jj	}|jj
d urA|jj
d }| j||j|| j|d|_
|jjd urV| j||j|jj| j|d|_| jd| d S )Nbefore_deserializer   r   )req_encafter_deserialize)r   event_manager
fire_event
descriptorr   method_request_stringgetattrr   in_protocoldefault_string_encoding	in_headersimple_dict_to_objectr   r|   
in_messager   	in_object)rz   r   messager   in_header_classr   r   r   deserialize	  s"   



zHttpRpc.deserializec                 C   sb   d }|| j fv s
J |jd urd S |jd ur#d|j_|j|j|_n| |}| jd| |S )Nro   	serialize)	RESPONSEout_document	out_errorr   r}   to_bytes_iterable_handle_rpcr   r   )rz   r   r   r5   r   r   r   r   !  s   


zHttpRpc.serializec                 c   s    |j j}d }d }|j jtu r1||}t|dkr!| js!tdt|dkr0| \}|j	\}n|}|j	\}|d urxt
|trVt|tttfsV|jd urV|jt|j | ||}t|tsf||_d S |jj| 	 d V }|j| qnd S )Nr   zHHttpRpc protocol can only serialize functions with a single return type.)r   out_message
body_styler   get_flat_type_infor   rr   	TypeErrorvalues
out_objectr\   r   
isinstancelisttupler	   r   r   set_mime_typer'   r   r   r   r   set_out_document_pushsend)rz   r   result_class	out_classr   ftiretsvr   r   r   _handle_rpc_nonempty4  s:   





zHttpRpc._handle_rpc_nonemptyc                 C   s   d }|j d u st|j dk rdg|_n| |}|jj}|d ur$|d }|jd urB|j}t|jttfr9|jd }| j	||t
d|_|S )Nr   r   r   )subinst_eater)r   r   r   r   r   
out_headerr   r   r   object_to_simple_dictrm   out_header_doc)rz   r   r5   header_classr   r   r   r   r   [  s   



zHttpRpc._handle_rpcutf8c                 C   s   |j d urd S |j|_ d S rE   )
out_stringr   )rz   r   out_string_encodingr   r   r   create_out_stringu  s   
zHttpRpc.create_out_stringc                 C   s   |  dv S )N)true1checkedon)lowerrz   rl   stringr   r   r   boolean_from_bytes{  s   zHttpRpc.boolean_from_bytesc                    s   |dkrd S t t| ||S )Nr   )ru   rn   integer_from_bytesr   r~   r   r   r   ~  s   zHttpRpc.integer_from_bytes)	NNNNTFTrq   FrE   )r   )__name__
__module____qualname____doc__r}   r   default_binary_encodingr   setr   r   addrv   r   r   propertyrx   r   r   r   r   r   r   r   r   r   r   r   __classcell__r   r   r~   r   rn      s6    



&
rn   z<([A-Za-z0-9_]+)>z{([A-Za-z0-9_]+)}s   <([A-Za-z0-9_]+)>s   {([A-Za-z0-9_]+)}c                   @   s   e Zd ZdZdZdZdZedd Zedd Z	ed	d
 Z
dddZdd Zedd Zejdd Zedd Zejdd Zedd Zejdd Zdd Zdd ZdS )HttpPatternzExperimental. Stay away.

    :param address: Address pattern
    :param verb: HTTP Verb pattern
    :param host: HTTP "Host:" header pattern
    r   r   latin1c                 C   sr   |du rdS t jst|t jsJ td|}td|}|| j}t	d|}t
d|}t|t|fS )z,where <> placeholders don't contain slashes.NNNz(?P<\1>[^/]*)s   (?P<\1>[^/]*))r   PY2r   	text_type_fragment_pattern_resub_full_pattern_rer   URL_ENCODING_fragment_pattern_b_re_full_pattern_b_rerecompile)rl   	pattern_spattern	pattern_br   r   r   _compile_url_pattern  s   z HttpPattern._compile_url_patternc                 C   s\   |du rdS t d|}td|}|| j}td|}td|}t|t|fS )z)where <> placeholders don't contain dots.Nr   z(?P<\1>[^\.]*)
(?P<\1>.*)s   (?P<\1>[^\.]*)
   (?P<\1>.*))	r   r   r   r   HOST_ENCODINGr   r   r   r   rl   r   r   r   r   r   _compile_host_pattern     z!HttpPattern._compile_host_patternc                 C   s\   |du rdS t d|}td|}|| j}td|}td|}t|t|fS )z*where <> placeholders are same as {} ones.Nr   r   r   )	r   r   r   r   VERB_ENCODINGr   r   r   r   r   r   r   r   _compile_verb_pattern  r   z!HttpPattern._compile_verb_patternNc                 C   sP   t |tr	t|n|}|| _|| _|| _|| _| jd ur$t | jts&J d S d S rE   )r   r'   r   addresshostverbendpointr   )rz   r   r   r   r  r   r   r   rv     s   
zHttpPattern.__init__c                 C   s   | j d u r|j| _ d S d S rE   )r   name)rz   r   r   r   r   hello  s   
zHttpPattern.helloc                 C   r   rE   )_HttpPattern__addressr   r   r   r   r        zHttpPattern.addressc                 C   s8   |d ur| dsd|}|| _| |\| _| _d S )N/z/{})
startswithformatr  r   
address_readdress_b_rerz   whatr   r   r   r     s   
c                 C   r   rE   )_HttpPattern__hostr   r   r   r   r     r  zHttpPattern.hostc                 C      || _ | |\| _| _d S rE   )r  r   host_re	host_b_rer  r   r   r   r        c                 C   r   rE   )_HttpPattern__verbr   r   r   r   r     r  zHttpPattern.verbc                 C   r  rE   )r  r   verb_re	verb_b_rer  r   r   r   r     r  c                 C   sX   ddl m} ddlm} d }| jd ur|| j}| j}|d u r!d}|| j|| jj|dS )Nr   )Rule)	invregexpz<__ignored>)r   r  methods)	werkzeug.routingr  spyne.util.invregexpr  r   r   r   r  r  )rz   r  r  r  r   r   r   r   as_werkzeug_rule  s   

zHttpPattern.as_werkzeug_rulec                 C   s,   d| j | j| j| jd u rd f S | jjf S )Nz6HttpPattern(address=%r, host=%r, verb=%r, endpoint=%r))r   r   r   r  r  r   r   r   r   __repr__  s   zHttpPattern.__repr__)NNNN)r   r   r   r   r   r   r   classmethodr   r   r   rv   r  r   r   setterr   r   r  r  r   r   r   r   r     s6    









r   )NT)4r   
__future__r   logging	getLoggerr   r   r   r^   r=   spyner   r   r   
spyne.utilr   r   r   spyne.util.sixr	   r
   spyne.errorr   spyne.model.binaryr   r   spyne.model.primitiver   spyne.protocol.dictdocr   TEMPORARY_DIRSTREAM_READ_BLOCK_SIZEr<   r   r   r!   joinr&   r   r/   r9   rF   ra   rd   rm   rn   r   r   r   r   objectr   r   r   r   r   <module>   sD   


	1
 
T


