vsbogd <vsb...@gmail.com> added the comment:

Analysis:

self.rfile.read(nbytes)

https://github.com/python/cpython/blob/3a1d50e7e573efb577714146bed5c03b9c95f466/Lib/http/server.py#L1207

Doesn't read full content of the file but only first chunk because self.rfile 
is not BufferedIO instance. In fact it is SocketIO instance. The reason is that 
CGIHTTPServer sets rbufsize to 0:

    # Make rfile unbuffered -- we need to read one line and then pass
    # the rest to a subprocess, so we can't use buffered input.
    rbufsize = 0

https://github.com/python/cpython/blob/3a1d50e7e573efb577714146bed5c03b9c95f466/Lib/http/server.py#L975-L977

So the minimal fix is to set rbufsize back to -1 again. This fix requires one 
more change, because code below:

            # throw away additional data [see bug #427345]
            while select.select([self.rfile._sock], [], [], 0)[0]:
                if not self.rfile._sock.recv(1):
                    break

https://github.com/python/cpython/blob/3a1d50e7e573efb577714146bed5c03b9c95f466/Lib/http/server.py#L1210-L1213

expects self.rfile instance to be SocketIO. 

This could be fixed by replacing this code by:


So the minimal fix is to set rbufsize back to -1 again. This fix requires one 
more change, because code below:

            # throw away additional data [see bug #427345]
            while select.select([self.rfile], [], [], 0)[0]:
                if not self.rfile.read(1):
                    break

like it is implemented in another branch of the condition check:

https://github.com/python/cpython/blob/3a1d50e7e573efb577714146bed5c03b9c95f466/Lib/http/server.py#L1163-L1166

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue37301>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to