This module builds on the asyncore infrastructure, simplifying
asynchronous clients and servers and making it easier to handle protocols
whose elements are terminated by arbitrary strings, or are of variable length.
asynchat defines the abstract class async_chat that you
subclass, providing implementations of the collect_incoming_data() and
found_terminator() methods. It uses the same asynchronous loop as
asyncore, and the two types of channel, asyncore.dispatcher
and asynchat.async_chat, can freely be mixed in the channel map.
Typically an asyncore.dispatcher server channel generates new
asynchat.async_chat channel objects as it receives incoming
connection requests.

Like asyncore.dispatcher, async_chat defines a set of
events that are generated by an analysis of socket conditions after a
select() call. Once the polling loop has been started the
async_chat object’s methods are called by the event-processing
framework with no action on the part of the programmer.

Two class attributes can be modified, to improve performance, or possibly
even to conserve memory.

Unlike asyncore.dispatcher, async_chat allows you to
define a first-in-first-out queue (fifo) of producers. A producer need
have only one method, more(), which should return data to be
transmitted on the channel.
The producer indicates exhaustion (i.e. that it contains no more data) by
having its more() method return the empty bytes object. At this point
the async_chat object removes the producer from the fifo and starts
using the next producer, if any. When the producer fifo is empty the
handle_write() method does nothing. You use the channel object’s
set_terminator() method to describe how to recognize the end of, or
an important breakpoint in, an incoming transmission from the remote
endpoint.

Called when the incoming data stream matches the termination condition set
by set_terminator(). The default method, which must be overridden,
raises a NotImplementedError exception. The buffered input data
should be available via an instance attribute.

Pushes data on to the channel’s fifo to ensure its transmission.
This is all you need to do to have the channel write the data out to the
network, although it is possible to use your own producers in more complex
schemes to implement encryption and chunking, for example.

Takes a producer object and adds it to the producer fifo associated with
the channel. When all currently-pushed producers have been exhausted the
channel will consume this producer’s data by calling its more()
method and send the data to the remote endpoint.

A fifo holding data which has been pushed by the application but
not yet popped for writing to the channel. A fifo is a list used
to hold data and/or producers until they are required. If the list
argument is provided then it should contain producers or data items to be
written to the channel.

The following partial example shows how HTTP requests can be read with
async_chat. A web server might create an
http_request_handler object for each incoming client connection.
Notice that initially the channel terminator is set to match the blank line at
the end of the HTTP headers, and a flag indicates that the headers are being
read.

Once the headers have been read, if the request is of type POST (indicating
that further data are present in the input stream) then the
Content-Length: header is used to set a numeric terminator to read the
right amount of data from the channel.

The handle_request() method is called once all relevant input has been
marshalled, after setting the channel terminator to None to ensure that
any extraneous data sent by the web client are ignored.