agoo 2.15.5 → 2.15.6
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 +6 -0
- data/ext/agoo/con.c +0 -2
- data/ext/agoo/early_hints.c +1 -0
- data/ext/agoo/error_stream.c +1 -0
- data/ext/agoo/request.c +1 -0
- data/ext/agoo/rgraphql.c +2 -0
- data/ext/agoo/rresponse.c +1 -0
- data/ext/agoo/rupgraded.c +7 -6
- data/ext/agoo/sdl.c +91 -42
- data/lib/agoo/version.rb +1 -1
- data/test/graphql_test.rb +18 -0
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ccb8962bfa94f61140bddb602034554e294c1e7258f61c03430604198afe05f4
|
|
4
|
+
data.tar.gz: c34075af5aa1ea5fdd94e2a0e87edb632f3ba084fd9d9e5ec04ce9969c7f40d8
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8ff7a08ff29cfa24ca4f60e6915c5ceb2c2de1ec8b60f78e0ddcb5474c06d0462a95658c5663070a93d4024fff0081baec25ea5a653c450e672c1aade306626f
|
|
7
|
+
data.tar.gz: 8c42fbf4ba8f4fd1105594e566f19f290ebec1c8c8ed4460905d9730ff4c97eefcc456daba93c8969df8f4301a0758577b7489c2473d62d74f0b434e30385d7d
|
data/CHANGELOG.md
CHANGED
data/ext/agoo/con.c
CHANGED
|
@@ -991,7 +991,6 @@ static void
|
|
|
991
991
|
publish_pub(agooPub pub, agooConLoop loop) {
|
|
992
992
|
agooUpgraded up;
|
|
993
993
|
const char *sub = pub->subject->pattern;
|
|
994
|
-
int cnt = 0;
|
|
995
994
|
|
|
996
995
|
for (up = agoo_server.up_list; NULL != up; up = up->next) {
|
|
997
996
|
if (NULL != up->con && up->con->loop == loop && agoo_upgraded_match(up, sub)) {
|
|
@@ -1001,7 +1000,6 @@ publish_pub(agooPub pub, agooConLoop loop) {
|
|
|
1001
1000
|
agoo_con_res_append(up->con, res);
|
|
1002
1001
|
res->con_kind = AGOO_CON_ANY;
|
|
1003
1002
|
agoo_res_message_push(res, agoo_text_dup(pub->msg));
|
|
1004
|
-
cnt++;
|
|
1005
1003
|
}
|
|
1006
1004
|
}
|
|
1007
1005
|
}
|
data/ext/agoo/early_hints.c
CHANGED
data/ext/agoo/error_stream.c
CHANGED
|
@@ -131,6 +131,7 @@ void
|
|
|
131
131
|
error_stream_init(VALUE mod) {
|
|
132
132
|
es_class = rb_define_class_under(mod, "ErrorStream", rb_cObject);
|
|
133
133
|
|
|
134
|
+
rb_undef_alloc_func(es_class);
|
|
134
135
|
rb_define_method(es_class, "puts", es_puts, 1);
|
|
135
136
|
rb_define_method(es_class, "write", es_write, 1);
|
|
136
137
|
rb_define_method(es_class, "flush", es_flush, 0);
|
data/ext/agoo/request.c
CHANGED
|
@@ -728,6 +728,7 @@ void
|
|
|
728
728
|
request_init(VALUE mod) {
|
|
729
729
|
req_class = rb_define_class_under(mod, "Request", rb_cObject);
|
|
730
730
|
|
|
731
|
+
rb_undef_alloc_func(req_class);
|
|
731
732
|
rb_define_method(req_class, "to_s", to_s, 0);
|
|
732
733
|
rb_define_method(req_class, "to_h", to_h, 0);
|
|
733
734
|
rb_define_method(req_class, "environment", to_h, 0);
|
data/ext/agoo/rgraphql.c
CHANGED
|
@@ -1054,6 +1054,8 @@ void
|
|
|
1054
1054
|
graphql_init(VALUE mod) {
|
|
1055
1055
|
graphql_class = rb_define_class_under(mod, "GraphQL", rb_cObject);
|
|
1056
1056
|
|
|
1057
|
+
rb_undef_alloc_func(graphql_class);
|
|
1058
|
+
|
|
1057
1059
|
rb_define_module_function(graphql_class, "schema", graphql_schema, 1);
|
|
1058
1060
|
|
|
1059
1061
|
rb_define_module_function(graphql_class, "load", graphql_load, 1);
|
data/ext/agoo/rresponse.c
CHANGED
|
@@ -243,6 +243,7 @@ void
|
|
|
243
243
|
response_init(VALUE mod) {
|
|
244
244
|
res_class = rb_define_class_under(mod, "Response", rb_cObject);
|
|
245
245
|
|
|
246
|
+
rb_undef_alloc_func(res_class);
|
|
246
247
|
rb_define_method(res_class, "to_s", to_s, 0);
|
|
247
248
|
rb_define_method(res_class, "body", body_get, 0);
|
|
248
249
|
rb_define_method(res_class, "body=", body_set, 1);
|
data/ext/agoo/rupgraded.c
CHANGED
|
@@ -39,7 +39,7 @@ get_upgraded(VALUE self) {
|
|
|
39
39
|
const char*
|
|
40
40
|
extract_subject(VALUE subject, int *slen) {
|
|
41
41
|
const char *subj;
|
|
42
|
-
|
|
42
|
+
|
|
43
43
|
switch (rb_type(subject)) {
|
|
44
44
|
case T_STRING:
|
|
45
45
|
subj = StringValuePtr(subject);
|
|
@@ -84,7 +84,7 @@ rup_write(VALUE self, VALUE msg) {
|
|
|
84
84
|
}
|
|
85
85
|
} else {
|
|
86
86
|
volatile VALUE rs = rb_funcall(msg, to_s_id, 0);
|
|
87
|
-
|
|
87
|
+
|
|
88
88
|
message = StringValuePtr(rs);
|
|
89
89
|
mlen = RSTRING_LEN(rs);
|
|
90
90
|
}
|
|
@@ -165,7 +165,7 @@ static VALUE
|
|
|
165
165
|
rup_pending(VALUE self) {
|
|
166
166
|
agooUpgraded up = get_upgraded(self);
|
|
167
167
|
int pending = -1;
|
|
168
|
-
|
|
168
|
+
|
|
169
169
|
if (NULL != up) {
|
|
170
170
|
pending = agoo_upgraded_pending(up);
|
|
171
171
|
atomic_fetch_sub(&up->ref_cnt, 1);
|
|
@@ -183,7 +183,7 @@ static VALUE
|
|
|
183
183
|
rup_open(VALUE self) {
|
|
184
184
|
agooUpgraded up = get_upgraded(self);
|
|
185
185
|
int pending = -1;
|
|
186
|
-
|
|
186
|
+
|
|
187
187
|
if (NULL != up) {
|
|
188
188
|
pending = (int)(long)atomic_load(&up->pending);
|
|
189
189
|
atomic_fetch_sub(&up->ref_cnt, 1);
|
|
@@ -204,7 +204,7 @@ rup_protocol(VALUE self) {
|
|
|
204
204
|
|
|
205
205
|
if (agoo_server.active) {
|
|
206
206
|
agooUpgraded up;
|
|
207
|
-
|
|
207
|
+
|
|
208
208
|
pthread_mutex_lock(&agoo_server.up_lock);
|
|
209
209
|
if (NULL != (up = DATA_PTR(self)) && NULL != up->con) {
|
|
210
210
|
switch (up->con->bind->kind) {
|
|
@@ -249,7 +249,7 @@ rupgraded_create(agooCon c, VALUE obj, VALUE env) {
|
|
|
249
249
|
up->wrap = (void*)Data_Wrap_Struct(upgraded_class, NULL, NULL, up);
|
|
250
250
|
|
|
251
251
|
agoo_server_add_upgraded(up);
|
|
252
|
-
|
|
252
|
+
|
|
253
253
|
if (rb_respond_to(obj, on_open_id)) {
|
|
254
254
|
rb_funcall(obj, on_open_id, 1, (VALUE)up->wrap);
|
|
255
255
|
}
|
|
@@ -285,6 +285,7 @@ void
|
|
|
285
285
|
upgraded_init(VALUE mod) {
|
|
286
286
|
upgraded_class = rb_define_class_under(mod, "Upgraded", rb_cObject);
|
|
287
287
|
|
|
288
|
+
rb_undef_alloc_func(upgraded_class);
|
|
288
289
|
rb_define_method(upgraded_class, "write", rup_write, 1);
|
|
289
290
|
rb_define_method(upgraded_class, "subscribe", rup_subscribe, 1);
|
|
290
291
|
rb_define_method(upgraded_class, "unsubscribe", rup_unsubscribe, -1);
|
data/ext/agoo/sdl.c
CHANGED
|
@@ -22,6 +22,38 @@ static const char union_str[] = "union";
|
|
|
22
22
|
|
|
23
23
|
static int make_sel(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op, gqlSel *parentp);
|
|
24
24
|
|
|
25
|
+
/*
|
|
26
|
+
static void
|
|
27
|
+
debug_sels(gqlSel sel, int indent) {
|
|
28
|
+
char pad[100];
|
|
29
|
+
|
|
30
|
+
memset(pad, ' ', sizeof(pad));
|
|
31
|
+
pad[indent] = '\0';
|
|
32
|
+
|
|
33
|
+
printf("%s{%s %s", pad, sel->name, (NULL == sel->type) ? "NULL" : sel->type->name);
|
|
34
|
+
if (NULL == sel->sels) {
|
|
35
|
+
printf("}\n");
|
|
36
|
+
} else {
|
|
37
|
+
printf("\n");
|
|
38
|
+
for (gqlSel sc = sel->sels; NULL != sc; sc = sc->next) {
|
|
39
|
+
debug_sels(sc, indent + 2);
|
|
40
|
+
}
|
|
41
|
+
printf("%s}\n", pad);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
static void
|
|
46
|
+
debug_doc(gqlDoc doc) {
|
|
47
|
+
printf("*** doc: {\n");
|
|
48
|
+
for (gqlOp op = doc->ops; NULL != op; op = op->next) {
|
|
49
|
+
printf(" {%s\n", op->name);
|
|
50
|
+
debug_sels(op->sels, 4);
|
|
51
|
+
}
|
|
52
|
+
printf(" }\n");
|
|
53
|
+
printf("}\n");
|
|
54
|
+
}
|
|
55
|
+
*/
|
|
56
|
+
|
|
25
57
|
static int
|
|
26
58
|
extract_desc(agooErr err, agooDoc doc, const char **descp, size_t *lenp) {
|
|
27
59
|
agoo_doc_skip_white(doc);
|
|
@@ -1312,10 +1344,51 @@ make_sel(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op, gqlSel *parentp) {
|
|
|
1312
1344
|
return AGOO_ERR_OK;
|
|
1313
1345
|
}
|
|
1314
1346
|
|
|
1347
|
+
static gqlType
|
|
1348
|
+
lookup_field_type(gqlType type, const char *field, bool qroot) {
|
|
1349
|
+
gqlType ftype = NULL;
|
|
1350
|
+
|
|
1351
|
+
switch (type->kind) {
|
|
1352
|
+
case GQL_SCHEMA:
|
|
1353
|
+
case GQL_OBJECT:
|
|
1354
|
+
case GQL_INPUT:
|
|
1355
|
+
case GQL_INTERFACE: {
|
|
1356
|
+
gqlField f;
|
|
1357
|
+
|
|
1358
|
+
for (f = type->fields; NULL != f; f = f->next) {
|
|
1359
|
+
if (0 == strcmp(field, f->name)) {
|
|
1360
|
+
ftype = f->type;
|
|
1361
|
+
break;
|
|
1362
|
+
}
|
|
1363
|
+
}
|
|
1364
|
+
if (NULL == ftype) {
|
|
1365
|
+
if (0 == strcmp("__typename", field)) {
|
|
1366
|
+
ftype = &gql_string_type;
|
|
1367
|
+
} else if (qroot) {
|
|
1368
|
+
if (0 == strcmp("__type", field)) {
|
|
1369
|
+
ftype = gql_type_get("__Type");
|
|
1370
|
+
} else if (0 == strcmp("__schema", field)) {
|
|
1371
|
+
ftype = gql_type_get("__Schema");
|
|
1372
|
+
}
|
|
1373
|
+
}
|
|
1374
|
+
}
|
|
1375
|
+
break;
|
|
1376
|
+
}
|
|
1377
|
+
case GQL_LIST:
|
|
1378
|
+
case GQL_NON_NULL:
|
|
1379
|
+
ftype = lookup_field_type(type->base, field, false);
|
|
1380
|
+
break;
|
|
1381
|
+
case GQL_UNION: // Can not be used directly for query type determinations.
|
|
1382
|
+
default:
|
|
1383
|
+
break;
|
|
1384
|
+
}
|
|
1385
|
+
return ftype;
|
|
1386
|
+
}
|
|
1315
1387
|
|
|
1316
1388
|
static int
|
|
1317
1389
|
make_op(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOpKind kind) {
|
|
1318
1390
|
char name[256];
|
|
1391
|
+
const char *kind_str = query_str;
|
|
1319
1392
|
const char *start;
|
|
1320
1393
|
gqlOp op;
|
|
1321
1394
|
size_t nlen;
|
|
@@ -1323,13 +1396,15 @@ make_op(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOpKind kind) {
|
|
|
1323
1396
|
agoo_doc_skip_white(doc);
|
|
1324
1397
|
start = doc->cur;
|
|
1325
1398
|
agoo_doc_read_token(doc);
|
|
1326
|
-
if (
|
|
1399
|
+
if (start < doc->cur) {
|
|
1327
1400
|
if (5 == (doc->cur - start) && 0 == strncmp(query_str, start, sizeof(query_str) - 1)) {
|
|
1328
1401
|
kind = GQL_QUERY;
|
|
1329
1402
|
} else if (8 == (doc->cur - start) && 0 == strncmp(mutation_str, start, sizeof(mutation_str) - 1)) {
|
|
1330
1403
|
kind = GQL_MUTATION;
|
|
1404
|
+
kind_str = mutation_str;
|
|
1331
1405
|
} else if (12 == (doc->cur - start) && 0 == strncmp(subscription_str, start, sizeof(subscription_str) - 1)) {
|
|
1332
1406
|
kind = GQL_SUBSCRIPTION;
|
|
1407
|
+
kind_str = subscription_str;
|
|
1333
1408
|
} else {
|
|
1334
1409
|
return agoo_doc_err(doc, err, "Invalid operation type");
|
|
1335
1410
|
}
|
|
@@ -1384,6 +1459,21 @@ make_op(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOpKind kind) {
|
|
|
1384
1459
|
if (doc->end <= doc->cur && '}' != doc->cur[-1]) {
|
|
1385
1460
|
return agoo_doc_err(doc, err, "Expected a }");
|
|
1386
1461
|
}
|
|
1462
|
+
if (0 < nlen) {
|
|
1463
|
+
gqlType schema = gql_root_type();
|
|
1464
|
+
gqlType type = lookup_field_type(schema, kind_str, false);
|
|
1465
|
+
|
|
1466
|
+
if ((NULL == lookup_field_type(type, op->sels->name, false)) &&
|
|
1467
|
+
(NULL != lookup_field_type(type, name, false))) {
|
|
1468
|
+
gqlSel wrap = sel_create(err, NULL, name, NULL);
|
|
1469
|
+
|
|
1470
|
+
if (NULL == wrap) {
|
|
1471
|
+
return err->code;
|
|
1472
|
+
}
|
|
1473
|
+
wrap->sels = op->sels;
|
|
1474
|
+
op->sels = wrap;
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1387
1477
|
if (NULL == gdoc->ops) {
|
|
1388
1478
|
gdoc->ops = op;
|
|
1389
1479
|
} else {
|
|
@@ -1461,47 +1551,6 @@ make_fragment(agooErr err, agooDoc doc, gqlDoc gdoc) {
|
|
|
1461
1551
|
return AGOO_ERR_OK;
|
|
1462
1552
|
}
|
|
1463
1553
|
|
|
1464
|
-
static gqlType
|
|
1465
|
-
lookup_field_type(gqlType type, const char *field, bool qroot) {
|
|
1466
|
-
gqlType ftype = NULL;
|
|
1467
|
-
|
|
1468
|
-
switch (type->kind) {
|
|
1469
|
-
case GQL_SCHEMA:
|
|
1470
|
-
case GQL_OBJECT:
|
|
1471
|
-
case GQL_INPUT:
|
|
1472
|
-
case GQL_INTERFACE: {
|
|
1473
|
-
gqlField f;
|
|
1474
|
-
|
|
1475
|
-
for (f = type->fields; NULL != f; f = f->next) {
|
|
1476
|
-
if (0 == strcmp(field, f->name)) {
|
|
1477
|
-
ftype = f->type;
|
|
1478
|
-
break;
|
|
1479
|
-
}
|
|
1480
|
-
}
|
|
1481
|
-
if (NULL == ftype) {
|
|
1482
|
-
if (0 == strcmp("__typename", field)) {
|
|
1483
|
-
ftype = &gql_string_type;
|
|
1484
|
-
} else if (qroot) {
|
|
1485
|
-
if (0 == strcmp("__type", field)) {
|
|
1486
|
-
ftype = gql_type_get("__Type");
|
|
1487
|
-
} else if (0 == strcmp("__schema", field)) {
|
|
1488
|
-
ftype = gql_type_get("__Schema");
|
|
1489
|
-
}
|
|
1490
|
-
}
|
|
1491
|
-
}
|
|
1492
|
-
break;
|
|
1493
|
-
}
|
|
1494
|
-
case GQL_LIST:
|
|
1495
|
-
case GQL_NON_NULL:
|
|
1496
|
-
ftype = lookup_field_type(type->base, field, false);
|
|
1497
|
-
break;
|
|
1498
|
-
case GQL_UNION: // Can not be used directly for query type determinations.
|
|
1499
|
-
default:
|
|
1500
|
-
break;
|
|
1501
|
-
}
|
|
1502
|
-
return ftype;
|
|
1503
|
-
}
|
|
1504
|
-
|
|
1505
1554
|
static int
|
|
1506
1555
|
sel_set_type(agooErr err, gqlType type, gqlSel sels, bool qroot) {
|
|
1507
1556
|
gqlSel sel;
|
data/lib/agoo/version.rb
CHANGED
data/test/graphql_test.rb
CHANGED
|
@@ -428,6 +428,24 @@ directive @ruby(class: String!) on SCHEMA | OBJECT
|
|
|
428
428
|
post_test(uri, body, 'application/json', expect)
|
|
429
429
|
end
|
|
430
430
|
|
|
431
|
+
def test_post_json_op
|
|
432
|
+
uri = URI('http://localhost:6472/graphql?indent=2')
|
|
433
|
+
body = %^{
|
|
434
|
+
"query":"query artists{name}"
|
|
435
|
+
}^
|
|
436
|
+
expect = %^{
|
|
437
|
+
"data":{
|
|
438
|
+
"artists":[
|
|
439
|
+
{
|
|
440
|
+
"name":"Fazerdaze"
|
|
441
|
+
}
|
|
442
|
+
]
|
|
443
|
+
}
|
|
444
|
+
}^
|
|
445
|
+
|
|
446
|
+
post_test(uri, body, 'application/json', expect)
|
|
447
|
+
end
|
|
448
|
+
|
|
431
449
|
def test_post_fragment
|
|
432
450
|
uri = URI('http://localhost:6472/graphql?indent=2')
|
|
433
451
|
body = %^
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: agoo
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.15.
|
|
4
|
+
version: 2.15.6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Peter Ohler
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2023-
|
|
11
|
+
date: 2023-07-07 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: oj
|