B
    indB5                 @   s  U 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 d dlmZmZmZmZmZmZmZmZmZmZmZ d dlmZ ddlmZ ddlmZ dd	lmZmZm Z m!Z!m"Z" dd
l#m$Z$ ddl%m&Z&m'Z'm(Z( dZ)dZ*e&e+ e,d< erd dlm-Z- G dd de.Z/G dd de0ej1Z2eeeddddZ3e2j4ded ee2ddddZ5G dd dZ6ed Z7ee7ef Z8G dd dZ9G 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>ZAG d/d0 d0e;ZBerPd d1lmCZCmDZD eDeE ZFeCeE ZGnd d1lHmCZCmDZD eDZFeCZGG d2d3 d3e:ZIG d4d5 d5eIZJe9 ZKeKLe;eEeMeNf eKLe<e0 eKLe=ejO eKLe?ejP eKLe@ejQ eKLeAejRejSf eKLe>ejT eKLeJe$ eKjLeIeCe2jUd dS )6    N)ABCabstractmethod)chain)IOTYPE_CHECKINGAny
ByteStringDictIterableOptionalTextIOTupleTypeUnion)CIMultiDict   )hdrs)AbstractStreamWriter)PY_36content_disposition_headerguess_filenameparse_mimetypesentinel)StreamReader)FinalJSONEncoder_CIMultiDict)PAYLOAD_REGISTRYget_payloadpayload_typePayloadBytesPayloadStringPayloadIOBasePayloadBytesIOPayloadBufferedReaderPayloadTextIOPayloadStringIOPayloadJsonPayloadAsyncIterablePayloadi   TOO_LARGE_BYTES_BODY)Listc               @   s   e Zd ZdS )LookupErrorN)__name__
__module____qualname__ r0   r0   3/tmp/pip-unpacked-wheel-fdo6ttx3/aiohttp/payload.pyr,   <   s   r,   c               @   s   e Zd ZdZdZdZdS )Ordernormal	try_firsttry_lastN)r-   r.   r/   r3   r4   r5   r0   r0   r0   r1   r2   @   s   r2   r    )dataargskwargsreturnc             O   s   t j| f||S )N)r   get)r6   r7   r8   r0   r0   r1   r   F   s    r   )order)factorytyper;   r9   c            C   s   t j| ||d d S )N)r;   )r   register)r<   r=   r;   r0   r0   r1   register_payloadJ   s    r?   c               @   s>   e Zd ZejdeeddddZed ed ddd	ZdS )
r   )r;   N)r=   r;   r9   c            C   s   || _ || _d S )N)r=   r;   )selfr=   r;   r0   r0   r1   __init__Q   s    zpayload_type.__init__r    )r<   r9   c             C   s   t || j| jd |S )N)r;   )r?   r=   r;   )r@   r<   r0   r0   r1   __call__U   s    zpayload_type.__call__)	r-   r.   r/   r2   r3   r   rA   r   rB   r0   r0   r0   r1   r   P   s   r   c               @   sV   e Zd ZdZddddZedeededd	d
dZej	de
eeddddZdS )PayloadRegistryzZPayload registry.

    note: we need zope.interface for more efficient adapter search
    N)r9   c             C   s   g | _ g | _g | _d S )N)_first_normal_last)r@   r0   r0   r1   rA   d   s    zPayloadRegistry.__init__)_CHAINz!Type[chain[_PayloadRegistryItem]]r    )r6   r7   rG   r8   r9   c            O   sR   t |tr|S x8|| j| j| jD ]"\}}t ||r"||f||S q"W t d S )N)
isinstancer    rD   rE   rF   r,   )r@   r6   rG   r7   r8   r<   r=   r0   r0   r1   r:   i   s    

zPayloadRegistry.get)r;   )r<   r=   r;   r9   c            C   sf   |t jkr| j||f nF|t jkr8| j||f n*|t jkrT| j||f ntd|d S )NzUnsupported order )	r2   r4   rD   appendr3   rE   r5   rF   
ValueError)r@   r<   r=   r;   r0   r0   r1   r>   x   s    


zPayloadRegistry.register)r-   r.   r/   __doc__rA   r   r   r:   r2   r3   PayloadTyper>   r0   r0   r0   r1   rC   ^   s   	
rC   c            
   @   s   e Zd ZU dZeed< dZee ed< de	ddfe
