Skip to content

Commit 44a371a

Browse files
committed
simplified _drain_server_buffers()
1 parent 5cd4eb3 commit 44a371a

File tree

1 file changed

+34
-52
lines changed

1 file changed

+34
-52
lines changed

tests/test_ssl.py

Lines changed: 34 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3138,68 +3138,50 @@ def _drain_server_buffers(
31383138
) -> None:
31393139
"""Reads from server SSL and raw sockets to drain any pending data."""
31403140
logger.debug("--- Phase 2: Draining server buffers ---")
3141-
total_read = 0
3142-
read_chunks = []
3141+
total_ssl_read = 0
3142+
consecutive_empty_ssl_reads = 0
31433143

3144-
try:
3145-
# First, try to read any SSL data that might be available
3144+
while total_ssl_read < 1024 * 1024:
31463145
try:
3147-
server.recv(65536)
3148-
except (
3149-
SSL.WantReadError,
3150-
SSL.Error,
3151-
) as ssl_error: # pragma: no cover
3146+
data = server.recv(65536)
3147+
if not data: # Peer closed or empty read for some reason
3148+
logger.debug(
3149+
"SSL peer closed or empty data, stopping SSL drain."
3150+
)
3151+
break
3152+
total_ssl_read += len(data)
31523153
logger.debug(
3153-
f"No SSL data available or SSL error: {ssl_error}"
3154+
f"Read {len(data)} bytes of SSL application data "
3155+
f"(total: {total_ssl_read})."
31543156
)
3157+
# Reset counter on successful read
3158+
consecutive_empty_ssl_reads = 0
31553159

3156-
# Now read raw data from the underlying server socket to
3157-
# drain buffer
3158-
server_socket.setblocking(False) # Ensure non-blocking
3159-
consecutive_empty_reads = 0
3160-
3161-
while (
3162-
total_read < 1024 * 1024
3163-
): # Read up to 1MB or until no more data
3164-
try:
3165-
data = server_socket.recv(65536)
3166-
read_chunks.append(data)
3167-
total_read += len(data)
3160+
except SSL.WantReadError:
3161+
consecutive_empty_ssl_reads += 1
3162+
if consecutive_empty_ssl_reads >= 10:
31683163
logger.debug(
3169-
f"Read {len(data)} bytes of data from "
3170-
f"server socket (total: {total_read})."
3164+
"No more SSL application data available after "
3165+
f"{consecutive_empty_ssl_reads} retries."
31713166
)
3172-
time.sleep(0.01) # Small delay between reads
3167+
break
3168+
logger.debug(
3169+
"No SSL data available, waiting... "
3170+
f"(attempt {consecutive_empty_ssl_reads})."
3171+
)
3172+
time.sleep(0.01) # Small delay for non-blocking SSL reads
31733173

3174-
except OSError as e:
3175-
if e.errno == EWOULDBLOCK:
3176-
consecutive_empty_reads += 1
3177-
if consecutive_empty_reads >= 10:
3178-
logger.debug(
3179-
"No more data available from server socket "
3180-
f"after {consecutive_empty_reads} retries."
3181-
)
3182-
break
3183-
logger.debug(
3184-
"No data available, waiting... "
3185-
f"(attempt {consecutive_empty_reads})."
3186-
)
3187-
time.sleep(0.1) # Wait longer when buffer is empty
3188-
continue
3189-
else: # pragma: no cover
3190-
logger.error(
3191-
f"OSError while reading from server socket: {e}"
3192-
)
3193-
break
3174+
except SSL.Error as ssl_error:
3175+
logger.debug(f"SSL error during drain: {ssl_error}")
3176+
break # Stop on SSL protocol errors
3177+
except Exception as e: # Catch other potential errors
3178+
logger.error(f"Unexpected error during SSL drain: {e}")
3179+
break
31943180

3195-
logger.debug(
3196-
f"Finished reading from server. Bytes read: {total_read}. "
3197-
)
3198-
# Allow network buffers to settle
3199-
time.sleep(0.1)
3181+
logger.debug(f"Finished draining SSL. Bytes read: {total_ssl_read}.")
32003182

3201-
except Exception as read_exception: # pragma: no cover
3202-
logger.error(f"Exception reading from server: {read_exception}")
3183+
# Allow network buffers to settle
3184+
time.sleep(0.1)
32033185

32043186
def _perform_moving_buffer_test(
32053187
self, client: Connection, buffer_size: int, want_bad_retry: bool

0 commit comments

Comments
 (0)