Framentation: data and continuation blocks received out of order (fix autobahn test: 5.9 through 5.20 Fragmentation)

This commit is contained in:
Benjamin Sergeant 2019-09-03 12:02:29 -07:00
parent 172cd39702
commit afa71a6b4b
7 changed files with 38 additions and 15 deletions

View File

@ -1 +1 @@
5.1.4 5.1.5

View File

@ -1,6 +1,10 @@
# Changelog # Changelog
All notable changes to this project will be documented in this file. All notable changes to this project will be documented in this file.
## [5.1.5] - 2019-09-03
Framentation: data and continuation blocks received out of order (fix autobahn test: 5.9 through 5.20 Fragmentation)
## [5.1.4] - 2019-09-03 ## [5.1.4] - 2019-09-03
Sending invalid UTF-8 TEXT message should fail and close the connection (fix **tons** of autobahn test: 6.X UTF-8 Handling) Sending invalid UTF-8 TEXT message should fail and close the connection (fix **tons** of autobahn test: 6.X UTF-8 Handling)
@ -19,17 +23,17 @@ Close connections when reserved bits are used (fix autobahn test: 3.X Reserved B
## [5.1.0] - 2019-08-31 ## [5.1.0] - 2019-08-31
ws autobahn / Add code to test websocket client compliance with the autobahn test-suite - ws autobahn / Add code to test websocket client compliance with the autobahn test-suite
add utf-8 validation code, not hooked up properly yet - add utf-8 validation code, not hooked up properly yet
Ping received with a payload too large (> 125 bytes) trigger a connection closure - Ping received with a payload too large (> 125 bytes) trigger a connection closure
cobra / add tracking about published messages - cobra / add tracking about published messages
cobra / publish returns a message id, that can be used when - cobra / publish returns a message id, that can be used when
cobra / new message type in the message received handler when publish/ok is received (can be used to implement an ack system). - cobra / new message type in the message received handler when publish/ok is received (can be used to implement an ack system).
## [5.0.9] - 2019-08-30 ## [5.0.9] - 2019-08-30
User-Agent header is set when not specified. - User-Agent header is set when not specified.
New option to cap the max wait between reconnection attempts. Still default to 10s. (setMaxWaitBetweenReconnectionRetries). - New option to cap the max wait between reconnection attempts. Still default to 10s. (setMaxWaitBetweenReconnectionRetries).
``` ```
ws connect --max_wait 5000 ws://example.com # will only wait 5 seconds max between reconnection attempts ws connect --max_wait 5000 ws://example.com # will only wait 5 seconds max between reconnection attempts

View File

@ -461,8 +461,8 @@ namespace ix
{ {
if (!isValidUtf8(text)) if (!isValidUtf8(text))
{ {
close(WebSocketCloseConstants::kNormalClosureCode, close(WebSocketCloseConstants::kInvalidFramePayloadData,
WebSocketCloseConstants::kInvalidUtf8); WebSocketCloseConstants::kInvalidFramePayloadDataMessage);
return false; return false;
} }
return sendMessage(text, SendMessageKind::Text, onProgressCallback); return sendMessage(text, SendMessageKind::Text, onProgressCallback);

View File

@ -11,6 +11,7 @@ namespace ix
const uint16_t WebSocketCloseConstants::kNormalClosureCode(1000); const uint16_t WebSocketCloseConstants::kNormalClosureCode(1000);
const uint16_t WebSocketCloseConstants::kInternalErrorCode(1011); const uint16_t WebSocketCloseConstants::kInternalErrorCode(1011);
const uint16_t WebSocketCloseConstants::kAbnormalCloseCode(1006); const uint16_t WebSocketCloseConstants::kAbnormalCloseCode(1006);
const uint16_t WebSocketCloseConstants::kInvalidFramePayloadData(1007);
const uint16_t WebSocketCloseConstants::kProtocolErrorCode(1002); const uint16_t WebSocketCloseConstants::kProtocolErrorCode(1002);
const uint16_t WebSocketCloseConstants::kNoStatusCodeErrorCode(1005); const uint16_t WebSocketCloseConstants::kNoStatusCodeErrorCode(1005);
@ -23,5 +24,7 @@ namespace ix
const std::string WebSocketCloseConstants::kProtocolErrorReservedBitUsed("Reserved bit used"); const std::string WebSocketCloseConstants::kProtocolErrorReservedBitUsed("Reserved bit used");
const std::string WebSocketCloseConstants::kProtocolErrorPingPayloadOversized("Ping reason control frame with payload length > 125 octets"); const std::string WebSocketCloseConstants::kProtocolErrorPingPayloadOversized("Ping reason control frame with payload length > 125 octets");
const std::string WebSocketCloseConstants::kProtocolErrorCodeControlMessageFragmented("Control message fragmented"); const std::string WebSocketCloseConstants::kProtocolErrorCodeControlMessageFragmented("Control message fragmented");
const std::string WebSocketCloseConstants::kInvalidUtf8("Invalid UTF-8"); const std::string WebSocketCloseConstants::kProtocolErrorCodeDataOpcodeOutOfSequence("Fragmentation: data message out of sequence");
const std::string WebSocketCloseConstants::kProtocolErrorCodeContinuationOpCodeOutOfSequence("Fragmentation: continuation opcode out of sequence");
const std::string WebSocketCloseConstants::kInvalidFramePayloadDataMessage("Invalid frame payload data");
} }

View File

@ -18,6 +18,7 @@ namespace ix
static const uint16_t kAbnormalCloseCode; static const uint16_t kAbnormalCloseCode;
static const uint16_t kProtocolErrorCode; static const uint16_t kProtocolErrorCode;
static const uint16_t kNoStatusCodeErrorCode; static const uint16_t kNoStatusCodeErrorCode;
static const uint16_t kInvalidFramePayloadData;
static const std::string kNormalClosureMessage; static const std::string kNormalClosureMessage;
static const std::string kInternalErrorMessage; static const std::string kInternalErrorMessage;
@ -28,6 +29,8 @@ namespace ix
static const std::string kProtocolErrorReservedBitUsed; static const std::string kProtocolErrorReservedBitUsed;
static const std::string kProtocolErrorPingPayloadOversized; static const std::string kProtocolErrorPingPayloadOversized;
static const std::string kProtocolErrorCodeControlMessageFragmented; static const std::string kProtocolErrorCodeControlMessageFragmented;
static const std::string kInvalidUtf8; static const std::string kProtocolErrorCodeDataOpcodeOutOfSequence;
static const std::string kProtocolErrorCodeContinuationOpCodeOutOfSequence;
static const std::string kInvalidFramePayloadDataMessage;
}; };
} // namespace ix } // namespace ix