eeeeeef eeeef  f  ee ee ee e
ddddZeee dd	d
Zeee dddZeedddZeedddZeee dddZeedddZdeeee
ddddZeeddddZdS )r    zapplication/octet-stream_default_content_typeN_size)valueheaderscontent_typefilenameencodingr8   r9   c             K   s   || _ || _t | _|| _|tk	r8|d k	r8|| jtj< nD| jd k	rnt	| jd }|d kr`| j
}|| jtj< n| j
| jtj< | j|pi  d S )Nr   )	_encoding	_filenamer   _headers_valuer   r   CONTENT_TYPE	mimetypes
guess_typerM   update)r@   rO   rP   rQ   rR   rS   r8   r0   r0   r1   rA      s    
zPayload.__init__)r9   c             C   s   | j S )zSize of the payload.)rN   )r@   r0   r0   r1   size   s    zPayload.sizec             C   s   | j S )zFilename of the payload.)rU   )r@   r0   r0   r1   rR      s    zPayload.filenamec             C   s   | j S )zCustom item headers)rV   )r@   r0   r0   r1   rP      s    zPayload.headersc             C   s$   d dd | j D dd S )N c             S   s    g | ]\}}|d  | d qS )z: z
r0   ).0kvr0   r0   r1   
<listcomp>   s    z+Payload._binary_headers.<locals>.<listcomp>zutf-8s   
)joinrP   itemsencode)r@   r0   r0   r1   _binary_headers   s    zPayload._binary_headersc             C   s   | j S )zPayload encoding)rT   )r@   r0   r0   r1   rS      s    zPayload.encodingc             C   s   | j tj S )zContent type)rV   r   rX   )r@   r0   r0   r1   rQ      s    zPayload.content_typeTutf-8)disptypequote_fields_charsetparamsr9   c             K   s"   t |f||d|| jtj< dS )z$Sets ``Content-Disposition`` header.)rh   ri   N)r   rV   r   CONTENT_DISPOSITION)r@   rg   rh   ri   rj   r0   r0   r1   set_content_disposition   s    zPayload.set_content_disposition)writerr9   c                s   dS )zLWrite payload.

        writer is an AbstractStreamWriter instance:
        Nr0   )r@   rm   r0   r0   r1   write   s    zPayload.write)Trf   )r-   r.   r/   rM   str__annotations__rN   r   intr   r   r   r   r	   r
   r   rA   propertyr\   rR   rP   bytesre   rS   rQ   boolrl   r   r   rn   r0   r0   r0   r1   r       s4   
< c                   s8   e Zd Zeeedd fddZeddddZ  ZS )r!   N)rO   r7   r8   r9   c                s   t |tttfs"tdt|d|kr2d|d< t j|f|| t |trZ|j| _	n
t
|| _	| j	tkrtr|d| i}ni }tjdtf| d S )Nz%value argument must be byte-ish, not rQ   zapplication/octet-streamsourcez}Sending a large body directly with raw bytes might lock the event loop. You should probably pass an io.BytesIO object instead)rH   rs   	bytearray
memoryview	TypeErrorr=   superrA   nbytesrN   lenr*   r   warningswarnResourceWarning)r@   rO   r7   r8   )	__class__r0   r1   rA      s     




zBytesPayload.__init__)rm   r9   c                s   | | jI d H  d S )N)rn   rW   )r@   rm   r0   r0   r1   rn      s    zBytesPayload.write)	r-   r.   r/   r   r   rA   r   rn   __classcell__r0   r0   )r   r1   r!      s   r!   c                   s<   e Zd Zdddeeee ee edd fddZ  ZS )r"   N)rS   rQ   )rO   r7   rS   rQ   r8   r9   c               sn   |d kr2|d krd}d}qFt |}|jdd}n|d krBd| }|}t j||f|||d| d S )Nzutf-8ztext/plain; charset=utf-8charsetztext/plain; charset=%s)rS   rQ   )r   
parametersr:   ry   rA   rd   )r@   rO   rS   rQ   r7   r8   Zreal_encodingmimetype)r   r0   r1   rA      s    	
zStringPayload.__init__)r-   r.   r/   ro   r   r   rA   r   r0   r0   )r   r1   r"      s   r"   c                   s,   e Zd Zee eedd fddZ  ZS )r'   N)rO   r7   r8   r9   c                s   t  j| f|| d S )N)ry   rA   read)r@   rO   r7   r8   )r   r0   r1   rA     s    zStringIOPayload.__init__)r-   r.   r/   r   ro   r   rA   r   r0   r0   )r   r1   r'     s   r'   c                   sN   e Zd ZU ee ed< d
ee eeedd fddZedddd	Z	  Z
S )r#   rW   
attachmentN)rO   dispositionr7   r8   r9   c                sZ   d|krt ||d< t j|f|| | jd k	rV|d k	rVtj| jkrV| j|| jd d S )NrR   )rR   )r   ry   rA   rU   r   rk   rP   rl   )r@   rO   r   r7   r8   )r   r0   r1   rA   !  s    zIOBasePayload.__init__)rm   r9   c          
      st   t  }zN|d | jjdI d H }x0|rR||I d H  |d | jjdI d H }q$W W d |d | jjI d H  X d S )Ni   )asyncioget_event_looprun_in_executorrW   r   rn   close)r@   rm   loopchunkr0   r0   r1   rn   -  s     zIOBasePayload.write)r   )r-   r.   r/   r   r   rp   ro   rA   r   rn   r   r0   r0   )r   r1   r#     s   

r#   c                   sl   e Zd ZU eed< dddeeee ee edd fddZe	ee
 ddd	Zedd
ddZ  ZS )r&   rW   N)rS   rQ   )rO   r7   rS   rQ   r8   r9   c               sd   |d kr2|d krd}d}qBt |}|jdd}n|d krBd| }t j|f|||d| d S )Nzutf-8ztext/plain; charset=utf-8r   ztext/plain; charset=%s)rQ   rS   )r   r   r:   ry   rA   )r@   rO   rS   rQ   r7   r8   r   )r   r0   r1   rA   ;  s    	zTextIOPayload.__init__)r9   c             C   s6   yt | j j| j  S  tk
r0   d S X d S )N)osfstatrW   filenost_sizetellOSError)r@   r0   r0   r1   r\   W  s    zTextIOPayload.size)rm   r9   c          
      s   t  }zj|d | jjdI d H }xL|rn| jr<|j| jdn| }||I d H  |d | jjdI d H }q$W W d |d | jjI d H  X d S )Ni   )rS   )	r   r   r   rW   r   rT   rd   rn   r   )r@   rm   r   r   r6   r0   r0   r1   rn   ^  s     zTextIOPayload.write)r-   r.   r/   r   rp   r   r   ro   rA   rr   rq   r\   r   rn   r   r0   r0   )r   r1   r&   8  s   
r&   c               @   s   e Zd ZeedddZdS )r$   )r9   c             C   s.   | j  }| j dtj}| j | || S )Nr   )rW   r   seekr   SEEK_END)r@   positionendr0   r0   r1   r\   o  s    
zBytesIOPayload.sizeN)r-   r.   r/   rr   rq   r\   r0   r0   r0   r1   r$   n  s   r$   c               @   s"   e Zd Zeee dddZdS )r%   )r9   c             C   s6   yt | j j| j  S  tk
r0   d S X d S )N)r   r   rW   r   r   r   r   )r@   r0   r0   r1   r\   x  s    zBufferedReaderPayload.sizeN)r-   r.   r/   rr   r   rq   r\   r0   r0   r0   r1   r%   w  s   r%   c            	       s8   e Zd Zddejfeeeeeedd fddZ  Z	S )r(   zutf-8zapplication/jsonN)rO   rS   rQ   dumpsr7   r8   r9   c                s,   t  j|||f|||d| d S )N)rQ   rS   )ry   rA   rd   )r@   rO   rS   rQ   r   r7   r8   )r   r0   r1   rA     s    
zJsonPayload.__init__)
r-   r.   r/   jsonr   r   ro   r   rA   r   r0   r0   )r   r1   r(     s   r(   )AsyncIterableAsyncIteratorc                   sJ   e Zd ZU dZee ed< eeedd fddZ	e
ddddZ  ZS )	r)   N_iter)rO   r7   r8   r9   c                sN   t |tstdt|d|kr,d|d< t j|f|| | | _d S )NzOvalue argument must support collections.abc.AsyncIterablebe interface, got {!r}rQ   zapplication/octet-stream)	rH   r   rx   formatr=   ry   rA   	__aiter__r   )r@   rO   r7   r8   )r   r0   r1   rA     s    
zAsyncIterablePayload.__init__)rm   r9   c                sP   | j rLy*x$| j  I d H }||I d H  q
W W n tk
rJ   d | _ Y nX d S )N)r   	__anext__rn   StopAsyncIteration)r@   rm   r   r0   r0   r1   rn     s    zAsyncIterablePayload.write)r-   r.   r/   r   r   _AsyncIteratorrp   _AsyncIterabler   rA   r   rn   r   r0   r0   )r   r1   r)     s   
r)   c                   s(   e Zd Zeeedd fddZ  ZS )StreamReaderPayloadN)rO   r7   r8   r9   c                s   t  j| f|| d S )N)ry   rA   Ziter_any)r@   rO   r7   r8   )r   r0   r1   rA     s    zStreamReaderPayload.__init__)r-   r.   r/   r   r   rA   r   r0   r0   )r   r1   r     s   r   )Vr   enumior   rY   r   r|   abcr   r   	itertoolsr   typingr   r   r   r   r	   r
   r   r   r   r   r   Z	multidictr   r]   r   r   Zhelpersr   r   r   r   r   Zstreamsr   Ztypedefsr   r   r   __all__r*   rq   rp   r+   	Exceptionr,   ro   Enumr2   r   r3   r?   r   rL   Z_PayloadRegistryItemrC   r    r!   r"   r'   r#   r&   r$   r%   r(   r   r   rs   r   r   collections.abcr)   r   r   r>   rv   rw   StringIO
TextIOBaseBytesIOBufferedReaderBufferedRandomIOBaser5   r0   r0   r0   r1   <module>   sr    4
'U 6	
