Handle cameras that close connections without Connection: close header #140
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds resilience against ONVIF cameras that improperly close HTTP connections without notification. Some cameras close the TCP connection after each response without sending a
Connection: close
header, causingServerDisconnectedError
when the client attempts to reuse the connection. This particularly affects Thingino firmware cameras and similar devices with non-compliant HTTP implementations.Problem
Connection: close
headerServerDisconnectedError
@retry_connection_error
decorator wasn't being applied to thepost_xml()
method that zeep uses for SOAP callsSolution
Added retry decorator to
post_xml()
method: TheAsyncTransportProtocolErrorHandler
class now wrapspost_xml()
with the retry decorator, matching the existingpost()
andget()
methodsMade backoff configurable: Added an optional
backoff
parameter to theretry_connection_error
decorator to allow immediate retries for connection errorsSet zero backoff for ServerDisconnectedError: Since this is just a closed connection (not a server issue), we can immediately retry without any delay
Changes
onvif/client.py
: Added@retry_connection_error
decorator topost_xml()
method with 0 backoffonvif/wrappers.py
: Made backoff time configurable in the retry decoratorTesting
ServerDisconnectedError
occursRelated Issues
Backward Compatibility
This change is fully backward compatible. It only adds retry logic for a specific error condition and doesn't change any existing behavior for working cameras.