Maybe I'm missing something simple, but the help for io.BytesIO.readinto says:
Returns number of bytes read (0 for EOF), or None if the object is set not to block and has no data to read.
and io.BytesIO.read says:
Return an empty bytes object at EOF.
That would seem to mean that if the _first_ internal readinto() of the
nonblocking self._wrapped returns None because no data is available, the caller
is tricked that EOF has been reached by returning an empty bytes object.