/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 |