blob: 5f7e1be26823140c054c8185534c269902e2ec9d [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 "src/core/channel/channel_stack.h"
35
36#include <stdarg.h>
37#include <stdio.h>
38#include <string.h>
39
Craig Tiller485d7762015-01-23 12:54:05 -080040#include "src/core/support/string.h"
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080041#include <grpc/support/alloc.h>
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080042#include <grpc/support/useful.h>
43
Craig Tillerd90e2992015-01-23 14:04:16 -080044static void put_metadata(gpr_strvec *b, grpc_mdelem *md) {
45 gpr_strvec_add(b, gpr_strdup(" key="));
Craig Tiller87d5b192015-04-16 14:37:57 -070046 gpr_strvec_add(
47 b, gpr_hexdump((char *)GPR_SLICE_START_PTR(md->key->slice),
48 GPR_SLICE_LENGTH(md->key->slice), GPR_HEXDUMP_PLAINTEXT));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080049
Craig Tillerd90e2992015-01-23 14:04:16 -080050 gpr_strvec_add(b, gpr_strdup(" value="));
51 gpr_strvec_add(b, gpr_hexdump((char *)GPR_SLICE_START_PTR(md->value->slice),
Craig Tiller87d5b192015-04-16 14:37:57 -070052 GPR_SLICE_LENGTH(md->value->slice),
53 GPR_HEXDUMP_PLAINTEXT));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080054}
55
Craig Tiller205aee12015-04-16 14:46:41 -070056static void put_metadata_list(gpr_strvec *b, grpc_metadata_batch md) {
Craig Tiller6902ad22015-04-16 08:01:49 -070057 grpc_linked_mdelem *m;
Craig Tiller9c9d4e02015-04-20 09:03:29 -070058 for (m = md.list.head; m != NULL; m = m->next) {
Craig Tiller6902ad22015-04-16 08:01:49 -070059 put_metadata(b, m->md);
60 }
61 if (gpr_time_cmp(md.deadline, gpr_inf_future) != 0) {
62 char *tmp;
Craig Tiller87d5b192015-04-16 14:37:57 -070063 gpr_asprintf(&tmp, " deadline=%d.%09d", md.deadline.tv_sec,
64 md.deadline.tv_nsec);
Craig Tiller6902ad22015-04-16 08:01:49 -070065 gpr_strvec_add(b, tmp);
66 }
67}
68
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080069char *grpc_call_op_string(grpc_call_op *op) {
Craig Tillerd90e2992015-01-23 14:04:16 -080070 char *tmp;
71 char *out;
72
73 gpr_strvec b;
74 gpr_strvec_init(&b);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080075
76 switch (op->dir) {
77 case GRPC_CALL_DOWN:
Craig Tillerd90e2992015-01-23 14:04:16 -080078 gpr_strvec_add(&b, gpr_strdup(">"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080079 break;
80 case GRPC_CALL_UP:
Craig Tillerd90e2992015-01-23 14:04:16 -080081 gpr_strvec_add(&b, gpr_strdup("<"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080082 break;
83 }
84 switch (op->type) {
85 case GRPC_SEND_METADATA:
Craig Tillerd90e2992015-01-23 14:04:16 -080086 gpr_strvec_add(&b, gpr_strdup("SEND_METADATA"));
Craig Tiller6902ad22015-04-16 08:01:49 -070087 put_metadata_list(&b, op->data.metadata);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080088 break;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080089 case GRPC_SEND_MESSAGE:
Craig Tillerd90e2992015-01-23 14:04:16 -080090 gpr_strvec_add(&b, gpr_strdup("SEND_MESSAGE"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080091 break;
Craig Tiller7cfa2d92015-01-19 15:41:49 -080092 case GRPC_SEND_PREFORMATTED_MESSAGE:
Craig Tillerec4e0cb2015-01-27 10:21:57 -080093 gpr_strvec_add(&b, gpr_strdup("SEND_PREFORMATTED_MESSAGE"));
Craig Tiller7cfa2d92015-01-19 15:41:49 -080094 break;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080095 case GRPC_SEND_FINISH:
Craig Tillerd90e2992015-01-23 14:04:16 -080096 gpr_strvec_add(&b, gpr_strdup("SEND_FINISH"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -080097 break;
98 case GRPC_REQUEST_DATA:
Craig Tillerd90e2992015-01-23 14:04:16 -080099 gpr_strvec_add(&b, gpr_strdup("REQUEST_DATA"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800100 break;
101 case GRPC_RECV_METADATA:
Craig Tillerd90e2992015-01-23 14:04:16 -0800102 gpr_strvec_add(&b, gpr_strdup("RECV_METADATA"));
Craig Tiller6902ad22015-04-16 08:01:49 -0700103 put_metadata_list(&b, op->data.metadata);
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800104 break;
105 case GRPC_RECV_MESSAGE:
Craig Tillerd90e2992015-01-23 14:04:16 -0800106 gpr_strvec_add(&b, gpr_strdup("RECV_MESSAGE"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800107 break;
108 case GRPC_RECV_HALF_CLOSE:
Craig Tillerd90e2992015-01-23 14:04:16 -0800109 gpr_strvec_add(&b, gpr_strdup("RECV_HALF_CLOSE"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800110 break;
111 case GRPC_RECV_FINISH:
Craig Tillerd90e2992015-01-23 14:04:16 -0800112 gpr_strvec_add(&b, gpr_strdup("RECV_FINISH"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800113 break;
Craig Tiller8b282cb2015-04-17 14:57:44 -0700114 case GRPC_RECV_SYNTHETIC_STATUS:
Craig Tiller76f5d462015-04-17 14:58:12 -0700115 gpr_asprintf(&tmp, "RECV_SYNTHETIC_STATUS status=%d message='%s'",
116 op->data.synthetic_status.status,
117 op->data.synthetic_status.message);
Craig Tiller8b282cb2015-04-17 14:57:44 -0700118 gpr_strvec_add(&b, tmp);
119 break;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800120 case GRPC_CANCEL_OP:
Craig Tillerd90e2992015-01-23 14:04:16 -0800121 gpr_strvec_add(&b, gpr_strdup("CANCEL_OP"));
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800122 break;
123 }
Craig Tillerd90e2992015-01-23 14:04:16 -0800124 gpr_asprintf(&tmp, " flags=0x%08x", op->flags);
125 gpr_strvec_add(&b, tmp);
Craig Tiller8b282cb2015-04-17 14:57:44 -0700126 if (op->bind_pollset) {
127 gpr_strvec_add(&b, gpr_strdup("bind_pollset"));
128 }
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800129
Craig Tiller16ae23d2015-01-23 14:26:28 -0800130 out = gpr_strvec_flatten(&b, NULL);
Craig Tillerd90e2992015-01-23 14:04:16 -0800131 gpr_strvec_destroy(&b);
132
133 return out;
Nicolas Nobleb7ebd3b2014-11-26 16:33:03 -0800134}
135
136void grpc_call_log_op(char *file, int line, gpr_log_severity severity,
137 grpc_call_element *elem, grpc_call_op *op) {
138 char *str = grpc_call_op_string(op);
139 gpr_log(file, line, severity, "OP[%s:%p]: %s", elem->filter->name, elem, str);
140 gpr_free(str);
Craig Tiller190d3602015-02-18 09:23:38 -0800141}