Martin Panter added the comment:

As I see it, if the client receives an early response (when 100-continue is not 
used) but needs to make more requests, the only choices are:

* Complete sending the request if possible, after which the connection may 
still be usable for a second request. But I’m not sure how many servers would 
support this; for your Microsoft server this would not be useful.

* Abort the connection and start a new one.

Perhaps the race condition would be more obvious if you sent the upload as a 
single 300 MiB bytes() object rather than a file. Then the sendall() call will 
be a 300 MiB chunk rather than 8 KiB. If the response is received after 
sendall() starts, I expect you will see the original two minute delay again. If 
this were plain TCP, you could replace sendall() with fine-grained select() and 
send() calls in a loop.

Here is a demonstration of the SSL renegotiation issue. I used separate client 
and server terminal windows. I don’t know if there is a way to force 
renegotiation purely in Python’s SSL module, so I used an external Open SSL 
server.

1: In the server window, start an SSL server on port 4433:
$ openssl s_server -cert Lib/test/keycert.pem 

2: In the client window, start a request in the Python interpreter. It will 
pause to read stdin:
>>> import http.client, ssl, sys
>>> context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
>>> context.load_verify_locations("/usr/lib/python3.5/test/keycert.pem")
>>> conn = http.client.HTTPSConnection('localhost', 4433, context=context)
>>> conn.request("PUT", "/", headers={"Content-Length": "4"}, 
>>> body=sys.stdin.buffer)

3: In the server, the request header is received. Type lowercase “r” to force a 
renegotiation:
Secure Renegotiation IS supported
PUT / HTTP/1.1
Host: localhost:4433
Accept-Encoding: identity
Content-Length: 8

r
SSL_do_handshake -> 1

4: In Python, type in upload data and repeat Ctrl+D to signal EOF until the 
request() call stops reading from stdin and you get the Python prompt back:
abc  <== 3 letters + newline + Ctrl+D
>>> 

5: Notice that the no body has been uploaded to the server.

----------

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

Reply via email to