Skip to content

Commit 31f38dd

Browse files
committed
Http: Stop reading data from socket stream before sending response
1 parent ac94af4 commit 31f38dd

File tree

2 files changed

+9
-10
lines changed

2 files changed

+9
-10
lines changed

Libraries/Http/HttpAsyncServer.cpp

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -130,8 +130,12 @@ void HttpAsyncServer::onStreamReceive(HttpServerClient& client, AsyncBufferView:
130130

131131
if (client.response.mustBeFlushed())
132132
{
133-
auto onAfterWrite = [this, &client](AsyncBufferView::ID) { closeAsync(client); };
134-
SC_TRUST_RESULT(client.writableStream->write(client.response.getSpan(), onAfterWrite));
133+
client.readableSocketStream.destroy(); // emits 'eventClose' cancelling pending reads
134+
client.readableSocketStream.eventData = {}; // De-register data event
135+
136+
auto onAfterWrite = [this, &client](AsyncBufferView::ID) { closeAsync(client); };
137+
Result res = client.writableStream->write(client.response.getSpan(), onAfterWrite);
138+
SC_TRUST_RESULT(res);
135139
client.writableStream->end(); // TODO: This must be called only if actually ended...
136140
}
137141
}
@@ -195,12 +199,7 @@ void HttpAsyncServer::closeAsync(HttpServerClient& requestClient)
195199
return;
196200
}
197201

198-
if (useStreams)
199-
{
200-
requestClient.readableSocketStream.destroy(); // emits 'eventClose' cancelling pending reads
201-
requestClient.writableSocketStream.end(); // emits 'eventFinish' cancelling pending writes
202-
}
203-
else
202+
if (not useStreams)
204203
{
205204
if (not requestClient.asyncSend.isFree())
206205
{
@@ -210,8 +209,8 @@ void HttpAsyncServer::closeAsync(HttpServerClient& requestClient)
210209
{
211210
(void)requestClient.asyncReceive.stop(*eventLoop);
212211
}
213-
SC_TRUST_RESULT(requestClient.socket.close());
214212
}
213+
SC_TRUST_RESULT(requestClient.socket.close());
215214
const bool wasFull = not httpServer.canAcceptMoreClients();
216215

217216
SC_TRUST_RESULT(httpServer.deallocateClient(requestClient));

Tests/Libraries/Http/HttpServerTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ void SC::HttpServerTest::httpServerTest(bool useAsyncStreams)
5050
for (size_t slice = 0; slice < REQUEST_SLICES; ++slice)
5151
{
5252
Span<char> memory;
53-
const size_t offset = idx * CLIENT_REQUEST + slice;
53+
const size_t offset = idx * CLIENT_REQUEST + slice * CLIENT_REQUEST / REQUEST_SLICES;
5454
SC_TEST_EXPECT(requestsSpan.sliceStartLength(offset, CLIENT_REQUEST / REQUEST_SLICES, memory));
5555
buffers[idx * REQUEST_SLICES + slice] = memory;
5656
}

0 commit comments

Comments
 (0)