blob: c68f6dd9f8da1fa03b1533349b0d9e9e22dd4117 [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 Gaoa8938922015-05-14 11:51:07 -070037#include <grpc++/credentials.h>
Nicolas Noble89219162015-04-07 18:01:18 -070038#include <grpc++/time.h>
yang-g3abe60b2015-07-06 14:00:36 -070039#include "src/cpp/common/create_auth_context.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040
41namespace grpc {
42
43ClientContext::ClientContext()
Craig Tillercf133f42015-02-26 14:05:56 -080044 : initial_metadata_received_(false),
45 call_(nullptr),
46 cq_(nullptr),
Nicolas Noble89219162015-04-07 18:01:18 -070047 deadline_(gpr_inf_future) {}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080048
49ClientContext::~ClientContext() {
50 if (call_) {
51 grpc_call_destroy(call_);
52 }
53 if (cq_) {
nnoble0c475f02014-12-05 15:37:39 -080054 // Drain cq_.
Craig Tiller64be9f72015-05-04 14:53:51 -070055 grpc_completion_queue_shutdown(cq_);
56 while (grpc_completion_queue_next(cq_, gpr_inf_future).type !=
57 GRPC_QUEUE_SHUTDOWN)
58 ;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080059 grpc_completion_queue_destroy(cq_);
60 }
61}
62
Yang Gao6baa9b62015-03-17 10:49:39 -070063void ClientContext::AddMetadata(const grpc::string& meta_key,
64 const grpc::string& meta_value) {
Yang Gao968ca532015-02-11 16:23:47 -080065 send_initial_metadata_.insert(std::make_pair(meta_key, meta_value));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080066}
67
Yang Gaoa8938922015-05-14 11:51:07 -070068void ClientContext::set_call(grpc_call* call,
69 const std::shared_ptr<ChannelInterface>& channel) {
70 GPR_ASSERT(call_ == nullptr);
71 call_ = call;
72 channel_ = channel;
73 if (creds_ && !creds_->ApplyToCall(call_)) {
74 grpc_call_cancel_with_status(call, GRPC_STATUS_CANCELLED,
75 "Failed to set credentials to rpc.");
76 }
77}
78
yang-g85c04f92015-07-07 17:47:31 -070079std::shared_ptr<const AuthContext> ClientContext::auth_context() const {
80 if (auth_context_.get() == nullptr) {
81 auth_context_ = CreateAuthContext(call_);
82 }
83 return auth_context_;
yang-g3abe60b2015-07-06 14:00:36 -070084}
85
Yang Gao406b32f2015-02-13 16:25:33 -080086void ClientContext::TryCancel() {
87 if (call_) {
88 grpc_call_cancel(call_);
89 }
90}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080091
Craig Tiller190d3602015-02-18 09:23:38 -080092} // namespace grpc