Skip to content

Commit a74e818

Browse files
Fix server disconnect when error after 100-continue (#8876) (#8899)
(cherry picked from commit e058cbd)
1 parent 275985c commit a74e818

3 files changed

Lines changed: 18 additions & 1 deletion

File tree

CHANGES/8876.bugfix.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fixed error handling after 100-continue so server sends 500 response instead of disconnecting -- by :user:`Dreamsorcerer`.

aiohttp/web_urldispatcher.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,8 @@ async def _default_expect_handler(request: Request) -> None:
341341
if request.version == HttpVersion11:
342342
if expect.lower() == "100-continue":
343343
await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n")
344+
# Reset output_size as we haven't started the main body yet.
345+
request.writer.output_size = 0
344346
else:
345347
raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect)
346348

tests/test_web_functional.py

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import pathlib
55
import socket
66
import zlib
7-
from typing import Any, Optional
7+
from typing import Any, NoReturn, Optional
88
from unittest import mock
99

1010
import pytest
@@ -121,6 +121,20 @@ async def handler(request):
121121
assert resp.status == 500
122122

123123

124+
async def test_handler_returns_not_response_after_100expect(
125+
aiohttp_server, aiohttp_client
126+
) -> None:
127+
async def handler(request: web.Request) -> NoReturn:
128+
raise Exception("foo")
129+
130+
app = web.Application()
131+
app.router.add_get("/", handler)
132+
client = await aiohttp_client(app)
133+
134+
async with client.get("/", expect100=True) as resp:
135+
assert resp.status == 500
136+
137+
124138
async def test_head_returns_empty_body(aiohttp_client) -> None:
125139
async def handler(request):
126140
return web.Response(body=b"test")

0 commit comments

Comments
 (0)