Initial metadata fix

pull/501/head
Craig Tiller 10 years ago
parent 3b29b566a2
commit a5c0e7bc46
  1. 7
      include/grpc++/client_context.h
  2. 23
      include/grpc++/impl/call.h
  3. 2
      src/cpp/client/client_context.cc
  4. 1
      src/cpp/client/client_unary_call.cc
  5. 19
      src/cpp/common/call.cc

@ -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

@ -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 {

@ -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() {}

@ -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();

@ -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_;

Loading…
Cancel
Save