blob: b40c48381f4296da467ce53df4cd9ac9b8420258 [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
Craig Tiller42bc87c2015-02-23 08:50:19 -080034#include <grpc/grpc.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080035
yangg4105e2b2015-01-09 14:19:44 -080036#include <string.h>
37
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080038#include "src/core/channel/channel_stack.h"
Craig Tiller485d7762015-01-23 12:54:05 -080039#include "src/core/support/string.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080040#include "src/core/surface/channel.h"
41#include "src/core/surface/call.h"
42#include <grpc/support/alloc.h>
43#include <grpc/support/log.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080044
Yang Gao5fd0d292015-01-26 00:19:48 -080045typedef struct {
46 void *unused;
47} call_data;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080048
Yang Gao5fd0d292015-01-26 00:19:48 -080049typedef struct {
Craig Tillera847a8f2015-02-11 21:20:25 -080050 grpc_mdelem *status;
Yang Gao5fd0d292015-01-26 00:19:48 -080051 grpc_mdelem *message;
52} channel_data;
yangg4105e2b2015-01-09 14:19:44 -080053
ctillerf962f522014-12-10 15:28:27 -080054static void call_op(grpc_call_element *elem, grpc_call_element *from_elem,
55 grpc_call_op *op) {
yangg4105e2b2015-01-09 14:19:44 -080056 channel_data *channeld = elem->channel_data;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080057 GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
58
59 switch (op->type) {
Craig Tillercce17ac2015-01-20 09:29:28 -080060 case GRPC_SEND_START:
Craig Tillera847a8f2015-02-11 21:20:25 -080061 grpc_call_recv_metadata(elem, grpc_mdelem_ref(channeld->status));
Craig Tillercce17ac2015-01-20 09:29:28 -080062 grpc_call_recv_metadata(elem, grpc_mdelem_ref(channeld->message));
63 grpc_call_stream_closed(elem);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080064 break;
65 case GRPC_SEND_METADATA:
66 grpc_mdelem_unref(op->data.metadata);
67 break;
68 default:
69 break;
70 }
71
72 op->done_cb(op->user_data, GRPC_OP_ERROR);
73}
74
ctillerf962f522014-12-10 15:28:27 -080075static void channel_op(grpc_channel_element *elem,
76 grpc_channel_element *from_elem, grpc_channel_op *op) {
nnoble0c475f02014-12-05 15:37:39 -080077 switch (op->type) {
78 case GRPC_CHANNEL_GOAWAY:
79 gpr_slice_unref(op->data.goaway.message);
80 break;
Craig Tiller8aa09c32015-02-05 10:17:03 -080081 case GRPC_CHANNEL_DISCONNECT:
82 grpc_client_channel_closed(elem);
83 break;
nnoble0c475f02014-12-05 15:37:39 -080084 default:
85 break;
86 }
87}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080088
89static void init_call_elem(grpc_call_element *elem,
90 const void *transport_server_data) {}
91
92static void destroy_call_elem(grpc_call_element *elem) {}
93
94static void init_channel_elem(grpc_channel_element *elem,
95 const grpc_channel_args *args, grpc_mdctx *mdctx,
96 int is_first, int is_last) {
yangg4105e2b2015-01-09 14:19:44 -080097 channel_data *channeld = elem->channel_data;
Craig Tillera847a8f2015-02-11 21:20:25 -080098 char status[12];
yangg4105e2b2015-01-09 14:19:44 -080099
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800100 GPR_ASSERT(is_first);
101 GPR_ASSERT(is_last);
yangg4105e2b2015-01-09 14:19:44 -0800102
103 channeld->message = grpc_mdelem_from_strings(mdctx, "grpc-message",
104 "Rpc sent on a lame channel.");
Craig Tillera847a8f2015-02-11 21:20:25 -0800105 gpr_ltoa(GRPC_STATUS_UNKNOWN, status);
106 channeld->status = grpc_mdelem_from_strings(mdctx, "grpc-status", status);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800107}
108
yangg4105e2b2015-01-09 14:19:44 -0800109static void destroy_channel_elem(grpc_channel_element *elem) {
110 channel_data *channeld = elem->channel_data;
111
112 grpc_mdelem_unref(channeld->message);
Craig Tillera847a8f2015-02-11 21:20:25 -0800113 grpc_mdelem_unref(channeld->status);
yangg4105e2b2015-01-09 14:19:44 -0800114}
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800115
116static const grpc_channel_filter lame_filter = {
Yang Gao5fd0d292015-01-26 00:19:48 -0800117 call_op, channel_op, sizeof(call_data),
118 init_call_elem, destroy_call_elem, sizeof(channel_data),
119 init_channel_elem, destroy_channel_elem, "lame-client", };
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800120
nnoble0c475f02014-12-05 15:37:39 -0800121grpc_channel *grpc_lame_client_channel_create(void) {
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800122 static const grpc_channel_filter *filters[] = {&lame_filter};
123 return grpc_channel_create_from_filters(filters, 1, NULL, grpc_mdctx_create(),
124 1);
Craig Tiller190d3602015-02-18 09:23:38 -0800125}