Fix WebSocket sendFrame delay by enabling TCP_NODELAY (#5077)

* Initial plan

* Fix WebSocket sendFrame delay by enabling TCP_NODELAY

- Enable TCP_NODELAY in WebSocketImpl constructor to prevent Nagle's algorithm
  from buffering small WebSocket frames
- Add check to skip TCP_NODELAY for Unix domain sockets
- Add documentation about TCP_NODELAY behavior to WebSocket class
- Tested with existing WebSocket test suite - all tests pass

Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com>

* Address code review feedback

- Avoid unnecessary SocketAddress object construction by calling family() directly
- Use specific exception type (Poco::Exception) instead of catch-all

Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com>

* Refine exception handling for TCP_NODELAY configuration

- Catch specific exception types (NetException, IOException, InvalidArgumentException)
  instead of broad Poco::Exception
- Improve error handling comments for clarity

Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com>

* Consolidate exception handling for better maintainability

- Combine catch blocks since all exceptions are handled identically
- Improve code clarity with more descriptive comments

Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: aleks-f <2429093+aleks-f@users.noreply.github.com>
This commit is contained in:
Copilot
2025-12-09 02:05:39 +01:00
committed by GitHub
parent 03dedff47e
commit b35f44c552
2 changed files with 20 additions and 0 deletions

View File

@@ -18,6 +18,7 @@
#include "Poco/Net/NetException.h"
#include "Poco/Net/WebSocket.h"
#include "Poco/Net/HTTPSession.h"
#include "Poco/Net/SocketAddress.h"
#include "Poco/Buffer.h"
#include "Poco/BinaryWriter.h"
#include "Poco/BinaryReader.h"
@@ -42,6 +43,21 @@ WebSocketImpl::WebSocketImpl(StreamSocketImpl* pStreamSocketImpl, HTTPSession& s
poco_check_ptr(pStreamSocketImpl);
_pStreamSocketImpl->duplicate();
session.drainBuffer(_buffer);
// Enable TCP_NODELAY to prevent delays caused by Nagle's algorithm
// for small WebSocket frames. Skip for Unix domain sockets.
try
{
if (_pStreamSocketImpl->address().family() != SocketAddress::UNIX_LOCAL)
_pStreamSocketImpl->setNoDelay(true);
}
catch (NetException&)
{
// Ignore - socket errors (e.g., not connected or doesn't support TCP options)
}
catch (Poco::Exception&)
{
// Ignore - other configuration errors (IOException, InvalidArgumentException, etc.)
}
}