Your IP : 3.147.66.224
3
� f@, � @ sD d Z ddlZddlmZ G dd� dej�ZG dd� d�Zdd � ZdS )
a� A class supporting chat-style (command/response) protocols.
This class adds support for 'chat' style protocols - where one side
sends a 'command', and the other sends a response (examples would be
the common internet protocols - smtp, nntp, ftp, etc..).
The handle_read() method looks at the input stream for the current
'terminator' (usually '\r\n' for single-line responses, '\r\n.\r\n'
for multi-line output), calling self.found_terminator() on its
receipt.
for example:
Say you build an async nntp client using this class. At the start
of the connection, you'll have self.terminator set to '\r\n', in
order to process the single-line greeting. Just before issuing a
'LIST' command you'll set it to '\r\n.\r\n'. The output of the LIST
command will be accumulated (using your own 'collect_incoming_data'
method) up to the terminator, and then control will be returned to
you - by calling your self.found_terminator() method.
� N)�dequec @ s� e Zd ZdZdZdZdZdZd(dd�Zdd � Z d
d� Z
dd
� Zdd� Zdd� Z
dd� Zdd� Zdd� Zdd� Zdd� Zdd� Zdd� Zd d!� Zd"d#� Zd$d%� Zd&d'� ZdS ))�
async_chatz�This is an abstract class. You must derive from this class, and add
the two methods collect_incoming_data() and found_terminator()i r zlatin-1Nc C s( d| _ g | _t� | _tjj| ||� d S )N� )�ac_in_buffer�incomingr �
producer_fifo�asyncore�
dispatcher�__init__)�selfZsock�map� r
�-/opt/alt/python36/lib64/python3.6/asynchat.pyr
C s zasync_chat.__init__c C s t d��d S )Nzmust be implemented in subclass)�NotImplementedError)r �datar
r
r �collect_incoming_dataQ s z async_chat.collect_incoming_datac C s | j j|� d S )N)r �append)r r r
r
r �_collect_incoming_dataT s z!async_chat._collect_incoming_datac C s dj | j�}| jd d �= |S )Nr )�joinr )r �dr
r
r � _get_dataW s zasync_chat._get_datac C s t d��d S )Nzmust be implemented in subclass)r )r r
r
r �found_terminator\ s zasync_chat.found_terminatorc C sB t |t�r| jrt|| j�}nt |t�r8|dk r8td��|| _dS )zdSet the input delimiter.
Can be a fixed string of any length, an integer, or None.
r z-the number of received bytes must be positiveN)�
isinstance�str�use_encoding�bytes�encoding�int�
ValueError�
terminator)r Ztermr
r
r �set_terminator_ s
zasync_chat.set_terminatorc C s | j S )N)r )r r
r
r �get_terminatorj s zasync_chat.get_terminatorc C s� y| j | j�}W n: tk
r$ d S tk
rJ } z| j� d S d }~X nX t|t�rh| jrhtt| j �}| j
| | _
�xV| j
�r�t| j
�}| j� }|s�| j
| j
� d| _
qxt|t��r|}||k r�| j
| j
� d| _
| j| | _n2| j
| j
d |� � | j
|d � | _
d| _| j� qxt|�}| j
j|�}|dk�rp|dk�rR| j
| j
d |� � | j
|| d � | _
| j� qxt| j
|�}|�r�||k�r�| j
| j
d | � � | j
| d � | _
P qx| j
| j
� d| _
qxW d S )Nr r � ���)Zrecv�ac_in_buffer_size�BlockingIOError�OSError�handle_errorr r r r r r �lenr! r r r r �find�find_prefix_at_end)r r ZwhyZlbr �nZterminator_len�indexr
r
r �handle_readr sR
zasync_chat.handle_readc C s | j � d S )N)�
initiate_send)r r
r
r �handle_write� s zasync_chat.handle_writec C s | j � d S )N)�close)r r
r
r �handle_close� s zasync_chat.handle_closec C s| t |tttf�stdt|���| j}t|�|krdx>tdt|�|�D ]}| j j
|||| � � qBW n| j j
|� | j� d S )Nz#data argument must be byte-ish (%r)r )r r � bytearray�
memoryview� TypeError�type�ac_out_buffer_sizer( �ranger r r. )r r Zsabs�ir
r
r �push� s
zasync_chat.pushc C s | j j|� | j� d S )N)r r r. )r Zproducerr
r
r �push_with_producer� s zasync_chat.push_with_producerc C s dS )z4predicate for inclusion in the readable for select()r"