U e5d@,ã@sDdZddlZddlmZGdd„dejƒZGdd„dƒZdd „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ªeZdZdZdZdZdZdZd(dd„Zdd „Z d d „Z d d „Z dd„Z dd„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()irzlatin-1NcCs(d|_g|_tƒ|_tj |||¡dS©Nó)Ú ac_in_bufferÚincomingrÚ producer_fifoÚasyncoreÚ dispatcherÚ__init__)ÚselfZsockÚmap©rú /usr/lib64/python3.8/asynchat.pyr Cszasync_chat.__init__cCs tdƒ‚dS©Nzmust be implemented in subclass©ÚNotImplementedError©r ÚdatarrrÚcollect_incoming_dataQsz async_chat.collect_incoming_datacCs|j |¡dS©N)rÚappendrrrrÚ_collect_incoming_dataTsz!async_chat._collect_incoming_datacCsd |j¡}|jdd…=|Sr)Újoinr)r ÚdrrrÚ _get_dataWs  zasync_chat._get_datacCs tdƒ‚dSrr©r rrrÚfound_terminator\szasync_chat.found_terminatorcCsBt|tƒr|jrt||jƒ}nt|tƒr8|dkr8tdƒ‚||_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 ZtermrrrÚset_terminator_s zasync_chat.set_terminatorcCs|jSr)r%rrrrÚget_terminatorjszasync_chat.get_terminatorc CsØz| |j¡}WnDtk r&YdStk rT}z| ¡WY¢dSd}~XYnXt|tƒrr|jrrtt|j ƒ}|j ||_ |j �rÔt |j ƒ}|  ¡}|s°|  |j ¡d|_ q~t|tƒ�r|}||krè|  |j ¡d|_ |j||_n2|  |j d|…¡|j |d…|_ d|_| ¡q~t |ƒ}|j  |¡}|dk�rv|dk�rX|  |j d|…¡|j ||d…|_ | ¡q~t|j |ƒ}|�rÀ||k�rÔ|  |j d| …¡|j | d…|_ �qÔq~|  |j ¡d|_ q~dS)Nrréÿÿÿÿ)ZrecvÚac_in_buffer_sizeÚBlockingIOErrorÚOSErrorÚ handle_errorrrr r!r"rÚlenr'rr#r%rÚfindÚfind_prefix_at_end)r rZwhyZlbr%ÚnZterminator_lenÚindexrrrÚ handle_readrsR              zasync_chat.handle_readcCs | ¡dSr)Ú initiate_sendrrrrÚ handle_writeºszasync_chat.handle_writecCs | ¡dSr)ÚcloserrrrÚ handle_close½szasync_chat.handle_closecCsxt|tttfƒstdt|ƒƒ‚|j}t|ƒ|kr`tdt|ƒ|ƒD]}|j   ||||…¡q@n |j   |¡|  ¡dS)Nz#data argument must be byte-ish (%r)r) rr!Ú bytearrayÚ memoryviewÚ TypeErrorÚtypeÚac_out_buffer_sizer-Úrangerrr3)r rZsabsÚirrrÚpushÀsÿ  zasync_chat.pushcCs|j |¡| ¡dSr)rrr3)r ZproducerrrrÚpush_with_producerÌs zasync_chat.push_with_producercCsdS)z4predicate for inclusion in the readable for select()érrrrrÚreadableÐszasync_chat.readablecCs|jp |j S)z4predicate for inclusion in the writable for select())rÚ connectedrrrrÚwritableØszasync_chat.writablecCs|j d¡dS)zAautomatically close this channel once the outgoing queue is emptyN)rrrrrrÚclose_when_doneÜszasync_chat.close_when_donecCs|j�r|j�r|jd}|s:|jd=|dkr:| ¡dS|j}z|d|…}Wn:tk rŠ| ¡}|rz|j |¡n|jd=YqYnXt|tƒr¨|j r¨t ||j ƒ}z|  |¡}Wnt k rÔ| ¡YdSX|�r|t|ƒksö|t|ƒk�r ||d…|jd<n|jd=dSdS)Nr)rrBr6r;r9ÚmoreÚ appendleftrrr r!r"Úsendr+r,r-)r ÚfirstZobsrZnum_sentrrrr3às8   zasync_chat.initiate_sendcCs d|_|jdd…=|j ¡dSr)rrrÚclearrrrrÚdiscard_bufferss zasync_chat.discard_buffers)NN)Ú__name__Ú __module__Ú __qualname__Ú__doc__r)r;r r"r rrrrr&r'r2r4r6r>r?rArCrDr3rJrrrrr4s,  H (rc@seZdZddd„Zdd„ZdS)Úsimple_producerécCs||_||_dSr)rÚ buffer_size)r rrQrrrr szsimple_producer.__init__cCsJt|jƒ|jkr6|jd|j…}|j|jd…|_|S|j}d|_|SdSr)r-rrQ)r ÚresultrrrrEszsimple_producer.moreN)rP)rKrLrMr rErrrrrOs rOcCs0t|ƒd}|r,| |d|…¡s,|d8}q |S)Nr@)r-Úendswith)ZhaystackZneedleÚlrrrr//s  r/)rNr Ú collectionsrr rrOr/rrrrÚs  \