Use poll instead of timeouts when waiting for response

This commit is contained in:
Juhani Krekelä 2021-10-17 18:58:58 +03:00
parent 5f0a735a1d
commit 0ac0006a63
1 changed files with 20 additions and 18 deletions

View File

@ -289,23 +289,26 @@ def proxy(sock, host):
# Keep sending request body, if any, until we get a response from remote
poll = select.poll()
poll.register(remote_sock, select.POLLIN)
sock.settimeout(1)
while len(poll.poll(1000)) == 0:
try:
data = sock.recv(1024)
except ConnectionResetError:
break
except socket.timeout:
continue
if data == b'': break
# Save the part we've sent already in case we need to re-send request
request_data.extend(data)
try:
remote_sock.sendall(data)
except (ConnectionResetError, BrokenPipeError):
print('Remote hung up', file=sys.stderr)
return
sock.settimeout(None)
poll.register(sock, select.POLLIN)
no_response = True
while no_response:
for fd, _ in poll.poll():
if fd == remote_sock.fileno():
no_response = False
break
else:
try:
data = sock.recv(1024)
except ConnectionResetError:
break
if data == b'': break
# Save the part we've sent already in case we need to re-send request
request_data.extend(data)
try:
remote_sock.sendall(data)
except (ConnectionResetError, BrokenPipeError):
print('Remote hung up', file=sys.stderr)
return
# Get response headers
remote_sock.settimeout(10)
@ -382,7 +385,6 @@ def proxy(sock, host):
print('', file=sys.stderr)
sock.settimeout(60)
remote_sock.settimeout(60)
poll.register(sock, select.POLLIN)
last_transfer = time.monotonic()
while True:
events = poll.poll(60_000)