�
�(�gR- � �d � d Z ddlmZ ddlmZ G d� dej
� Z G d� d� Zd� Zy )
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.
� )�deque)�asyncorec � � e Zd ZdZdZdZdZdZdd�Zd� Z d� Z
d � Zd
� Zd� Z
d� Zd
� Zd� Zd� Zd� Zd� Zd� Zd� Zd� Zd� Zd� Zy)�
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 � � d| _ g | _ t � | _ t j
j
| ||� y �N� )�ac_in_buffer�incomingr �
producer_fifor �
dispatcher�__init__)�self�sock�maps �,/usr/lib/python3.12/test/support/asynchat.pyr zasync_chat.__init__J s7 � ����
��
� #�W������$�$�T�4��5r c � � t d� ��Nzmust be implemented in subclass��NotImplementedError�r �datas r �collect_incoming_dataz async_chat.collect_incoming_dataX � � �!�"C�D�Dr c �: � | j j |� y �N)r �appendr s r �_collect_incoming_dataz!async_chat._collect_incoming_data[ s � ��
�
���T�"r c �Z � dj | j � }| j d d �= |S r )�joinr )r �ds r � _get_datazasync_chat._get_data^ s% � ��H�H�T�]�]�#���M�M�!���r c � � t d� �r r �r s r �found_terminatorzasync_chat.found_terminatorc r r c �� � t |t � r*| j rt || j � }|| _ yt |t
� r|dk rt
d� �|| _ y)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 �terms r �set_terminatorzasync_chat.set_terminatorf sT � �
�d�C� �T�%6�%6���t�}�}�-�D� ��� ��c�
"�t�a�x��L�M�M���r c � � | j S r )r. r$ s r �get_terminatorzasync_chat.get_terminatorq s � ����r c � � | j | j � }t |t � r&| j rt t | j � }| j |z | _
| j �r�t | j � }| j � }|s$| j | j � d| _
�n�t |t � r�|}||k r8| j | j � d| _
| j |z
| _ �n4| j | j d | � | j |d | _
d| _ | j! � n�t |� }| j j# |� }|dk7 rK|dkD r| j | j d | � | j ||z d | _
| j! � ntt% | j |� }|r:||k7 r4| j | j d | � | j | d | _
y | j | j � d| _
| j r���y y # t $ r Y y t $ r | j � Y y w xY w)Nr r ���)�recv�ac_in_buffer_size�BlockingIOError�OSError�handle_errorr' |