From d74b9e518b7448910ac92fa45b53ba8180af7b8c Mon Sep 17 00:00:00 2001 From: Ben Pope Date: Fri, 28 Jan 2022 21:07:10 +0000 Subject: [PATCH] schema_registry/proto: Support encoded proto Support decoding a protobuf FileDescriptor as encoded protobuf. Fix #3633 Signed-off-by: Ben Pope --- src/v/pandaproxy/schema_registry/protobuf.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/v/pandaproxy/schema_registry/protobuf.cc b/src/v/pandaproxy/schema_registry/protobuf.cc index bc41c83d4d66..e5f381abce5b 100644 --- a/src/v/pandaproxy/schema_registry/protobuf.cc +++ b/src/v/pandaproxy/schema_registry/protobuf.cc @@ -14,6 +14,7 @@ #include "pandaproxy/logger.h" #include "pandaproxy/schema_registry/errors.h" #include "pandaproxy/schema_registry/sharded_store.h" +#include "utils/base64.h" #include "vlog.h" #include @@ -21,6 +22,7 @@ #include #include #include +#include #include #include @@ -136,10 +138,19 @@ class parser { pb::io::Tokenizer t{&is, &error_collector}; _parser.RecordErrorsTo(&error_collector); + // Attempt parse a .proto file if (!_parser.Parse(&t, &_fdp)) { - throw as_exception(error_collector.error()); + // base64 decode the schema + std::string_view b64_def{ + schema.def().raw()().data(), schema.def().raw()().size()}; + auto bytes_def = base64_to_bytes(b64_def); + + // Attempt parse as an encoded FileDescriptorProto.pb + if (!_fdp.ParseFromArray( + bytes_def.data(), static_cast(bytes_def.size()))) { + throw as_exception(error_collector.error()); + } } - _fdp.set_name(schema.sub()()); return _fdp; }