blob: 1ed2d389616e2a68ffa5b6a6eb09b0352f788e1b [file] [log] [blame]
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08001/*
2 *
Craig Tiller06059952015-02-18 08:34:56 -08003 * Copyright 2015, Google Inc.
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
34#include <grpc++/client_context.h>
35
36#include <grpc/grpc.h>
yang-gc07d9bf2015-07-28 09:19:22 -070037#include <grpc/support/alloc.h>
David Garcia Quintasd7d9ce22015-06-30 23:29:03 -070038#include <grpc/support/string_util.h>
Yang Gaoa8938922015-05-14 11:51:07 -070039#include <grpc++/credentials.h>
Craig Tillerbb536142015-08-05 15:18:19 -070040#include <grpc++/server_context.h>
Nicolas Noble89219162015-04-07 18:01:18 -070041#include <grpc++/time.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080042
David Garcia Quintasd7d9ce22015-06-30 23:29:03 -070043#include "src/core/channel/compress_filter.h"
yang-g3abe60b2015-07-06 14:00:36 -070044#include "src/cpp/common/create_auth_context.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080045
46namespace grpc {
47
48ClientContext::ClientContext()
Craig Tillercf133f42015-02-26 14:05:56 -080049 : initial_metadata_received_(false),
50 call_(nullptr),
51 cq_(nullptr),
Craig Tillerbb536142015-08-05 15:18:19 -070052 deadline_(gpr_inf_future(GPR_CLOCK_REALTIME)),
53 propagate_from_call_(nullptr) {}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080054
55ClientContext::~ClientContext() {
56 if (call_) {
57 grpc_call_destroy(call_);
58 }
59 if (cq_) {
nnoble0c475f02014-12-05 15:37:39 -080060 // Drain cq_.
Craig Tiller64be9f72015-05-04 14:53:51 -070061 grpc_completion_queue_shutdown(cq_);
Craig Tiller143e7bf2015-07-13 08:41:49 -070062 while (grpc_completion_queue_next(cq_, gpr_inf_future(GPR_CLOCK_REALTIME))
63 .type != GRPC_QUEUE_SHUTDOWN)
Craig Tiller64be9f72015-05-04 14:53:51 -070064 ;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080065 grpc_completion_queue_destroy(cq_);
66 }
67}
68
Craig Tiller2c3be1d2015-08-05 15:59:27 -070069std::unique_ptr<ClientContext> ClientContext::FromServerContext(
70 const ServerContext& context, PropagationOptions options) {
71 std::unique_ptr<ClientContext> ctx(new ClientContext);
72 ctx->propagate_from_call_ = context.call_;
73 ctx->propagation_options_ = options;
Craig Tillerbb536142015-08-05 15:18:19 -070074 return ctx;
75}
76
Yang Gao6baa9b62015-03-17 10:49:39 -070077void ClientContext::AddMetadata(const grpc::string& meta_key,
78 const grpc::string& meta_value) {
Yang Gao968ca532015-02-11 16:23:47 -080079 send_initial_metadata_.insert(std::make_pair(meta_key, meta_value));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080080}
81
Yang Gaoa8938922015-05-14 11:51:07 -070082void ClientContext::set_call(grpc_call* call,
83 const std::shared_ptr<ChannelInterface>& channel) {
84 GPR_ASSERT(call_ == nullptr);
85 call_ = call;
86 channel_ = channel;
87 if (creds_ && !creds_->ApplyToCall(call_)) {
88 grpc_call_cancel_with_status(call, GRPC_STATUS_CANCELLED,
89 "Failed to set credentials to rpc.");
90 }
91}
92
Craig Tillerbf6abee2015-07-19 22:31:04 -070093void ClientContext::set_compression_algorithm(
David Garcia Quintasd7d9ce22015-06-30 23:29:03 -070094 grpc_compression_algorithm algorithm) {
95 char* algorithm_name = NULL;
96 if (!grpc_compression_algorithm_name(algorithm, &algorithm_name)) {
97 gpr_log(GPR_ERROR, "Name for compression algorithm '%d' unknown.",
98 algorithm);
99 abort();
100 }
101 GPR_ASSERT(algorithm_name != NULL);
102 AddMetadata(GRPC_COMPRESS_REQUEST_ALGORITHM_KEY, algorithm_name);
103}
104
yang-g85c04f92015-07-07 17:47:31 -0700105std::shared_ptr<const AuthContext> ClientContext::auth_context() const {
106 if (auth_context_.get() == nullptr) {
107 auth_context_ = CreateAuthContext(call_);
108 }
109 return auth_context_;
yang-g3abe60b2015-07-06 14:00:36 -0700110}
111
Yang Gao406b32f2015-02-13 16:25:33 -0800112void ClientContext::TryCancel() {
113 if (call_) {
114 grpc_call_cancel(call_);
115 }
116}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800117
yang-gc07d9bf2015-07-28 09:19:22 -0700118grpc::string ClientContext::peer() const {
119 grpc::string peer;
120 if (call_) {
121 char* c_peer = grpc_call_get_peer(call_);
122 peer = c_peer;
123 gpr_free(c_peer);
124 }
125 return peer;
126}
127
Craig Tiller190d3602015-02-18 09:23:38 -0800128} // namespace grpc