o 0¦i - ã @ s^ d Z ddlZddlmZ ddlmZ ededd� G dd „ d ejƒZG d d„ dƒZ 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(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ƒ | _tj | ||¡ d S ©Nó )Úac_in_bufferÚincomingr Ú producer_fifoÚasyncoreÚ dispatcherÚ__init__)ÚselfZsockÚmap© r ú//opt/alt/python310/lib64/python3.10/asynchat.pyr K s zasync_chat.__init__c C ó t dƒ‚©Nzmust be implemented in subclass©ÚNotImplementedError©r Ú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 |tƒr| jrt|| jƒ}n t |tƒr|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)Ú isinstanceÚstrÚuse_encodingÚbytesÚencodingÚintÚ ValueErrorÚ terminator)r Ztermr 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|tƒr.| jr.tt| j ƒ}| j | | _ | j rÜt| j ƒ}| ¡ }|sL| | j ¡ d| _ n‹t|tƒr�|}||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 éÿÿÿÿ)ZrecvÚac_in_buffer_sizeÚBlockingIOErrorÚOSErrorÚhandle_errorr# r$ r% r&