diff --git a/include/grpc++/server_context.h b/include/grpc++/server_context.h index 790dd7116b4..6fa01f5f196 100644 --- a/include/grpc++/server_context.h +++ b/include/grpc++/server_context.h @@ -53,12 +53,18 @@ class ServerContext { std::chrono::system_clock::time_point absolute_deadline() { return deadline_; } + void AddInitialMetadata(const grpc::string& key, const grpc::string& value); + void AddTrailingMetadata(const grpc::string& key, const grpc::string& value); + private: friend class ::grpc::Server; ServerContext(gpr_timespec deadline, grpc_metadata *metadata, size_t metadata_count); const std::chrono::system_clock::time_point deadline_; - std::multimap metadata_; + bool sent_initial_metadata_ = false; + std::multimap client_metadata_; + std::multimap initial_metadata_; + std::multimap trailing_metadata_; }; } // namespace grpc diff --git a/src/cpp/server/server.cc b/src/cpp/server/server.cc index 8974850b8ce..43927393675 100644 --- a/src/cpp/server/server.cc +++ b/src/cpp/server/server.cc @@ -172,10 +172,13 @@ class Server::MethodRequestData final : public CompletionQueueTag { auto status = method_->handler()->RunHandler( MethodHandler::HandlerParameter(&call_, &ctx_, req.get(), res.get())); CallOpBuffer buf; - buf.AddServerSendStatus(nullptr, status); + if (!ctx_.sent_initial_metadata_) { + buf.AddSendInitialMetadata(&ctx_.initial_metadata_); + } if (has_response_payload_) { buf.AddSendMessage(*res); } + buf.AddServerSendStatus(&ctx_.trailing_metadata_, status); call_.PerformOps(&buf); GPR_ASSERT(cq_.Pluck(&buf)); } diff --git a/src/cpp/server/server_context.cc b/src/cpp/server/server_context.cc index 7e0bc4de36a..2bf4104d766 100644 --- a/src/cpp/server/server_context.cc +++ b/src/cpp/server/server_context.cc @@ -37,11 +37,14 @@ namespace grpc { -ServerContext::ServerContext(gpr_timespec deadline, grpc_metadata *metadata, size_t metadata_count) - : deadline_(Timespec2Timepoint(deadline)) { +ServerContext::ServerContext(gpr_timespec deadline, grpc_metadata *metadata, + size_t metadata_count) + : deadline_(Timespec2Timepoint(deadline)) { for (size_t i = 0; i < metadata_count; i++) { - metadata_.insert(std::make_pair(grpc::string(metadata[i].key), - grpc::string(metadata[i].value, metadata[i].value + metadata[i].value_length))); + client_metadata_.insert(std::make_pair( + grpc::string(metadata[i].key), + grpc::string(metadata[i].value, + metadata[i].value + metadata[i].value_length))); } }