/proc/self/cwd/source/extensions/filters/network/mongo_proxy/codec.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <list> |
4 | | #include <memory> |
5 | | #include <string> |
6 | | #include <vector> |
7 | | |
8 | | #include "source/extensions/filters/network/mongo_proxy/bson.h" |
9 | | |
10 | | namespace Envoy { |
11 | | namespace Extensions { |
12 | | namespace NetworkFilters { |
13 | | namespace MongoProxy { |
14 | | |
15 | | /** |
16 | | * General implementation of https://docs.mongodb.org/manual/reference/mongodb-wire-protocol/ |
17 | | */ |
18 | | |
19 | | /** |
20 | | * Base class for all mongo messages. |
21 | | */ |
22 | | class Message { |
23 | | public: |
24 | | enum class OpCode { |
25 | | Reply = 1, |
26 | | Msg = 1000, |
27 | | Update = 2001, |
28 | | Insert = 2002, |
29 | | Query = 2004, |
30 | | GetMore = 2005, |
31 | | Delete = 2006, |
32 | | KillCursors = 2007, |
33 | | Command = 2010, |
34 | | CommandReply = 2011 |
35 | | }; |
36 | | |
37 | 17.3k | virtual ~Message() = default; |
38 | | |
39 | | virtual int32_t requestId() const PURE; |
40 | | virtual int32_t responseTo() const PURE; |
41 | | virtual std::string toString(bool full) const PURE; |
42 | | |
43 | | // Define some constants used in mongo messages encoding |
44 | | constexpr static uint32_t MessageHeaderSize = 16; |
45 | | constexpr static uint32_t Int32Length = 4; |
46 | | constexpr static uint32_t Int64Length = 8; |
47 | | constexpr static uint32_t StringPaddingLength = 1; |
48 | | }; |
49 | | |
50 | | /** |
51 | | * Mongo OP_GET_MORE message. |
52 | | */ |
53 | | class GetMoreMessage : public virtual Message { |
54 | | public: |
55 | | virtual bool operator==(const GetMoreMessage& rhs) const PURE; |
56 | | |
57 | | virtual const std::string& fullCollectionName() const PURE; |
58 | | virtual void fullCollectionName(const std::string& name) PURE; |
59 | | virtual int32_t numberToReturn() const PURE; |
60 | | virtual void numberToReturn(int32_t to_return) PURE; |
61 | | virtual int64_t cursorId() const PURE; |
62 | | virtual void cursorId(int64_t cursor_id) PURE; |
63 | | }; |
64 | | |
65 | | using GetMoreMessagePtr = std::unique_ptr<GetMoreMessage>; |
66 | | |
67 | | /** |
68 | | * Mongo OP_INSERT message. |
69 | | */ |
70 | | class InsertMessage : public virtual Message { |
71 | | public: |
72 | | virtual bool operator==(const InsertMessage& rhs) const PURE; |
73 | | |
74 | | virtual int32_t flags() const PURE; |
75 | | virtual void flags(int32_t flags) PURE; |
76 | | virtual const std::string& fullCollectionName() const PURE; |
77 | | virtual void fullCollectionName(const std::string& name) PURE; |
78 | | virtual const std::list<Bson::DocumentSharedPtr>& documents() const PURE; |
79 | | virtual std::list<Bson::DocumentSharedPtr>& documents() PURE; |
80 | | }; |
81 | | |
82 | | using InsertMessagePtr = std::unique_ptr<InsertMessage>; |
83 | | |
84 | | /** |
85 | | * Mongo OP_KILL_CURSORS message. |
86 | | */ |
87 | | class KillCursorsMessage : public virtual Message { |
88 | | public: |
89 | | virtual bool operator==(const KillCursorsMessage& rhs) const PURE; |
90 | | |
91 | | virtual int32_t numberOfCursorIds() const PURE; |
92 | | virtual void numberOfCursorIds(int32_t number_of_cursors_ids) PURE; |
93 | | virtual const std::vector<int64_t>& cursorIds() const PURE; |
94 | | virtual void cursorIds(std::vector<int64_t>&& cursors_ids) PURE; |
95 | | }; |
96 | | |
97 | | using KillCursorsMessagePtr = std::unique_ptr<KillCursorsMessage>; |
98 | | |
99 | | /** |
100 | | * Mongo OP_QUERY message. |
101 | | */ |
102 | | class QueryMessage : public virtual Message { |
103 | | public: |
104 | | struct Flags { |
105 | | // clang-format off |
106 | | static const int32_t TailableCursor = 0x1 << 1; |
107 | | static const int32_t NoCursorTimeout = 0x1 << 4; |
108 | | static const int32_t AwaitData = 0x1 << 5; |
109 | | static const int32_t Exhaust = 0x1 << 6; |
110 | | // clang-format on |
111 | | }; |
112 | | |
113 | | virtual bool operator==(const QueryMessage& rhs) const PURE; |
114 | | |
115 | | virtual int32_t flags() const PURE; |
116 | | virtual void flags(int32_t flags) PURE; |
117 | | virtual const std::string& fullCollectionName() const PURE; |
118 | | virtual void fullCollectionName(const std::string& name) PURE; |
119 | | virtual int32_t numberToSkip() const PURE; |
120 | | virtual void numberToSkip(int32_t skip) PURE; |
121 | | virtual int32_t numberToReturn() const PURE; |
122 | | virtual void numberToReturn(int32_t to_return) PURE; |
123 | | virtual const Bson::Document* query() const PURE; |
124 | | virtual void query(Bson::DocumentSharedPtr&& query) PURE; |
125 | | virtual const Bson::Document* returnFieldsSelector() const PURE; |
126 | | virtual void returnFieldsSelector(Bson::DocumentSharedPtr&& fields) PURE; |
127 | | }; |
128 | | |
129 | | using QueryMessagePtr = std::unique_ptr<QueryMessage>; |
130 | | |
131 | | /** |
132 | | * Mongo OP_REPLY |
133 | | */ |
134 | | class ReplyMessage : public virtual Message { |
135 | | public: |
136 | | struct Flags { |
137 | | // clang-format off |
138 | | static const int32_t CursorNotFound = 0x1 << 0; |
139 | | static const int32_t QueryFailure = 0x1 << 1; |
140 | | // clang-format on |
141 | | }; |
142 | | |
143 | | virtual bool operator==(const ReplyMessage& rhs) const PURE; |
144 | | |
145 | | virtual int32_t flags() const PURE; |
146 | | virtual void flags(int32_t flags) PURE; |
147 | | virtual int64_t cursorId() const PURE; |
148 | | virtual void cursorId(int64_t cursor_id) PURE; |
149 | | virtual int32_t startingFrom() const PURE; |
150 | | virtual void startingFrom(int32_t starting_from) PURE; |
151 | | virtual int32_t numberReturned() const PURE; |
152 | | virtual void numberReturned(int32_t number_returned) PURE; |
153 | | virtual const std::list<Bson::DocumentSharedPtr>& documents() const PURE; |
154 | | virtual std::list<Bson::DocumentSharedPtr>& documents() PURE; |
155 | | }; |
156 | | |
157 | | using ReplyMessagePtr = std::unique_ptr<ReplyMessage>; |
158 | | |
159 | | class CommandMessage : public virtual Message { |
160 | | public: |
161 | | // CommandMessage accessors. |
162 | | virtual bool operator==(const CommandMessage& rhs) const PURE; |
163 | | virtual std::string database() const PURE; |
164 | | virtual void database(std::string database) PURE; |
165 | | virtual std::string commandName() const PURE; |
166 | | virtual void commandName(std::string command_name) PURE; |
167 | | virtual const Bson::Document* metadata() const PURE; |
168 | | virtual void metadata(Bson::DocumentSharedPtr&& metadata) PURE; |
169 | | virtual const Bson::Document* commandArgs() const PURE; |
170 | | virtual void commandArgs(Bson::DocumentSharedPtr&& command_args) PURE; |
171 | | virtual const std::list<Bson::DocumentSharedPtr>& inputDocs() const PURE; |
172 | | virtual std::list<Bson::DocumentSharedPtr>& inputDocs() PURE; |
173 | | }; |
174 | | |
175 | | using CommandMessagePtr = std::unique_ptr<CommandMessage>; |
176 | | |
177 | | class CommandReplyMessage : public virtual Message { |
178 | | public: |
179 | | virtual bool operator==(const CommandReplyMessage& rhs) const PURE; |
180 | | virtual const Bson::Document* metadata() const PURE; |
181 | | virtual void metadata(Bson::DocumentSharedPtr&& metadata) PURE; |
182 | | virtual const Bson::Document* commandReply() const PURE; |
183 | | virtual void commandReply(Bson::DocumentSharedPtr&& command_reply) PURE; |
184 | | virtual const std::list<Bson::DocumentSharedPtr>& outputDocs() const PURE; |
185 | | virtual std::list<Bson::DocumentSharedPtr>& outputDocs() PURE; |
186 | | }; |
187 | | |
188 | | using CommandReplyMessagePtr = std::unique_ptr<CommandReplyMessage>; |
189 | | |
190 | | /** |
191 | | * General callbacks for dispatching decoded mongo messages to a sink. |
192 | | */ |
193 | | class DecoderCallbacks { |
194 | | public: |
195 | 2.62k | virtual ~DecoderCallbacks() = default; |
196 | | |
197 | | virtual void decodeGetMore(GetMoreMessagePtr&& message) PURE; |
198 | | virtual void decodeInsert(InsertMessagePtr&& message) PURE; |
199 | | virtual void decodeKillCursors(KillCursorsMessagePtr&& message) PURE; |
200 | | virtual void decodeQuery(QueryMessagePtr&& message) PURE; |
201 | | virtual void decodeReply(ReplyMessagePtr&& message) PURE; |
202 | | virtual void decodeCommand(CommandMessagePtr&& message) PURE; |
203 | | virtual void decodeCommandReply(CommandReplyMessagePtr&& message) PURE; |
204 | | }; |
205 | | |
206 | | /** |
207 | | * Mongo message decoder. |
208 | | */ |
209 | | class Decoder { |
210 | | public: |
211 | 2.14k | virtual ~Decoder() = default; |
212 | | |
213 | | virtual void onData(Buffer::Instance& data) PURE; |
214 | | }; |
215 | | |
216 | | using DecoderPtr = std::unique_ptr<Decoder>; |
217 | | |
218 | | /** |
219 | | * Mongo message encoder. |
220 | | */ |
221 | | class Encoder { |
222 | | public: |
223 | 0 | virtual ~Encoder() = default; |
224 | | |
225 | | virtual void encodeGetMore(const GetMoreMessage& message) PURE; |
226 | | virtual void encodeInsert(const InsertMessage& message) PURE; |
227 | | virtual void encodeKillCursors(const KillCursorsMessage& message) PURE; |
228 | | virtual void encodeQuery(const QueryMessage& message) PURE; |
229 | | virtual void encodeReply(const ReplyMessage& message) PURE; |
230 | | virtual void encodeCommand(const CommandMessage& message) PURE; |
231 | | virtual void encodeCommandReply(const CommandReplyMessage& message) PURE; |
232 | | }; |
233 | | |
234 | | } // namespace MongoProxy |
235 | | } // namespace NetworkFilters |
236 | | } // namespace Extensions |
237 | | } // namespace Envoy |