Coverage Report

Created: 2023-11-12 09:30

/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