� !A?h2-���dZddlZddlmZddlmZdZeeed���Gd�d ej��Z Gd �d ��Z d �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)� _deprecatedznThe {name} module is deprecated and will be removed in Python {remove}. The recommended replacement is asyncio)�� )�removec��eZdZdZdZdZdZdZdd�Zd�Z d�Z d �Z d �Z d �Z d �Zd �Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�Zd�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()irzlatin-1Nc��d|_g|_t��|_tj�|||��dS�N�)� ac_in_buffer�incomingr� producer_fifo�asyncore� dispatcher�__init__)�self�sock�maps �5/opt/alt/python-internal/lib64/python3.11/asynchat.pyrzasync_chat.__init__JsB����� �� �#�W�W�����$�$�T�4��5�5�5�5�5r c� �td����Nzmust be implemented in subclass��NotImplementedError�r�datas r�collect_incoming_dataz async_chat.collect_incoming_dataX���!�"C�D�D�Dr c�:�|j�|��dS�N)r�appendrs r�_collect_incoming_dataz!async_chat._collect_incoming_data[s�� � ���T�"�"�"�"�"r c�N�d�|j��}|jdd�=|Sr )�joinr)r�ds r� _get_datazasync_chat._get_data^s(�� �H�H�T�]� #� #�� �M�!�!�!� ��r c� �td���rr�rs r�found_terminatorzasync_chat.found_terminatorcrr c���t|t��r|jrt||j��}n*t|t ��r|dkrt d���||_dS)zdSet the input delimiter. Can be a fixed string of any length, an integer, or None. rz-the number of received bytes must be positiveN)� isinstance�str� use_encoding�bytes�encoding�int� ValueError� terminator)r�terms r�set_terminatorzasync_chat.set_terminatorfsj�� �d�C� � � N�T�%6� N���t�}�-�-�D�D� ��c� "� "� N�t�a�x�x��L�M�M� M�����r c��|jSr )r2r(s r�get_terminatorzasync_chat.get_terminatorqs ����r c� � |�|j��}n1#t$rYdSt$r|���YdSwxYwt |t ��r!|jrtt |j ��}|j |z|_ |j �r�t|j ��}|� ��}|s#|� |j ��d|_ �n�t |t��r�|}||kr2|� |j ��d|_ |j|z |_�nM|� |j d|���|j |d�|_ d|_|���n�t|��}|j �|��}|dkrT|dkr"|� |j d|���|j ||zd�|_ |���nxt%|j |��}|r@||kr8|� |j d| ���|j | d�|_ dS|� |j ��d|_ |j ���dSdS)Nr r�����)�recv�ac_in_buffer_size�BlockingIOError�OSError� handle_errorr+r,r-r.r/r �lenr6rr0r2r)�find�find_prefix_at_end)rr�lbr2�n�terminator_len�indexs r� handle_readzasync_chat.handle_readys��� ��9�9�T�3�4�4�D�D��� � � � �F�F�� � � � � � � � � � �F�F� ���� �d�C� � � -�T�%6� -���d�m�,�,�D� �-��4�����3 0��T�&�'�'�B��,�,�.�.�J��0 0��*�*�4�+<�=�=�=�$'��!�!��J��,�,�, 0�����6�6��.�.�t�/@�A�A�A�(+�D�%�&*�o��&:�D�O�O��.�.�t�/@��!��/D�E�E�E�(,�(9�!�"�"�(=�D�%�&'�D�O��)�)�+�+�+�+�"%�Z�����)�.�.�z�:�:���B�;�;��q�y�y��2�2�4�3D�V�e�V�3L�M�M�M�(,�(9�%��:N�:O�:O�(P�D�%��)�)�+�+�+�+�/�t�/@�*�M�M�E�� 0� �B�;�;� �6�6�t�7H��5�&��7Q�R�R�R�04�0A�5�&�'�'�0J�D�-����2�2�4�3D�E�E�E�,/��)�g��3 0�3 0�3 0�3 0�3 0s�� A �A � A c�.�|���dSr )� initiate_sendr(s r� handle_writezasync_chat.handle_write�s�� �������r c�.�|���dSr )�closer(s r� handle_closezasync_chat.handle_close�s�� � � � � � � � r c��t|tttf��st dt |�����|j}t|��|krGtdt|��|��D]'}|j � ||||z����(n|j � |��|� ��dS)Nz#data argument must be byte-ish (%r)r) r+r.� bytearray� memoryview� TypeError�type�ac_out_buffer_sizer>�rangerr!rG)rr�sabs�is r�pushzasync_chat.push�s����$�� �:� >�?�?� (��A� ��J�J�(�(� (��&�� �t�9�9�t� � ��1�c�$�i�i��.�.� :� :���"�)�)�$�q��4��x�.�9�9�9�9� :� � � %� %�d� +� +� +� �������r c�b�|j�|��|���dSr )rr!rG)r�producers r�push_with_producerzasync_chat.push_with_producer�s1�� ��!�!�(�+�+�+� �������r c��dS)z4predicate for inclusion in the readable for select()��r(s r�readablezasync_chat.readable�s �� �qr c� �|jp|j S)z4predicate for inclusion in the writable for select())r� connectedr(s r�writablezasync_chat.writable�s���!�9�$�.�&8�9r c�:�|j�d��dS)zAautomatically close this channel once the outgoing queue is emptyN)rr!r(s r�close_when_donezasync_chat.close_when_done�s�� ��!�!�$�'�'�'�'�'r c��|j�rE|j�r?|jd}|s |jd=|�|���dS|j} |d|�}nI#t$r<|���}|r|j�|��n|jd=Y��wxYwt|t��r|j rt||j ��} |� |��}n%#t$r|���YdSwxYw|rA|t|��ks|t|��kr||d�|jd<n|jd=dSdSdS)Nr)rr^rKrQrO�more� appendleftr+r,r-r.r/�sendr<r=r>)r�first�obsr�num_sents rrGzasync_chat.initiate_send�s���� �% �T�^�% ��&�q�)�E�� ��&�q�)��=��%�%�'�'�'��F��)�C� ��T�c�T�{����� � � ��z�z�|�|���.��&�1�1�$�7�7�7�7��*�1�-���  �����$��$�$� 2��):� 2��T�4�=�1�1�� ��9�9�T�?�?����� � � ��!�!�#�#�#���� ����� .��c�$�i�i�'�'�3��U���+;�+;�,1�(�)�)�,<�D�&�q�)�)��*�1�-� �F�K% �% �% �% s%� A�AB�B�C$�$D�Dc�Z�d|_|jdd�=|j���dSr )r rr�clearr(s r�discard_bufferszasync_chat.discard_bufferss3����� �M�!�!�!� � �� � �"�"�"�"�"r )NN)�__name__� __module__� __qualname__�__doc__r:rQr-r/rrr"r&r)r4r6rErHrKrUrXr\r_rarGrkr[r rr r ;sI������F�F� ���� �L��H� 6� 6� 6� 6�E�E�E�#�#�#���� E�E�E� � � ����F0�F0�F0�P������ � � �������:�:�:�(�(�(�&�&�&�P#�#�#�#�#r r c��eZdZdd�Zd�ZdS)�simple_producer�c�"�||_||_dSr )r� buffer_size)rrrts rrzsimple_producer.__init__s���� �&����r c��t|j��|jkr/|jd|j�}|j|jd�|_|S|j}d|_|Sr )r>rrt)r�results rrczsimple_producer.mores\�� �t�y�>�>�D�,� ,� ,��Y�0�� 0�0�1�F�� �$�"2�"3�"3�4�D�I��M��Y�F��D�I��Mr N)rr)rlrmrnrrcr[r rrqrqs7������'�'�'�'�����r rqc��t|��dz }|rA|�|d|���s$|dz}|r|�|d|����$|S)NrZ)r>�endswith)�haystack�needle�ls rr@r@6sk�� �F� � �a��A� ��H�%�%�f�R�a�R�j�1�1�� �Q��� ��H�%�%�f�R�a�R�j�1�1�� �Hr ) ror� collectionsr�warningsr�_DEPRECATION_MSGrlrr rqr@r[r r�rs���8��(���������� � � � � � �N�� � �H�&�w�7�7�7�7�X#�X#�X#�X#�X#��$�X#�X#�X#�v��������@ � � � � r