File: //usr/lib/python3.7/__pycache__/asynchat.cpython-37.pyc
B
{a@, @ sD d Z ddlZddlmZ G dd dejZG dd dZdd 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(ddZdd 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_chatzThis 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 | _tj| || d S )N )ac_in_bufferincomingr
producer_fifoasyncore
dispatcher__init__)selfZsockmap r
/usr/lib/python3.7/asynchat.pyr
C s zasync_chat.__init__c C s t dd S )Nzmust be implemented in subclass)NotImplementedError)r datar
r
r collect_incoming_dataQ s z async_chat.collect_incoming_datac C s | j | d S )N)r append)r r r
r
r _collect_incoming_dataT s z!async_chat._collect_incoming_datac C s d | j}| jd d = |S )Nr )joinr )r dr
r
r _get_dataW s zasync_chat._get_datac C s t dd S )Nzmust be implemented in subclass)r )r r
r
r found_terminator\ s zasync_chat.found_terminatorc C sB t |tr| jrt|| j}nt |tr8|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)
isinstancestruse_encodingbytesencodingint
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}W n< tk
r$ d S tk
rL } z| d S d }~X Y nX t|trj| jrjtt| j }| j
| | _
xV| j
rt| j
}| }|s|
| j
d| _
qzt|tr|}||k r|
| j
d| _
| j| | _n2|
| j
d | | j
|d | _
d| _| qzt|}| j
|}|dkrr|dkrT|
| j
d | | j
|| d | _
| qzt| j
|}|r||kr|
| j
d | | j
| d | _
P qz|
| j
d| _
qzW d S )Nr r )Zrecvac_in_buffer_sizeBlockingIOErrorOSErrorhandle_errorr r r r r r lenr! r r r r findfind_prefix_at_end)r r ZwhyZlbr nZterminator_lenindexr
r
r handle_readr sR
zasync_chat.handle_readc C s | d S )N)
initiate_send)r r
r
r handle_write s zasync_chat.handle_writec C s | d S )N)close)r r
r
r handle_close s zasync_chat.handle_closec C s| t |tttfstdt|| j}t||krdx>tdt||D ]}| j
|||| qBW n| j
| | d S )Nz#data argument must be byte-ish (%r)r )r r bytearray
memoryview TypeErrortypeac_out_buffer_sizer' ranger r r- )r r Zsabsir
r
r push s
zasync_chat.pushc C s | 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
)r r
r
r readable s zasync_chat.readablec C s | j p| j S )z4predicate for inclusion in the writable for select())r connected)r r
r
r writable s zasync_chat.writablec C s | j d dS )zAautomatically close this channel once the outgoing queue is emptyN)r r )r r
r
r close_when_done s zasync_chat.close_when_donec C s x| j r| jr| j d }|s>| j d= |d kr>| d S | j}y|d | }W n8 tk
r | }|r~| j | n| j d= wY nX t|tr| j rt
|| j}y| |}W n t
k
r | d S X |r|t|k s|t|k r
||d | j d<