mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
bpo-31945: Configurable blocksize in HTTP(S)Connection (#4279)
blocksize was hardcoded to 8192, preventing efficient upload when using file-like body. Add blocksize argument to __init__, so users can configure the blocksize to fit their needs. I tested this uploading data from /dev/zero to a web server dropping the received data, to test the overhead of the HTTPConnection.send() with a file-like object. Here is an example 10g upload with the default buffer size (8192): $ time ~/src/cpython/release/python upload-httplib.py 10 https://localhost:8000/ Uploaded 10.00g in 17.53 seconds (584.00m/s) real 0m17.574s user 0m8.887s sys 0m5.971s Same with 512k blocksize: $ time ~/src/cpython/release/python upload-httplib.py 10 https://localhost:8000/ Uploaded 10.00g in 6.60 seconds (1551.15m/s) real 0m6.641s user 0m3.426s sys 0m2.162s In real world usage the difference will be smaller, depending on the local and remote storage and the network. See https://github.com/nirs/http-bench for more info.
This commit is contained in:
parent
30f4fa456e
commit
ad455cd924
5 changed files with 56 additions and 9 deletions
|
@ -756,6 +756,29 @@ class BasicTest(TestCase):
|
|||
conn.request('GET', '/foo', body(), {'Content-Length': '11'})
|
||||
self.assertEqual(sock.data, expected)
|
||||
|
||||
def test_blocksize_request(self):
|
||||
"""Check that request() respects the configured block size."""
|
||||
blocksize = 8 # For easy debugging.
|
||||
conn = client.HTTPConnection('example.com', blocksize=blocksize)
|
||||
sock = FakeSocket(None)
|
||||
conn.sock = sock
|
||||
expected = b"a" * blocksize + b"b"
|
||||
conn.request("PUT", "/", io.BytesIO(expected), {"Content-Length": "9"})
|
||||
self.assertEqual(sock.sendall_calls, 3)
|
||||
body = sock.data.split(b"\r\n\r\n", 1)[1]
|
||||
self.assertEqual(body, expected)
|
||||
|
||||
def test_blocksize_send(self):
|
||||
"""Check that send() respects the configured block size."""
|
||||
blocksize = 8 # For easy debugging.
|
||||
conn = client.HTTPConnection('example.com', blocksize=blocksize)
|
||||
sock = FakeSocket(None)
|
||||
conn.sock = sock
|
||||
expected = b"a" * blocksize + b"b"
|
||||
conn.send(io.BytesIO(expected))
|
||||
self.assertEqual(sock.sendall_calls, 2)
|
||||
self.assertEqual(sock.data, expected)
|
||||
|
||||
def test_send_type_error(self):
|
||||
# See: Issue #12676
|
||||
conn = client.HTTPConnection('example.com')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue