1
0
mirror of https://github.com/facebook/proxygen.git synced 2026-10-24 01:33:54 +03:00

Fix CQS signal facebook-hte-CArray in xplat/proxygen/lib/http

Differential Revision: D119469935

fbshipit-source-id: 074778cb1e21c9e148152b44980cba3f2fd1d0fd
This commit is contained in:
generatedunixname898294613133534
2026-10-22 07:41:52 -07:00
committed by meta-codesync[bot]
parent 4f55ce1648
commit 8f9e53de68

View File

@@ -8,6 +8,9 @@
#include <proxygen/lib/http/codec/HTTP1xCodec.h>
#include <array>
#include <string_view>
#include <folly/Conv.h>
#include <folly/Random.h>
#include <folly/base64.h>
@@ -25,7 +28,7 @@ using std::unique_ptr;
namespace {
constexpr std::string_view kChunked = "chunked";
const char CRLF[] = "\r\n";
constexpr std::string_view CRLF = "\r\n";
/**
* Write an ASCII decimal representation of an integer value
@@ -56,9 +59,9 @@ unsigned u64toa(uint64_t value, char* dst) {
}
void appendUint(IOBufQueue& queue, size_t& len, uint64_t value) {
char buf[32];
size_t encodedLen = u64toa(value, buf);
queue.append(buf, encodedLen);
std::array<char, 32> buf{};
size_t encodedLen = u64toa(value, buf.data());
queue.append(buf.data(), encodedLen);
len += encodedLen;
}
@@ -392,7 +395,7 @@ bool HTTP1xCodec::isBusy() const {
void HTTP1xCodec::addDateHeader(IOBufQueue& writeBuf, size_t& len) {
appendLiteral(writeBuf, len, "Date: ");
appendString(writeBuf, len, HTTPMessage::formatDateHeader());
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
}
constexpr folly::StringPiece kUpgradeToken = "websocket";
@@ -425,23 +428,23 @@ void HTTP1xCodec::serializeWebsocketHeader(IOBufQueue& writeBuf,
if (upstream) {
appendLiteral(writeBuf, len, "Upgrade: ");
appendString(writeBuf, len, kUpgradeToken.str());
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
upgradeHeader_ = kUpgradeToken.str();
auto key = generateWebsocketKey();
appendLiteral(writeBuf, len, "Sec-WebSocket-Key: ");
appendString(writeBuf, len, key);
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
DCHECK(websockAcceptKey_.empty());
websockAcceptKey_ = generateWebsocketAccept(key);
} else {
appendLiteral(writeBuf, len, "Upgrade: ");
appendString(writeBuf, len, kUpgradeToken.str());
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
appendLiteral(writeBuf, len, "Sec-WebSocket-Accept: ");
appendString(writeBuf, len, websockAcceptKey_);
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
}
}
@@ -577,7 +580,7 @@ void HTTP1xCodec::generateHeader(
}
break;
}
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
if (keepalive_ && (!msg.wantsKeepalive() || version.first < 1 ||
(downstream && version == HTTPMessage::kHTTPVersion10 &&
@@ -746,9 +749,9 @@ void HTTP1xCodec::generateHeader(
if (!deferredContentLength.empty()) {
appendLiteral(writeBuf, len, "Content-Length: ");
appendString(writeBuf, len, deferredContentLength);
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
}
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
if (eom) {
len += generateEOM(writeBuf, txn);
}
@@ -779,12 +782,13 @@ size_t HTTP1xCodec::generateBody(IOBufQueue& writeBuf,
}
if (egressChunked_ && !inChunk_) {
char chunkLenBuf[32];
int rc = snprintf(chunkLenBuf, sizeof(chunkLenBuf), "%zx\r\n", buflen);
std::array<char, 32> chunkLenBuf{};
int rc =
snprintf(chunkLenBuf.data(), chunkLenBuf.size(), "%zx\r\n", buflen);
CHECK_GT(rc, 0);
CHECK_LT(size_t(rc), sizeof(chunkLenBuf));
CHECK_LT(size_t(rc), chunkLenBuf.size());
writeBuf.append(chunkLenBuf, rc);
writeBuf.append(chunkLenBuf.data(), rc);
totLen += rc;
writeBuf.append(std::move(chain));
@@ -812,12 +816,13 @@ size_t HTTP1xCodec::generateChunkHeader(IOBufQueue& writeBuf,
if (egressChunked_) {
CHECK(!inChunk_);
inChunk_ = true;
char chunkLenBuf[32];
int rc = snprintf(chunkLenBuf, sizeof(chunkLenBuf), "%zx\r\n", length);
std::array<char, 32> chunkLenBuf{};
int rc =
snprintf(chunkLenBuf.data(), chunkLenBuf.size(), "%zx\r\n", length);
CHECK_GT(rc, 0);
CHECK_LT(size_t(rc), sizeof(chunkLenBuf));
CHECK_LT(size_t(rc), chunkLenBuf.size());
writeBuf.append(chunkLenBuf, rc);
writeBuf.append(chunkLenBuf.data(), rc);
return rc;
}
@@ -848,7 +853,7 @@ size_t HTTP1xCodec::generateTrailers(IOBufQueue& writeBuf,
appendString(writeBuf, len, trailer);
appendLiteral(writeBuf, len, ": ");
appendString(writeBuf, len, value);
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
});
len += generateEOM(writeBuf, txn);
}
@@ -868,7 +873,7 @@ size_t HTTP1xCodec::generateEOM(IOBufQueue& writeBuf, StreamID txn) {
lastChunkWritten_ = true;
appendLiteral(writeBuf, len, "0\r\n");
}
appendLiteral(writeBuf, len, CRLF);
appendString(writeBuf, len, CRLF);
}
}
switch (transportDirection_) {