Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/extensions/filters/network/thrift_proxy/binary_protocol_impl.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <string>
4
5
#include "envoy/buffer/buffer.h"
6
#include "envoy/common/pure.h"
7
8
#include "source/extensions/filters/network/thrift_proxy/protocol.h"
9
#include "source/extensions/filters/network/thrift_proxy/thrift.h"
10
11
namespace Envoy {
12
namespace Extensions {
13
namespace NetworkFilters {
14
namespace ThriftProxy {
15
16
/**
17
 * BinaryProtocolImpl implements the Thrift Binary protocol with strict message encoding.
18
 * See https://github.com/apache/thrift/blob/master/doc/specs/thrift-binary-protocol.md
19
 */
20
class BinaryProtocolImpl : public Protocol {
21
public:
22
0
  BinaryProtocolImpl() = default;
23
24
  // Protocol
25
0
  const std::string& name() const override { return ProtocolNames::get().BINARY; }
26
0
  ProtocolType type() const override { return ProtocolType::Binary; }
27
  bool readMessageBegin(Buffer::Instance& buffer, MessageMetadata& metadata) override;
28
  bool readMessageEnd(Buffer::Instance& buffer) override;
29
  bool peekReplyPayload(Buffer::Instance& buffer, ReplyType& reply_type) override;
30
  bool readStructBegin(Buffer::Instance& buffer, std::string& name) override;
31
  bool readStructEnd(Buffer::Instance& buffer) override;
32
  bool readFieldBegin(Buffer::Instance& buffer, std::string& name, FieldType& field_type,
33
                      int16_t& field_id) override;
34
  bool readFieldEnd(Buffer::Instance& buffer) override;
35
  bool readMapBegin(Buffer::Instance& buffer, FieldType& key_type, FieldType& value_type,
36
                    uint32_t& size) override;
37
  bool readMapEnd(Buffer::Instance& buffer) override;
38
  bool readListBegin(Buffer::Instance& buffer, FieldType& elem_type, uint32_t& size) override;
39
  bool readListEnd(Buffer::Instance& buffer) override;
40
  bool readSetBegin(Buffer::Instance& buffer, FieldType& elem_type, uint32_t& size) override;
41
  bool readSetEnd(Buffer::Instance& buffer) override;
42
  bool readBool(Buffer::Instance& buffer, bool& value) override;
43
  bool readByte(Buffer::Instance& buffer, uint8_t& value) override;
44
  bool readInt16(Buffer::Instance& buffer, int16_t& value) override;
45
  bool readInt32(Buffer::Instance& buffer, int32_t& value) override;
46
  bool readInt64(Buffer::Instance& buffer, int64_t& value) override;
47
  bool readDouble(Buffer::Instance& buffer, double& value) override;
48
  bool readString(Buffer::Instance& buffer, std::string& value) override;
49
  bool readBinary(Buffer::Instance& buffer, std::string& value) override;
50
  void writeMessageBegin(Buffer::Instance& buffer, const MessageMetadata& metadata) override;
51
  void writeMessageEnd(Buffer::Instance& buffer) override;
52
  void writeStructBegin(Buffer::Instance& buffer, const std::string& name) override;
53
  void writeStructEnd(Buffer::Instance& buffer) override;
54
  void writeFieldBegin(Buffer::Instance& buffer, const std::string& name, FieldType field_type,
55
                       int16_t field_id) override;
56
  void writeFieldEnd(Buffer::Instance& buffer) override;
57
  void writeMapBegin(Buffer::Instance& buffer, FieldType key_type, FieldType value_type,
58
                     uint32_t size) override;
59
  void writeMapEnd(Buffer::Instance& buffer) override;
60
  void writeListBegin(Buffer::Instance& buffer, FieldType elem_type, uint32_t size) override;
61
  void writeListEnd(Buffer::Instance& buffer) override;
62
  void writeSetBegin(Buffer::Instance& buffer, FieldType elem_type, uint32_t size) override;
63
  void writeSetEnd(Buffer::Instance& buffer) override;
64
  void writeBool(Buffer::Instance& buffer, bool value) override;
65
  void writeByte(Buffer::Instance& buffer, uint8_t value) override;
66
  void writeInt16(Buffer::Instance& buffer, int16_t value) override;
67
  void writeInt32(Buffer::Instance& buffer, int32_t value) override;
68
  void writeInt64(Buffer::Instance& buffer, int64_t value) override;
69
  void writeDouble(Buffer::Instance& buffer, double value) override;
70
  void writeString(Buffer::Instance& buffer, const std::string& value) override;
71
  void writeBinary(Buffer::Instance& buffer, const std::string& value) override;
72
73
0
  static bool isMagic(uint16_t word) { return word == Magic; }
74
75
  // Minimum message length:
76
  //   version: 2 bytes +
77
  //   unused: 1 byte +
78
  //   msg type: 1 byte +
79
  //   name len: 4 bytes +
80
  //   name: 0 bytes +
81
  //   seq id: 4 bytes
82
  static constexpr uint64_t MinMessageBeginLength = 12;
83
84
private:
85
  static void validateFieldId(int16_t id);
86
87
  const static uint16_t Magic;
88
};
89
90
/**
91
 * LaxBinaryProtocolImpl implements the Thrift Binary protocol with non-strict (e.g. lax) message
92
 * encoding. See https://github.com/apache/thrift/blob/master/doc/specs/thrift-binary-protocol.md
93
 */
94
class LaxBinaryProtocolImpl : public BinaryProtocolImpl {
95
public:
96
0
  LaxBinaryProtocolImpl() = default;
97
98
0
  const std::string& name() const override { return ProtocolNames::get().LAX_BINARY; }
99
100
  bool readMessageBegin(Buffer::Instance& buffer, MessageMetadata& metadata) override;
101
  void writeMessageBegin(Buffer::Instance& buffer, const MessageMetadata& metadata) override;
102
};
103
104
} // namespace ThriftProxy
105
} // namespace NetworkFilters
106
} // namespace Extensions
107
} // namespace Envoy