blob: 8ff1916d3db5740567d291178acb888c38beceba [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_HTTP2_TEST_TOOLS_HTTP2_FRAME_BUILDER_H_
#define QUICHE_HTTP2_TEST_TOOLS_HTTP2_FRAME_BUILDER_H_
// Http2FrameBuilder builds wire-format HTTP/2 frames (or fragments thereof)
// from components.
//
// For now, this is only intended for use in tests, and thus has EXPECT* in the
// code. If desired to use it in an encoder, it will need optimization work,
// especially w.r.t memory mgmt, and the EXPECT* will need to be removed or
// replaced with QUICHE_DCHECKs.
#include <stddef.h> // for size_t
#include <cstdint>
#include <string>
#include "absl/strings/string_view.h"
#include "quiche/http2/http2_constants.h"
#include "quiche/http2/http2_structures.h"
#include "quiche/common/platform/api/quiche_export.h"
namespace http2 {
namespace test {
class QUICHE_NO_EXPORT Http2FrameBuilder {
public:
Http2FrameBuilder(Http2FrameType type, uint8_t flags, uint32_t stream_id);
explicit Http2FrameBuilder(const Http2FrameHeader& v);
Http2FrameBuilder() {}
~Http2FrameBuilder() {}
size_t size() const { return buffer_.size(); }
const std::string& buffer() const { return buffer_; }
//----------------------------------------------------------------------------
// Methods for appending to the end of the buffer.
// Append a sequence of bytes from various sources.
void Append(absl::string_view s);
void AppendBytes(const void* data, uint32_t num_bytes);
// Append an array of type T[N] to the string. Intended for tests with arrays
// initialized from literals, such as:
// const char kData[] = {0x12, 0x23, ...};
// builder.AppendBytes(kData);
template <typename T, size_t N>
void AppendBytes(T (&buf)[N]) {
AppendBytes(buf, N * sizeof(buf[0]));
}
// Support for appending padding. Does not read or write the Pad Length field.
void AppendZeroes(size_t num_zero_bytes);
// Append various sizes of unsigned integers.
void AppendUInt8(uint8_t value);
void AppendUInt16(uint16_t value);
void AppendUInt24(uint32_t value);
void AppendUInt31(uint32_t value);
void AppendUInt32(uint32_t value);
// Append various enums.
void Append(Http2ErrorCode error_code);
void Append(Http2FrameType type);
void Append(Http2SettingsParameter parameter);
// Append various structures.
void Append(const Http2FrameHeader& v);
void Append(const Http2PriorityFields& v);
void Append(const Http2RstStreamFields& v);
void Append(const Http2SettingFields& v);
void Append(const Http2PushPromiseFields& v);
void Append(const Http2PingFields& v);
void Append(const Http2GoAwayFields& v);
void Append(const Http2WindowUpdateFields& v);
void Append(const Http2AltSvcFields& v);
void Append(const Http2PriorityUpdateFields& v);
// Methods for changing existing buffer contents (mostly focused on updating
// the payload length).
void WriteAt(absl::string_view s, size_t offset);
void WriteBytesAt(const void* data, uint32_t num_bytes, size_t offset);
void WriteUInt24At(uint32_t value, size_t offset);
// Set the payload length to the specified size.
void SetPayloadLength(uint32_t payload_length);
// Sets the payload length to the size of the buffer minus the size of
// the frame header.
size_t SetPayloadLength();
private:
std::string buffer_;
};
} // namespace test
} // namespace http2
#endif // QUICHE_HTTP2_TEST_TOOLS_HTTP2_FRAME_BUILDER_H_