blob: 76ba378140fb3c4e4f2703f43e499f9fcfddcde0 [file] [log] [blame]
QUICHE team6b297002019-12-09 09:37:56 -08001#include "net/third_party/quiche/src/spdy/core/spdy_header_storage.h"
2
QUICHE teambd5386d2019-12-10 07:42:53 -08003#include "net/third_party/quiche/src/spdy/platform/api/spdy_logging.h"
4
QUICHE team6b297002019-12-09 09:37:56 -08005namespace spdy {
6namespace {
7
8// SpdyHeaderStorage allocates blocks of this size by default.
9const size_t kDefaultStorageBlockSize = 2048;
10
11} // namespace
12
13SpdyHeaderStorage::SpdyHeaderStorage() : arena_(kDefaultStorageBlockSize) {}
14
bnc7f82d042020-01-03 12:18:53 -080015quiche::QuicheStringPiece SpdyHeaderStorage::Write(
16 const quiche::QuicheStringPiece s) {
17 return quiche::QuicheStringPiece(arena_.Memdup(s.data(), s.size()), s.size());
QUICHE team6b297002019-12-09 09:37:56 -080018}
19
bnc7f82d042020-01-03 12:18:53 -080020void SpdyHeaderStorage::Rewind(const quiche::QuicheStringPiece s) {
QUICHE team6b297002019-12-09 09:37:56 -080021 arena_.Free(const_cast<char*>(s.data()), s.size());
22}
23
bnc7f82d042020-01-03 12:18:53 -080024quiche::QuicheStringPiece SpdyHeaderStorage::WriteFragments(
25 const std::vector<quiche::QuicheStringPiece>& fragments,
26 quiche::QuicheStringPiece separator) {
QUICHE team6b297002019-12-09 09:37:56 -080027 if (fragments.empty()) {
bnc7f82d042020-01-03 12:18:53 -080028 return quiche::QuicheStringPiece();
QUICHE team6b297002019-12-09 09:37:56 -080029 }
30 size_t total_size = separator.size() * (fragments.size() - 1);
31 for (const auto fragment : fragments) {
32 total_size += fragment.size();
33 }
34 char* dst = arena_.Alloc(total_size);
35 size_t written = Join(dst, fragments, separator);
36 DCHECK_EQ(written, total_size);
bnc7f82d042020-01-03 12:18:53 -080037 return quiche::QuicheStringPiece(dst, total_size);
QUICHE team6b297002019-12-09 09:37:56 -080038}
39
40size_t Join(char* dst,
bnc7f82d042020-01-03 12:18:53 -080041 const std::vector<quiche::QuicheStringPiece>& fragments,
42 quiche::QuicheStringPiece separator) {
QUICHE team6b297002019-12-09 09:37:56 -080043 if (fragments.empty()) {
44 return 0;
45 }
46 auto* original_dst = dst;
47 auto it = fragments.begin();
48 memcpy(dst, it->data(), it->size());
49 dst += it->size();
50 for (++it; it != fragments.end(); ++it) {
51 memcpy(dst, separator.data(), separator.size());
52 dst += separator.size();
53 memcpy(dst, it->data(), it->size());
54 dst += it->size();
55 }
56 return dst - original_dst;
57}
58
59} // namespace spdy