diff options
author | Mathias Stearn <mathias@10gen.com> | 2017-06-21 16:09:31 -0400 |
---|---|---|
committer | Mathias Stearn <mathias@10gen.com> | 2017-06-28 11:57:04 -0400 |
commit | 829e5b1628ce058509ada9e0ebaf00a712751193 (patch) | |
tree | 9b0916b29f43bdde27231e273a325959ff23e51a /src/mongo/rpc/legacy_request_builder.cpp | |
parent | b70aab6e1f4c3230da27aa04cb6fa25f2341b9a6 (diff) | |
download | mongo-829e5b1628ce058509ada9e0ebaf00a712751193.tar.gz |
SERVER-28509 Downconvert document sequences when serializing requests to old protocols
Diffstat (limited to 'src/mongo/rpc/legacy_request_builder.cpp')
-rw-r--r-- | src/mongo/rpc/legacy_request_builder.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mongo/rpc/legacy_request_builder.cpp b/src/mongo/rpc/legacy_request_builder.cpp index f4a9252f921..80ace2b994e 100644 --- a/src/mongo/rpc/legacy_request_builder.cpp +++ b/src/mongo/rpc/legacy_request_builder.cpp @@ -45,12 +45,19 @@ namespace mongo { namespace rpc { namespace { +void mergeInDocumentSequences(const OpMsgRequest& request, BSONObjBuilder* body) { + for (auto&& seq : request.sequences) { + invariant(seq.name.find('.') == std::string::npos); // Only support top-level for now. + dassert(!body->asTempObj().hasField(seq.name)); + body->append(seq.name, seq.objs); + } +} + /** * Given a command request, attempts to construct a legacy command * object and query flags bitfield augmented with the given metadata. */ BSONObj downconvertRequestBody(const OpMsgRequest& request, int* queryOptions) { - invariant(request.sequences.empty()); // Not supported yet. *queryOptions = 0; if (auto readPref = request.body["$readPreference"]) { @@ -70,11 +77,14 @@ BSONObj downconvertRequestBody(const OpMsgRequest& request, int* queryOptions) { inner.append(field); } } + mergeInDocumentSequences(request, &inner); } outer.append(readPref); return outer.obj(); } else { - return request.body.removeField("$db"); // No additional downconversion needed. + BSONObjBuilder body(request.body.removeField("$db")); + mergeInDocumentSequences(request, &body); + return body.obj(); } } } // namespace |