View File

@ -551,7 +551,7 @@ namespace ix
|| ws.opcode == wsheader_type::PONG || ws.opcode == wsheader_type::PONG
|| ws.opcode == wsheader_type::CLOSE || ws.opcode == wsheader_type::CLOSE
)){ )){
// Cntrol messages should not be fragmented // Control messages should not be fragmented
close(WebSocketCloseConstants::kProtocolErrorCode, close(WebSocketCloseConstants::kProtocolErrorCode,
WebSocketCloseConstants::kProtocolErrorCodeControlMessageFragmented); WebSocketCloseConstants::kProtocolErrorCodeControlMessageFragmented);
return; return;
@ -571,6 +571,19 @@ namespace ix
(ws.opcode == wsheader_type::TEXT_FRAME) (ws.opcode == wsheader_type::TEXT_FRAME)
? MessageKind::MSG_TEXT ? MessageKind::MSG_TEXT
: MessageKind::MSG_BINARY; : MessageKind::MSG_BINARY;
// Continuation message needs to follow a non-fin TEXT or BINARY message
if (!_chunks.empty())
{
close(WebSocketCloseConstants::kProtocolErrorCode,
WebSocketCloseConstants::kProtocolErrorCodeDataOpcodeOutOfSequence);
}
}
else if (_chunks.empty())
{
// Continuation message need to follow a non-fin TEXT or BINARY message
close(WebSocketCloseConstants::kProtocolErrorCode,
WebSocketCloseConstants::kProtocolErrorCodeContinuationOpCodeOutOfSequence);
} }
// //

View File

@ -6,4 +6,4 @@
#pragma once #pragma once
#define IX_WEBSOCKET_VERSION "5.1.4" #define IX_WEBSOCKET_VERSION "5.1.5"