aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/grpc++/client_context.h7
-rw-r--r--include/grpc++/impl/call.h23
-rw-r--r--src/cpp/client/client_context.cc2
-rw-r--r--src/cpp/client/client_unary_call.cc1
-rw-r--r--src/cpp/common/call.cc19
5 files changed, 32 insertions, 20 deletions
diff --git a/include/grpc++/client_context.h b/include/grpc++/client_context.h
index 0cf6bdc647..a6e8ccc67c 100644
--- a/include/grpc++/client_context.h
+++ b/include/grpc++/client_context.h
@@ -35,8 +35,8 @@
#define __GRPCPP_CLIENT_CONTEXT_H__
#include <chrono>
+#include <map>
#include <string>
-#include <vector>
#include <grpc/support/log.h>
#include <grpc/support/time.h>
@@ -49,6 +49,8 @@ struct grpc_completion_queue;
namespace grpc {
+class CallOpBuffer;
+
class ClientContext {
public:
ClientContext();
@@ -67,6 +69,7 @@ class ClientContext {
ClientContext(const ClientContext &);
ClientContext &operator=(const ClientContext &);
+ friend class CallOpBuffer;
friend class Channel;
friend class StreamContext;
@@ -84,7 +87,7 @@ class ClientContext {
grpc_call *call_;
grpc_completion_queue *cq_;
gpr_timespec absolute_deadline_;
- std::vector<std::pair<grpc::string, grpc::string> > metadata_;
+ std::multimap<grpc::string, grpc::string> metadata_;
};
} // namespace grpc
diff --git a/include/grpc++/impl/call.h b/include/grpc++/impl/call.h
index 141b16ab5b..d0cb9024ba 100644
--- a/include/grpc++/impl/call.h
+++ b/include/grpc++/impl/call.h
@@ -63,11 +63,13 @@ class CallOpBuffer final : public CompletionQueueTag {
// Does not take ownership.
void AddSendInitialMetadata(
std::multimap<grpc::string, grpc::string> *metadata);
+ void AddSendInitialMetadata(ClientContext *ctx);
void AddSendMessage(const google::protobuf::Message &message);
void AddRecvMessage(google::protobuf::Message *message);
void AddClientSendClose();
void AddClientRecvStatus(Status *status);
- void AddServerSendStatus(std::multimap<grpc::string, grpc::string> *metadata, const Status& status);
+ void AddServerSendStatus(std::multimap<grpc::string, grpc::string> *metadata,
+ const Status &status);
// INTERNAL API:
@@ -79,20 +81,21 @@ class CallOpBuffer final : public CompletionQueueTag {
private:
void *return_tag_ = nullptr;
+ bool send_initial_metadata_ = false;
size_t initial_metadata_count_ = 0;
- grpc_metadata* initial_metadata_ = nullptr;
- const google::protobuf::Message* send_message_ = nullptr;
- grpc_byte_buffer* send_message_buf_ = nullptr;
- google::protobuf::Message* recv_message_ = nullptr;
- grpc_byte_buffer* recv_message_buf_ = nullptr;
+ grpc_metadata *initial_metadata_ = nullptr;
+ const google::protobuf::Message *send_message_ = nullptr;
+ grpc_byte_buffer *send_message_buf_ = nullptr;
+ google::protobuf::Message *recv_message_ = nullptr;
+ grpc_byte_buffer *recv_message_buf_ = nullptr;
bool client_send_close_ = false;
- Status* recv_status_ = nullptr;
+ Status *recv_status_ = nullptr;
grpc_status_code status_code_ = GRPC_STATUS_OK;
- char* status_details_ = nullptr;
+ char *status_details_ = nullptr;
size_t status_details_capacity_ = 0;
- Status* send_status_ = nullptr;
+ Status *send_status_ = nullptr;
size_t trailing_metadata_count_ = 0;
- grpc_metadata* trailing_metadata_ = nullptr;
+ grpc_metadata *trailing_metadata_ = nullptr;
};
class CCallDeleter {
diff --git a/src/cpp/client/client_context.cc b/src/cpp/client/client_context.cc
index 7bda2d07c3..5c2772f5df 100644
--- a/src/cpp/client/client_context.cc
+++ b/src/cpp/client/client_context.cc
@@ -72,7 +72,7 @@ system_clock::time_point ClientContext::absolute_deadline() {
void ClientContext::AddMetadata(const grpc::string &meta_key,
const grpc::string &meta_value) {
- return;
+ metadata_.insert(std::make_pair(meta_key, meta_value));
}
void ClientContext::StartCancel() {}
diff --git a/src/cpp/client/client_unary_call.cc b/src/cpp/client/client_unary_call.cc
index 8598592068..73be3cff8c 100644
--- a/src/cpp/client/client_unary_call.cc
+++ b/src/cpp/client/client_unary_call.cc
@@ -48,6 +48,7 @@ Status BlockingUnaryCall(ChannelInterface *channel, const RpcMethod &method,
Call call(channel->CreateCall(method, context, &cq));
CallOpBuffer buf;
Status status;
+ buf.AddSendInitialMetadata(context);
buf.AddSendMessage(request);
buf.AddRecvMessage(result);
buf.AddClientSendClose();
diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc
index b2cd55fe24..f97240d067 100644
--- a/src/cpp/common/call.cc
+++ b/src/cpp/common/call.cc
@@ -31,9 +31,10 @@
*
*/
-#include <include/grpc/support/alloc.h>
-#include <include/grpc++/impl/call.h>
-#include <include/grpc++/channel_interface.h>
+#include <grpc/support/alloc.h>
+#include <grpc++/impl/call.h>
+#include <grpc++/client_context.h>
+#include <grpc++/channel_interface.h>
#include "src/cpp/proto/proto_utils.h"
@@ -41,10 +42,9 @@ namespace grpc {
void CallOpBuffer::Reset(void* next_return_tag) {
return_tag_ = next_return_tag;
+ send_initial_metadata_ = false;
initial_metadata_count_ = 0;
- if (initial_metadata_) {
- gpr_free(initial_metadata_);
- }
+ gpr_free(initial_metadata_);
send_message_ = nullptr;
if (send_message_buf_) {
grpc_byte_buffer_destroy(send_message_buf_);
@@ -87,10 +87,15 @@ grpc_metadata* FillMetadata(
void CallOpBuffer::AddSendInitialMetadata(
std::multimap<grpc::string, grpc::string>* metadata) {
+ send_initial_metadata_ = true;
initial_metadata_count_ = metadata->size();
initial_metadata_ = FillMetadata(metadata);
}
+void CallOpBuffer::AddSendInitialMetadata(ClientContext *ctx) {
+ AddSendInitialMetadata(&ctx->metadata_);
+}
+
void CallOpBuffer::AddSendMessage(const google::protobuf::Message& message) {
send_message_ = &message;
}
@@ -114,7 +119,7 @@ void CallOpBuffer::AddServerSendStatus(std::multimap<grpc::string, grpc::string>
void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) {
*nops = 0;
- if (initial_metadata_count_) {
+ if (send_initial_metadata_) {
ops[*nops].op = GRPC_OP_SEND_INITIAL_METADATA;
ops[*nops].data.send_initial_metadata.count = initial_metadata_count_;
ops[*nops].data.send_initial_metadata.metadata = initial_metadata_;