Skip to content

Commit 032a350

Browse files
committed
optimize keepalive, clean up
1 parent cd52227 commit 032a350

3 files changed

Lines changed: 17 additions & 18 deletions

File tree

tremolo/lib/http_protocol.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ async def _receive_data(self):
296296
elif self.request.body_size >= self.request.content_length > -1:
297297
self.queue[0].put_nowait(None)
298298
elif self.request.body_size < self.options['client_max_body_size']:
299-
if self.request.has_body:
299+
if self.request.has_body and not self.request.eof():
300300
self.transport.resume_reading()
301301
else:
302302
self.close(BadRequest('payload too large'))
@@ -412,17 +412,17 @@ async def _send_data(self):
412412
self.close(exc)
413413

414414
async def _handle_keepalive(self):
415-
if 'receive' in self.events:
416-
# waits for all incoming data to enter the queue
417-
await self.events['receive']
418-
419415
if self.request.has_body:
420416
if not self.request.eof():
421417
self.logger.info('request body was not fully consumed')
422418
self.request.clear()
423419
self.close()
424420
return
425421

422+
if 'receive' in self.events:
423+
# waits for all incoming data to enter the queue
424+
await self.events['receive']
425+
426426
self.events['request'] = self.loop.create_future()
427427

428428
self.add_task(self.app.create_task(

tremolo/lib/http_request.py

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,12 @@ async def recv(self, size=-1, *, timeout=None, raw=True):
170170
if size == -1:
171171
return await self._stream.__anext__()
172172

173-
if len(self._read_buf) < size:
174-
async for data in self._stream:
175-
self._read_buf.extend(data)
176-
177-
if len(self._read_buf) >= size:
178-
break
173+
while len(self._read_buf) < size:
174+
self._read_buf.extend(await self._stream.__anext__())
179175

180176
data = bytes(self._read_buf[:size])
181177
del self._read_buf[:size]
178+
182179
return data
183180

184181
async def stream(self, timeout=None, raw=False):
@@ -201,10 +198,11 @@ async def stream(self, timeout=None, raw=False):
201198

202199
if bytes_unread > 2:
203200
data = bytes(buf[:bytes_unread - 2])
204-
yield data
205-
206201
del buf[:bytes_unread - 2]
207-
bytes_unread -= len(data)
202+
203+
if data:
204+
yield data
205+
bytes_unread -= len(data)
208206

209207
paused = False
210208
continue
@@ -245,11 +243,12 @@ async def stream(self, timeout=None, raw=False):
245243
raise BadRequest('bad chunked encoding') from exc
246244

247245
data = bytes(buf[i + 2:i + 2 + chunk_size])
248-
bytes_unread = chunk_size - len(data) + 2
249-
250246
del buf[:i + 2 + chunk_size]
251247

252-
yield data
248+
if data:
249+
yield data
250+
251+
bytes_unread = chunk_size - len(data) + 2
253252
paused = True
254253
else:
255254
if (self.content_length >

tremolo/lib/request.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ async def recv(self, timeout=None):
5656
except asyncio.CancelledError as exc:
5757
raise TimeoutError('recv timeout') from exc
5858

59-
if data is None:
59+
if data is None: # only occurs on a request with Content-Length
6060
break
6161

6262
yield data

0 commit comments

Comments
 (0)