summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/legacy_request_builder.cpp
diff options
context:
space:
mode:
authorMathias Stearn <mathias@10gen.com>2017-06-21 16:09:31 -0400
committerMathias Stearn <mathias@10gen.com>2017-06-28 11:57:04 -0400
commit829e5b1628ce058509ada9e0ebaf00a712751193 (patch)
tree9b0916b29f43bdde27231e273a325959ff23e51a /src/mongo/rpc/legacy_request_builder.cpp
parentb70aab6e1f4c3230da27aa04cb6fa25f2341b9a6 (diff)
downloadmongo-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.cpp14
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