|
@@ -15,7 +15,6 @@ class Server:
|
|
|
self._buffer_chunk_size = buffer_chunk_size # How many bytes per chunk
|
|
|
self._buffer_length_limit = buffer_length_limit # How many chunks in buffer
|
|
|
self._working = False
|
|
|
- self.at_eof = False
|
|
|
self._server = None
|
|
|
self._ssl_context = None
|
|
|
|
|
@@ -62,32 +61,37 @@ class Server:
|
|
|
await asyncio.sleep(1)
|
|
|
continue
|
|
|
input_data = await reader.read(self.buffer_chunk_size)
|
|
|
- if reader.at_eof():
|
|
|
- self.at_eof = True
|
|
|
self.buffer.append(input_data)
|
|
|
except Exception as e:
|
|
|
logging.error(e)
|
|
|
|
|
|
async def run_writer(self, writer):
|
|
|
+ consecutive_interruptions = 0
|
|
|
+ errors = 0
|
|
|
while not self.stopping:
|
|
|
try:
|
|
|
- # Slow down if buffer is short
|
|
|
- if len(self.buffer) < 3:
|
|
|
- await asyncio.sleep(.1)
|
|
|
try:
|
|
|
input_data = self.buffer.popleft()
|
|
|
except IndexError:
|
|
|
- if not self.at_eof:
|
|
|
- continue
|
|
|
- else:
|
|
|
- writer.write_eof()
|
|
|
- await writer.drain()
|
|
|
- self.at_eof = False
|
|
|
+ # Slow down if buffer is short
|
|
|
+ consecutive_interruptions += 1
|
|
|
+ if consecutive_interruptions > 3:
|
|
|
break
|
|
|
+ await asyncio.sleep(.5)
|
|
|
+ continue
|
|
|
+ else:
|
|
|
+ consecutive_interruptions = 0
|
|
|
+ if not input_data:
|
|
|
+ break
|
|
|
writer.write(input_data)
|
|
|
await writer.drain()
|
|
|
except Exception as e:
|
|
|
logging.error(e)
|
|
|
+ errors += 1
|
|
|
+ if errors > 3:
|
|
|
+ break
|
|
|
+ await asyncio.sleep(0.5)
|
|
|
+ writer.close()
|
|
|
|
|
|
async def connect(self,
|
|
|
reader: asyncio.StreamReader,
|
|
@@ -217,5 +221,3 @@ if __name__ == '__main__':
|
|
|
logging.info("Please consider using SSL.")
|
|
|
certificate, key = None, None
|
|
|
server.run()
|
|
|
-
|
|
|
-# TODO: https://pymotw.com/3/asyncio/ssl.html (replace eof with zero-byte)
|