o
    4˜Žj±  ã                   @   s    d 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	 ddl
mZmZ dZG d	d
„ d
ƒZG dd„ dƒZeeƒG dd„ deƒƒZeeƒG dd„ deƒƒZdS )am  
Payload implementation for coroutines as data provider.

As a simple case, you can upload data from file::

   @aiohttp.streamer
   async def file_sender(writer, file_name=None):
      with open(file_name, 'rb') as f:
          chunk = f.read(2**16)
          while chunk:
              await writer.write(chunk)

              chunk = f.read(2**16)

Then you can use `file_sender` like this:

    async with session.post('http://httpbin.org/post',
                            data=file_sender(file_name='huge_file')) as resp:
        print(await resp.text())

..note:: Coroutine must accept `writer` as first argument

é    N)Ú	AwaitableÚCallable)ÚAnyé   )ÚAbstractStreamWriter)ÚPayloadÚpayload_type)Ústreamerc                   @   sT   e Zd Zdeded f deedf deeef ddfdd„Z	d	e
ddfd
d„ZdS )Ú_stream_wrapperÚcoro.NÚargsÚkwargsÚreturnc                 C   s   t  |¡| _|| _|| _d S ©N)ÚtypesÚ	coroutiner   r   r   )Úselfr   r   r   © r   úU/var/www/kodo/Anonymous/send/lib/python3.10/site-packages/aiohttp/payload_streamer.pyÚ__init__%   s   
z_stream_wrapper.__init__Úwriterc                 Ã   s(   �| j |g| j¢R i | j¤ŽI d H  d S r   )r   r   r   ©r   r   r   r   r   Ú__call__/   s   €&z_stream_wrapper.__call__)Ú__name__Ú
__module__Ú__qualname__r   r   Útupler   ÚdictÚstrr   r   r   r   r   r   r   r
   $   s    þ
ý
ü
û
r
   c                   @   s@   e Zd Zdeded f ddfdd„Zdededefd	d
„ZdS )r	   r   .Nr   c                 C   s   t jdtdd� || _d S )Nz5@streamer is deprecated, use async generators insteadé   )Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningr   )r   r   r   r   r   r   4   s   ý
zstreamer.__init__r   r   c                 O   s   t | j||ƒS r   )r
   r   )r   r   r   r   r   r   r   <   s   zstreamer.__call__)	r   r   r   r   r   r   r   r
   r   r   r   r   r   r	   3   s    r	   c                   @   s6   e Zd Zdeddfdd„Zdded	edefd
d„ZdS )ÚStreamWrapperPayloadr   r   Nc                 Ã   ó   �|   |¡I d H  d S r   ©Ú_valuer   r   r   r   ÚwriteB   ó   €zStreamWrapperPayload.writeúutf-8ÚstrictÚencodingÚerrorsc                 C   s   t dƒ‚)NzUnable to decode.)Ú	TypeError)r   r,   r-   r   r   r   ÚdecodeE   s   zStreamWrapperPayload.decode)r*   r+   )r   r   r   r   r(   r   r/   r   r   r   r   r$   @   s    r$   c                       s@   e Zd Zdedededdf‡ fdd„Zdeddfd	d
„Z‡  ZS )ÚStreamPayloadÚvaluer   r   r   Nc                    s    t ƒ j|ƒ g|¢R i |¤Ž d S r   )Úsuperr   )r   r1   r   r   ©Ú	__class__r   r   r   K   s    zStreamPayload.__init__r   c                 Ã   r%   r   r&   r   r   r   r   r(   N   r)   zStreamPayload.write)r   r   r   r   r   r   r(   Ú__classcell__r   r   r3   r   r0   I   s    r0   )Ú__doc__r   r!   Úcollections.abcr   r   Útypingr   Úabcr   Úpayloadr   r   Ú__all__r
   r	   r$   r0   r   r   r   r   Ú<module>   s    