summaryrefslogtreecommitdiff
path: root/chromium/net/server/web_socket_encoder.cc
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2022-02-02 12:21:57 +0100
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2022-02-12 08:13:00 +0000
commit606d85f2a5386472314d39923da28c70c60dc8e7 (patch)
treea8f4d7bf997f349f45605e6058259fba0630e4d7 /chromium/net/server/web_socket_encoder.cc
parent5786336dda477d04fb98483dca1a5426eebde2d7 (diff)
downloadqtwebengine-chromium-606d85f2a5386472314d39923da28c70c60dc8e7.tar.gz
BASELINE: Update Chromium to 96.0.4664.181
Change-Id: I762cd1da89d73aa6313b4a753fe126c34833f046 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/net/server/web_socket_encoder.cc')
-rw-r--r--chromium/net/server/web_socket_encoder.cc83
1 files changed, 55 insertions, 28 deletions
diff --git a/chromium/net/server/web_socket_encoder.cc b/chromium/net/server/web_socket_encoder.cc
index 760ff6b9ebd..7e5e652786b 100644
--- a/chromium/net/server/web_socket_encoder.cc
+++ b/chromium/net/server/web_socket_encoder.cc
@@ -6,15 +6,16 @@
#include <limits>
#include <utility>
-#include <vector>
#include "base/check.h"
#include "base/memory/ptr_util.h"
+#include "base/strings/strcat.h"
#include "base/strings/string_number_conversions.h"
#include "net/base/io_buffer.h"
#include "net/websockets/websocket_deflate_parameters.h"
#include "net/websockets/websocket_extension.h"
#include "net/websockets/websocket_extension_parser.h"
+#include "net/websockets/websocket_frame.h"
namespace net {
@@ -27,15 +28,6 @@ const int kInflaterChunkSize = 16 * 1024;
// Constants for hybi-10 frame format.
-typedef int OpCode;
-
-const OpCode kOpCodeContinuation = 0x0;
-const OpCode kOpCodeText = 0x1;
-const OpCode kOpCodeBinary = 0x2;
-const OpCode kOpCodeClose = 0x8;
-const OpCode kOpCodePing = 0x9;
-const OpCode kOpCodePong = 0xA;
-
const unsigned char kFinalBit = 0x80;
const unsigned char kReserved1Bit = 0x40;
const unsigned char kReserved2Bit = 0x20;
@@ -72,20 +64,24 @@ WebSocket::ParseResult DecodeFrameHybi17(const base::StringPiece& frame,
int op_code = first_byte & kOpCodeMask;
bool masked = (second_byte & kMaskBit) != 0;
*compressed = reserved1;
- if (!final || reserved2 || reserved3)
+ if (reserved2 || reserved3)
return WebSocket::FRAME_ERROR; // Only compression extension is supported.
bool closed = false;
switch (op_code) {
- case kOpCodeClose:
+ case WebSocketFrameHeader::OpCodeEnum::kOpCodeClose:
closed = true;
break;
- case kOpCodeText:
+
+ case WebSocketFrameHeader::OpCodeEnum::kOpCodeText:
+ case WebSocketFrameHeader::OpCodeEnum::
+ kOpCodeContinuation: // Treated in the same as kOpCodeText.
+ case WebSocketFrameHeader::OpCodeEnum::kOpCodePing:
+ case WebSocketFrameHeader::OpCodeEnum::kOpCodePong:
break;
- case kOpCodeBinary: // We don't support binary frames yet.
- case kOpCodeContinuation: // We don't support binary frames yet.
- case kOpCodePing: // We don't support binary frames yet.
- case kOpCodePong: // We don't support binary frames yet.
+
+ case WebSocketFrameHeader::OpCodeEnum::kOpCodeBinary: // We don't support
+ // binary frames yet.
default:
return WebSocket::FRAME_ERROR;
}
@@ -137,15 +133,25 @@ WebSocket::ParseResult DecodeFrameHybi17(const base::StringPiece& frame,
size_t pos = p + actual_masking_key_length + payload_length - buffer_begin;
*bytes_consumed = pos;
- return closed ? WebSocket::FRAME_CLOSE : WebSocket::FRAME_OK;
+
+ if (op_code == WebSocketFrameHeader::OpCodeEnum::kOpCodePing)
+ return WebSocket::FRAME_PING;
+
+ if (op_code == WebSocketFrameHeader::OpCodeEnum::kOpCodePong)
+ return WebSocket::FRAME_PONG;
+
+ if (closed)
+ return WebSocket::FRAME_CLOSE;
+
+ return final ? WebSocket::FRAME_OK_FINAL : WebSocket::FRAME_OK_MIDDLE;
}
void EncodeFrameHybi17(base::StringPiece message,
int masking_key,
bool compressed,
+ WebSocketFrameHeader::OpCodeEnum op_code,
std::string* output) {
std::vector<char> frame;
- OpCode op_code = kOpCodeText;
size_t data_length = message.length();
int reserved1 = compressed ? kReserved1Bit : 0;
@@ -292,23 +298,44 @@ WebSocket::ParseResult WebSocketEncoder::DecodeFrame(
int* bytes_consumed,
std::string* output) {
bool compressed;
+ std::string current_output;
WebSocket::ParseResult result = DecodeFrameHybi17(
- frame, type_ == FOR_SERVER, bytes_consumed, output, &compressed);
- if (result == WebSocket::FRAME_OK && compressed) {
- if (!Inflate(output))
- result = WebSocket::FRAME_ERROR;
+ frame, type_ == FOR_SERVER, bytes_consumed, &current_output, &compressed);
+ if (result == WebSocket::FRAME_OK_FINAL ||
+ result == WebSocket::FRAME_OK_MIDDLE || result == WebSocket::FRAME_PING) {
+ if (continuation_message_frames_.empty())
+ is_current_message_compressed_ = compressed;
+ continuation_message_frames_.push_back(current_output);
+ }
+ if (result == WebSocket::FRAME_OK_FINAL || result == WebSocket::FRAME_PING) {
+ *output = base::StrCat(continuation_message_frames_);
+ if (is_current_message_compressed_) {
+ if (!Inflate(output))
+ result = WebSocket::FRAME_ERROR;
+ }
}
+ if (result != WebSocket::FRAME_OK_MIDDLE &&
+ result != WebSocket::FRAME_INCOMPLETE)
+ continuation_message_frames_.clear();
return result;
}
-void WebSocketEncoder::EncodeFrame(base::StringPiece frame,
- int masking_key,
- std::string* output) {
+void WebSocketEncoder::EncodeTextFrame(base::StringPiece frame,
+ int masking_key,
+ std::string* output) {
std::string compressed;
+ constexpr auto op_code = WebSocketFrameHeader::OpCodeEnum::kOpCodeText;
if (Deflate(frame, &compressed))
- EncodeFrameHybi17(compressed, masking_key, true, output);
+ EncodeFrameHybi17(compressed, masking_key, true, op_code, output);
else
- EncodeFrameHybi17(frame, masking_key, false, output);
+ EncodeFrameHybi17(frame, masking_key, false, op_code, output);
+}
+
+void WebSocketEncoder::EncodePongFrame(base::StringPiece frame,
+ int masking_key,
+ std::string* output) {
+ constexpr auto op_code = WebSocketFrameHeader::OpCodeEnum::kOpCodePong;
+ EncodeFrameHybi17(frame, masking_key, false, op_code, output);
}
bool WebSocketEncoder::Inflate(std::string* message) {