agoo 2.15.7 → 2.15.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/bin/agoo +47 -39
- data/ext/agoo/bind.c +209 -198
- data/ext/agoo/rgraphql.c +7 -4
- data/ext/agoo/rserver.c +689 -688
- data/ext/agoo/server.c +255 -253
- data/lib/agoo/version.rb +1 -1
- data/lib/rack/handler/agoo.rb +130 -128
- metadata +3 -3
data/ext/agoo/bind.c
CHANGED
@@ -16,70 +16,76 @@
|
|
16
16
|
|
17
17
|
agooBind
|
18
18
|
agoo_bind_port(agooErr err, int port) {
|
19
|
-
agooBind
|
19
|
+
agooBind b = (agooBind)AGOO_CALLOC(1, sizeof(struct _agooBind));
|
20
20
|
|
21
21
|
if (NULL != b) {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
22
|
+
char id[1024];
|
23
|
+
|
24
|
+
b->port = port;
|
25
|
+
b->family = AF_INET;
|
26
|
+
snprintf(id, sizeof(id) - 1, "http://:%d", port);
|
27
|
+
if (NULL == (b->id = AGOO_STRDUP(id))) {
|
28
|
+
AGOO_ERR_MEM(err, "strdup()");
|
29
|
+
AGOO_FREE(b);
|
30
|
+
return NULL;
|
31
|
+
}
|
32
|
+
b->kind = AGOO_CON_HTTP;
|
33
|
+
b->read = NULL;
|
34
|
+
b->write = NULL;
|
35
|
+
b->events = NULL;
|
36
36
|
}
|
37
37
|
return b;
|
38
38
|
}
|
39
39
|
|
40
40
|
static agooBind
|
41
41
|
url_tcp(agooErr err, const char *url, const char *scheme) {
|
42
|
-
char
|
43
|
-
struct in_addr
|
44
|
-
int
|
45
|
-
agooBind
|
42
|
+
char *colon = index(url, ':');
|
43
|
+
struct in_addr addr = { .s_addr = 0 };
|
44
|
+
int port;
|
45
|
+
agooBind b;
|
46
46
|
|
47
|
-
if (NULL == colon) {
|
48
|
-
|
47
|
+
if (NULL == colon || '\0' == colon[1]) {
|
48
|
+
port = 80;
|
49
49
|
} else if (15 < colon - url) {
|
50
|
-
|
51
|
-
|
50
|
+
agoo_err_set(err, AGOO_ERR_ARG, "%s bind address is not valid, too long. (%s)", scheme, url);
|
51
|
+
return NULL;
|
52
52
|
} else if (':' == *url) {
|
53
|
-
|
53
|
+
port = atoi(colon + 1);
|
54
|
+
} else if (0 == strncmp("localhost", url, 9)) {
|
55
|
+
if (0 == inet_aton("127.0.0.1", &addr)) {
|
56
|
+
agoo_err_set(err, AGOO_ERR_ARG, "%s bind address is not valid. (%s)", scheme, url);
|
57
|
+
return NULL;
|
58
|
+
}
|
59
|
+
port = atoi(colon + 1);
|
54
60
|
} else {
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
61
|
+
char buf[32];
|
62
|
+
|
63
|
+
strncpy(buf, url, colon - url);
|
64
|
+
buf[colon - url] = '\0';
|
65
|
+
if (0 == inet_aton(buf, &addr)) {
|
66
|
+
agoo_err_set(err, AGOO_ERR_ARG, "%s bind address is not valid. (%s)", scheme, url);
|
67
|
+
return NULL;
|
68
|
+
}
|
69
|
+
port = atoi(colon + 1);
|
64
70
|
}
|
65
71
|
if (NULL != (b = (agooBind)AGOO_CALLOC(1, sizeof(struct _agooBind)))) {
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
72
|
+
char id[64];
|
73
|
+
|
74
|
+
b->port = port;
|
75
|
+
b->addr4 = addr;
|
76
|
+
b->family = AF_INET;
|
77
|
+
snprintf(id, sizeof(id), "%s://%s:%d", scheme, inet_ntoa(addr), port);
|
78
|
+
if (NULL == (b->id = AGOO_STRDUP(id))) {
|
79
|
+
AGOO_ERR_MEM(err, "strdup()");
|
80
|
+
AGOO_FREE(b);
|
81
|
+
return NULL;
|
82
|
+
}
|
83
|
+
b->kind = AGOO_CON_HTTP;
|
84
|
+
b->read = NULL;
|
85
|
+
b->write = NULL;
|
86
|
+
b->events = NULL;
|
87
|
+
|
88
|
+
return b;
|
83
89
|
}
|
84
90
|
AGOO_ERR_MEM(err, "Bind");
|
85
91
|
|
@@ -88,40 +94,40 @@ url_tcp(agooErr err, const char *url, const char *scheme) {
|
|
88
94
|
|
89
95
|
static agooBind
|
90
96
|
url_tcp6(agooErr err, const char *url, const char *scheme) {
|
91
|
-
struct in6_addr
|
92
|
-
char
|
93
|
-
int
|
94
|
-
char
|
95
|
-
agooBind
|
97
|
+
struct in6_addr addr;
|
98
|
+
char *end = index(url, ']');
|
99
|
+
int port = 80;
|
100
|
+
char buf[256];
|
101
|
+
agooBind b;
|
96
102
|
|
97
103
|
if (':' == *(end + 1)) {
|
98
|
-
|
104
|
+
port = atoi(end + 2);
|
99
105
|
}
|
100
106
|
memcpy(buf, url + 1, end - url - 1);
|
101
107
|
buf[end - url - 1] = '\0';
|
102
108
|
memset(&addr, 0, sizeof(addr));
|
103
109
|
if (0 == inet_pton(AF_INET6, buf, &addr)) {
|
104
|
-
|
105
|
-
|
110
|
+
agoo_err_set(err, AGOO_ERR_ARG, "%s bind address is not valid. (%s)", scheme, url);
|
111
|
+
return NULL;
|
106
112
|
}
|
107
113
|
if (NULL != (b = (agooBind)AGOO_CALLOC(1, sizeof(struct _agooBind)))) {
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
114
|
+
char str[INET6_ADDRSTRLEN + 1];
|
115
|
+
|
116
|
+
b->port = port;
|
117
|
+
b->addr6 = addr;
|
118
|
+
b->family = AF_INET6;
|
119
|
+
snprintf(buf, sizeof(buf), "%s://[%s]:%d", scheme, inet_ntop(AF_INET6, &addr, str, INET6_ADDRSTRLEN), port);
|
120
|
+
if (NULL == (b->id = AGOO_STRDUP(buf))) {
|
121
|
+
AGOO_ERR_MEM(err, "strdup()");
|
122
|
+
AGOO_FREE(b);
|
123
|
+
return NULL;
|
124
|
+
}
|
125
|
+
b->kind = AGOO_CON_HTTP;
|
126
|
+
b->read = NULL;
|
127
|
+
b->write = NULL;
|
128
|
+
b->events = NULL;
|
129
|
+
|
130
|
+
return b;
|
125
131
|
}
|
126
132
|
AGOO_ERR_MEM(err, "Bind");
|
127
133
|
|
@@ -131,32 +137,32 @@ url_tcp6(agooErr err, const char *url, const char *scheme) {
|
|
131
137
|
static agooBind
|
132
138
|
url_named(agooErr err, const char *url) {
|
133
139
|
if ('\0' == *url) {
|
134
|
-
|
135
|
-
|
140
|
+
agoo_err_set(err, AGOO_ERR_ARG, "Named Unix sockets names must not be empty.");
|
141
|
+
return NULL;
|
136
142
|
} else {
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
143
|
+
agooBind b = (agooBind)AGOO_CALLOC(1, sizeof(struct _agooBind));
|
144
|
+
|
145
|
+
if (NULL != b) {
|
146
|
+
const char *fmt = "unix://%s";
|
147
|
+
char id[1024];
|
148
|
+
|
149
|
+
if (NULL == (b->name = AGOO_STRDUP(url))) {
|
150
|
+
AGOO_ERR_MEM(err, "strdup()");
|
151
|
+
AGOO_FREE(b);
|
152
|
+
return NULL;
|
153
|
+
}
|
154
|
+
snprintf(id, sizeof(id) - 1, fmt, url);
|
155
|
+
if (NULL == (b->id = AGOO_STRDUP(id))) {
|
156
|
+
AGOO_ERR_MEM(err, "strdup()");
|
157
|
+
AGOO_FREE(b);
|
158
|
+
return NULL;
|
159
|
+
}
|
160
|
+
b->kind = AGOO_CON_HTTP;
|
161
|
+
b->read = NULL;
|
162
|
+
b->write = NULL;
|
163
|
+
b->events = NULL;
|
164
|
+
}
|
165
|
+
return b;
|
160
166
|
}
|
161
167
|
AGOO_ERR_MEM(err, "Bind");
|
162
168
|
|
@@ -165,56 +171,56 @@ url_named(agooErr err, const char *url) {
|
|
165
171
|
|
166
172
|
static agooBind
|
167
173
|
url_ssl(agooErr err, const char *url) {
|
168
|
-
char
|
169
|
-
struct in_addr
|
170
|
-
int
|
171
|
-
agooBind
|
174
|
+
char *colon = index(url, ':');
|
175
|
+
struct in_addr addr = { .s_addr = 0 };
|
176
|
+
int port;
|
177
|
+
agooBind b;
|
172
178
|
|
173
179
|
#ifdef HAVE_OPENSSL_SSL_H
|
174
180
|
if (NULL == agoo_server.ssl_ctx) {
|
175
|
-
|
176
|
-
|
181
|
+
agoo_err_set(err, AGOO_ERR_ARG, "https requires an SSL certificate and private key. (%s)", url);
|
182
|
+
return NULL;
|
177
183
|
}
|
178
184
|
#else
|
179
185
|
agoo_err_set(err, AGOO_ERR_ARG, "https requires OpenSSL. Rebuild with OpenSSL. (%s)", url);
|
180
186
|
return NULL;
|
181
187
|
#endif
|
182
188
|
if (NULL == colon) {
|
183
|
-
|
189
|
+
port = 443;
|
184
190
|
} else if (15 < colon - url) {
|
185
|
-
|
186
|
-
|
191
|
+
agoo_err_set(err, AGOO_ERR_ARG, "https bind address is not valid, too long. (%s)", url);
|
192
|
+
return NULL;
|
187
193
|
} else if (':' == *url) {
|
188
|
-
|
194
|
+
port = atoi(colon + 1);
|
189
195
|
} else {
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
196
|
+
char buf[32];
|
197
|
+
|
198
|
+
strncpy(buf, url, colon - url);
|
199
|
+
buf[colon - url] = '\0';
|
200
|
+
if (0 == inet_aton(buf, &addr)) {
|
201
|
+
agoo_err_set(err, AGOO_ERR_ARG, "https bind address is not valid. (%s)", url);
|
202
|
+
return NULL;
|
203
|
+
}
|
204
|
+
port = atoi(colon + 1);
|
199
205
|
}
|
200
206
|
if (NULL != (b = (agooBind)AGOO_CALLOC(1, sizeof(struct _agooBind)))) {
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
207
|
+
char id[64];
|
208
|
+
|
209
|
+
b->port = port;
|
210
|
+
b->addr4 = addr;
|
211
|
+
b->family = AF_INET;
|
212
|
+
snprintf(id, sizeof(id), "https://%s:%d", inet_ntoa(addr), port);
|
213
|
+
if (NULL == (b->id = AGOO_STRDUP(id))) {
|
214
|
+
AGOO_ERR_MEM(err, "strdup()");
|
215
|
+
AGOO_FREE(b);
|
216
|
+
return NULL;
|
217
|
+
}
|
218
|
+
b->kind = AGOO_CON_HTTPS;
|
219
|
+
b->read = NULL;
|
220
|
+
b->write = NULL;
|
221
|
+
b->events = NULL;
|
222
|
+
|
223
|
+
return b;
|
218
224
|
}
|
219
225
|
AGOO_ERR_MEM(err, "Bind");
|
220
226
|
|
@@ -224,41 +230,42 @@ url_ssl(agooErr err, const char *url) {
|
|
224
230
|
agooBind
|
225
231
|
agoo_bind_url(agooErr err, const char *url) {
|
226
232
|
if (0 == strncasecmp("tcp://", url, 6)) {
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
233
|
+
if ('[' == url[6]) {
|
234
|
+
return url_tcp6(err, url + 6, "tcp");
|
235
|
+
}
|
236
|
+
return url_tcp(err, url + 6, "tcp");
|
231
237
|
}
|
232
238
|
if (0 == strncasecmp("http://", url, 7)) {
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
239
|
+
if ('[' == url[7]) {
|
240
|
+
return url_tcp6(err, url + 7, "http");
|
241
|
+
}
|
242
|
+
return url_tcp(err, url + 7, "http");
|
237
243
|
}
|
238
244
|
if (0 == strncasecmp("unix://", url, 7)) {
|
239
|
-
|
245
|
+
return url_named(err, url + 7);
|
240
246
|
}
|
241
247
|
if (0 == strncasecmp("https://", url, 8)) {
|
242
|
-
|
248
|
+
return url_ssl(err, url + 8);
|
243
249
|
}
|
244
250
|
if (0 == strncasecmp("ssl://", url, 6)) {
|
245
|
-
|
251
|
+
return url_ssl(err, url + 6);
|
246
252
|
}
|
247
253
|
// All others assume http
|
248
254
|
{
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
255
|
+
char *colon = index(url, ':');
|
256
|
+
char scheme[8];
|
257
|
+
|
258
|
+
if (NULL != colon && colon - url < (int)sizeof(scheme)) {
|
259
|
+
int slen = (int)(colon - url);
|
260
|
+
|
261
|
+
memcpy(scheme, url, slen);
|
262
|
+
scheme[slen] = '\0';
|
263
|
+
if ('[' == url[slen + 3]) {
|
264
|
+
return url_tcp6(err, url + slen + 3, scheme);
|
265
|
+
}
|
266
|
+
return url_tcp(err, url + slen + 3, scheme);
|
267
|
+
}
|
268
|
+
return url_tcp(err, url, "http");
|
262
269
|
}
|
263
270
|
return NULL;
|
264
271
|
}
|
@@ -272,16 +279,17 @@ agoo_bind_destroy(agooBind b) {
|
|
272
279
|
|
273
280
|
static int
|
274
281
|
usual_listen(agooErr err, agooBind b) {
|
275
|
-
int
|
276
|
-
int
|
282
|
+
int optval = 1;
|
283
|
+
int domain = PF_INET;
|
284
|
+
int e;
|
277
285
|
|
278
286
|
if (AF_INET6 == b->family) {
|
279
|
-
|
287
|
+
domain = PF_INET6;
|
280
288
|
}
|
281
289
|
if (0 >= (b->fd = socket(domain, SOCK_STREAM, IPPROTO_TCP))) {
|
282
|
-
|
290
|
+
agoo_log_cat(&agoo_error_cat, "Server failed to open server socket on port %d. %s.", b->port, strerror(errno));
|
283
291
|
|
284
|
-
|
292
|
+
return agoo_err_set(err, errno, "Server failed to open server socket. %s.", strerror(errno));
|
285
293
|
}
|
286
294
|
#ifdef OSX_OS
|
287
295
|
setsockopt(b->fd, SOL_SOCKET, SO_NOSIGPIPE, &optval, sizeof(optval));
|
@@ -291,63 +299,66 @@ usual_listen(agooErr err, agooBind b) {
|
|
291
299
|
#endif
|
292
300
|
setsockopt(b->fd, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof(optval));
|
293
301
|
if (AF_INET6 == b->family) {
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
302
|
+
struct sockaddr_in6 addr;
|
303
|
+
|
304
|
+
memset(&addr, 0, sizeof(addr));
|
305
|
+
addr.sin6_flowinfo = 0;
|
306
|
+
addr.sin6_family = b->family;
|
307
|
+
addr.sin6_addr = b->addr6;
|
308
|
+
addr.sin6_port = htons(b->port);
|
309
|
+
if (0 > bind(b->fd, (struct sockaddr*)&addr, sizeof(addr))) {
|
310
|
+
agoo_log_cat(&agoo_error_cat, "Server failed to bind server socket. %s.", strerror(errno));
|
311
|
+
|
312
|
+
return agoo_err_set(err, errno, "Server failed to bind server socket. %s.", strerror(errno));
|
313
|
+
}
|
306
314
|
} else {
|
307
|
-
|
315
|
+
struct sockaddr_in addr;
|
308
316
|
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
317
|
+
memset(&addr, 0, sizeof(addr));
|
318
|
+
addr.sin_family = b->family;
|
319
|
+
addr.sin_addr = b->addr4;
|
320
|
+
addr.sin_port = htons(b->port);
|
321
|
+
if (0 > bind(b->fd, (struct sockaddr*)&addr, sizeof(addr))) {
|
322
|
+
agoo_log_cat(&agoo_error_cat, "Server failed to bind server socket. %s.", strerror(errno));
|
315
323
|
|
316
|
-
|
317
|
-
|
324
|
+
return agoo_err_set(err, errno, "Server failed to bind server socket. %s.", strerror(errno));
|
325
|
+
}
|
326
|
+
}
|
327
|
+
if (0 != (e = listen(b->fd, 1000))) {
|
328
|
+
return agoo_err_set(err, e, "Server failed to bind to port %d. %s.", b->fd, strerror(e));
|
318
329
|
}
|
319
|
-
listen(b->fd, 1000);
|
320
|
-
|
321
330
|
return AGOO_ERR_OK;
|
322
331
|
}
|
323
332
|
|
324
333
|
static int
|
325
334
|
named_listen(agooErr err, agooBind b) {
|
326
|
-
struct sockaddr_un
|
335
|
+
struct sockaddr_un addr;
|
336
|
+
int e;
|
327
337
|
|
328
338
|
remove(b->name);
|
329
339
|
if (0 >= (b->fd = socket(AF_UNIX, SOCK_STREAM, 0))) {
|
330
|
-
|
340
|
+
agoo_log_cat(&agoo_error_cat, "Server failed to open server socket on %s. %s.", b->name, strerror(errno));
|
331
341
|
|
332
|
-
|
342
|
+
return agoo_err_set(err, errno, "Server failed to open server socket on %s. %s.", b->name, strerror(errno));
|
333
343
|
}
|
334
344
|
memset(&addr, 0, sizeof(addr));
|
335
345
|
addr.sun_family = AF_UNIX;
|
336
346
|
strcpy(addr.sun_path, b->name);
|
337
347
|
if (0 > bind(b->fd, (struct sockaddr*)&addr, sizeof(addr))) {
|
338
|
-
|
348
|
+
agoo_log_cat(&agoo_error_cat, "Server failed to bind server socket. %s.", strerror(errno));
|
339
349
|
|
340
|
-
|
350
|
+
return agoo_err_set(err, errno, "Server failed to bind server socket. %s.", strerror(errno));
|
351
|
+
}
|
352
|
+
if (0 != (e = listen(b->fd, 100))) {
|
353
|
+
return agoo_err_set(err, e, "Server failed to bind to port %d. %s.", b->fd, strerror(e));
|
341
354
|
}
|
342
|
-
listen(b->fd, 100);
|
343
|
-
|
344
355
|
return AGOO_ERR_OK;
|
345
356
|
}
|
346
357
|
|
347
358
|
int
|
348
359
|
agoo_bind_listen(agooErr err, agooBind b) {
|
349
360
|
if (NULL != b->name) {
|
350
|
-
|
361
|
+
return named_listen(err, b);
|
351
362
|
}
|
352
363
|
return usual_listen(err, b);
|
353
364
|
}
|
@@ -355,7 +366,7 @@ agoo_bind_listen(agooErr err, agooBind b) {
|
|
355
366
|
void
|
356
367
|
agoo_bind_close(agooBind b) {
|
357
368
|
if (0 != b->fd) {
|
358
|
-
|
359
|
-
|
369
|
+
close(b->fd);
|
370
|
+
b->fd = 0;
|
360
371
|
}
|
361
372
|
}
|
data/ext/agoo/rgraphql.c
CHANGED
@@ -406,6 +406,9 @@ ref_type(gqlRef ref) {
|
|
406
406
|
TypeClass tc;
|
407
407
|
const char *classname = rb_obj_classname((VALUE)ref);
|
408
408
|
|
409
|
+
if (RUBY_T_ARRAY == rb_type((VALUE)ref) && 0 < RARRAY_LEN((VALUE)ref)) {
|
410
|
+
classname = rb_obj_classname(RARRAY_AREF((VALUE)ref, 0));
|
411
|
+
}
|
409
412
|
for (tc = type_class_map; NULL != tc->type; tc++) {
|
410
413
|
if (0 == strcmp(classname, tc->classname)) {
|
411
414
|
type = tc->type;
|
@@ -436,8 +439,8 @@ resolve(agooErr err, gqlDoc doc, gqlRef target, gqlField field, gqlSel sel, gqlV
|
|
436
439
|
ID method;
|
437
440
|
int arity;
|
438
441
|
|
439
|
-
if ('_' == *
|
440
|
-
if (0 == strcmp("__typename",
|
442
|
+
if ('_' == *key && '_' == key[1]) {
|
443
|
+
if (0 == strcmp("__typename", key)) {
|
441
444
|
if (AGOO_ERR_OK != gql_set_typename(err, ref_type(target), key, result)) {
|
442
445
|
return err->code;
|
443
446
|
}
|
@@ -447,9 +450,9 @@ resolve(agooErr err, gqlDoc doc, gqlRef target, gqlField field, gqlSel sel, gqlV
|
|
447
450
|
case GQL_QUERY:
|
448
451
|
return gql_intro_eval(err, doc, sel, result, depth);
|
449
452
|
case GQL_MUTATION:
|
450
|
-
return agoo_err_set(err, AGOO_ERR_EVAL, "%s can not be called on a mutation.",
|
453
|
+
return agoo_err_set(err, AGOO_ERR_EVAL, "%s can not be called on a mutation.", key);
|
451
454
|
case GQL_SUBSCRIPTION:
|
452
|
-
return agoo_err_set(err, AGOO_ERR_EVAL, "%s can not be called on a subscription.",
|
455
|
+
return agoo_err_set(err, AGOO_ERR_EVAL, "%s can not be called on a subscription.", key);
|
453
456
|
default:
|
454
457
|
return agoo_err_set(err, AGOO_ERR_EVAL, "Not a valid operation on the root object.");
|
455
458
|
}
|