o
9j - @ s^ d Z ddlZddlmZ ddlmZ ededd G dd d ejZG d
d dZ dd
Z
dS )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)deque)warnzlThe asynchat module is deprecated and will be removed in Python 3.12. The recommended replacement is asyncio )
stacklevelc @ 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__)selfsockmap r /usr/lib/python3.10/asynchat.pyr K s zasync_chat.__init__c C t dNzmust be implemented in subclassNotImplementedErrorr datar r r collect_incoming_dataY z async_chat.collect_incoming_datac C s | j | d S N)r
appendr r r r _collect_incoming_data\ s z!async_chat._collect_incoming_datac C s d | j}| jd d = |S r )joinr
)r dr r r _get_data_ s zasync_chat._get_datac C r r r r r r r found_terminatord r zasync_chat.found_terminatorc C sB t |tr| jrt|| j}n
t |tr|dk rtd|| _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 termr r r set_terminatorg s
zasync_chat.set_terminatorc C s | j S r )r+ r" r r r get_terminatorr s zasync_chat.get_terminatorc C s z| | j}W n ty Y d S ty | Y d S w t|tr.| jr.tt| j }| j
| | _
| j
rt| j
}| }|sL|
| j
d| _
nt|tr|}||k rg|
| j
d| _
| j| | _np|
| j
d | | j
|d | _
d| _| nVt|}| j
|}|dkr|dkr|
| j
d | | j
|| d | _
| n+t| j
|}|r||kr|
| j
d | | j
| d | _
d S |
| j
d| _
| j
s7d S d S )Nr r )recvac_in_buffer_sizeBlockingIOErrorOSErrorhandle_errorr$ r% r&