agoo 2.6.1 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of agoo might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/ext/agoo/agoo.c +5 -1
- data/ext/agoo/bind.c +17 -18
- data/ext/agoo/con.c +14 -7
- data/ext/agoo/debug.c +113 -63
- data/ext/agoo/debug.h +3 -0
- data/ext/agoo/err.c +7 -0
- data/ext/agoo/err.h +4 -0
- data/ext/agoo/error_stream.c +6 -0
- data/ext/agoo/gqleval.c +1 -1
- data/ext/agoo/gqlvalue.c +10 -11
- data/ext/agoo/graphql.c +181 -105
- data/ext/agoo/graphql.h +9 -0
- data/ext/agoo/hook.c +17 -7
- data/ext/agoo/log.c +8 -10
- data/ext/agoo/log.h +1 -1
- data/ext/agoo/page.c +242 -31
- data/ext/agoo/page.h +4 -3
- data/ext/agoo/queue.c +10 -7
- data/ext/agoo/queue.h +3 -2
- data/ext/agoo/ready.c +8 -7
- data/ext/agoo/rgraphql.c +29 -25
- data/ext/agoo/rlog.c +2 -2
- data/ext/agoo/rresponse.c +6 -0
- data/ext/agoo/rserver.c +49 -8
- data/ext/agoo/sdl.c +82 -35
- data/ext/agoo/sdl.h +3 -1
- data/ext/agoo/server.c +10 -6
- data/ext/agoo/server.h +2 -1
- data/ext/agoo/upgraded.c +2 -3
- data/lib/agoo/version.rb +1 -1
- data/test/static_test.rb +6 -1
- metadata +2 -2
data/ext/agoo/sdl.c
CHANGED
@@ -28,7 +28,7 @@ extract_desc(agooErr err, agooDoc doc, const char **descp, size_t *lenp) {
|
|
28
28
|
if ('"' == *doc->cur) {
|
29
29
|
const char *desc_end = NULL;
|
30
30
|
const char *desc = doc->cur + 1;
|
31
|
-
|
31
|
+
|
32
32
|
if (AGOO_ERR_OK != agoo_doc_read_string(err, doc)) {
|
33
33
|
return err->code;
|
34
34
|
}
|
@@ -88,7 +88,7 @@ make_scalar(agooErr err, agooDoc doc, const char *desc, int len) {
|
|
88
88
|
return err->code;
|
89
89
|
}
|
90
90
|
gql_scalar_create(err, name, desc, len);
|
91
|
-
|
91
|
+
|
92
92
|
return AGOO_ERR_OK;
|
93
93
|
}
|
94
94
|
|
@@ -202,7 +202,7 @@ make_enum(agooErr err, agooDoc doc, const char *desc, size_t dlen) {
|
|
202
202
|
gqlDirUse uses = NULL;
|
203
203
|
gqlEnumVal ev;
|
204
204
|
size_t len;
|
205
|
-
|
205
|
+
|
206
206
|
if (AGOO_ERR_OK != extract_name(err, doc, enum_str, sizeof(enum_str) - 1, name, sizeof(name))) {
|
207
207
|
return err->code;
|
208
208
|
}
|
@@ -254,7 +254,7 @@ make_union(agooErr err, agooDoc doc, const char *desc, int len) {
|
|
254
254
|
gqlDirUse uses = NULL;
|
255
255
|
gqlType member;
|
256
256
|
bool required;
|
257
|
-
|
257
|
+
|
258
258
|
if (AGOO_ERR_OK != extract_name(err, doc, union_str, sizeof(union_str) - 1, name, sizeof(name))) {
|
259
259
|
return err->code;
|
260
260
|
}
|
@@ -425,7 +425,7 @@ make_field_arg(agooErr err, agooDoc doc, gqlField field) {
|
|
425
425
|
size_t dlen;
|
426
426
|
bool required = false;
|
427
427
|
gqlValue dval = NULL;
|
428
|
-
|
428
|
+
|
429
429
|
if (AGOO_ERR_OK != extract_desc(err, doc, &desc, &dlen)) {
|
430
430
|
return err->code;
|
431
431
|
}
|
@@ -438,7 +438,7 @@ make_field_arg(agooErr err, agooDoc doc, gqlField field) {
|
|
438
438
|
return agoo_doc_err(doc, err, "Expected :");
|
439
439
|
}
|
440
440
|
doc->cur++;
|
441
|
-
|
441
|
+
|
442
442
|
if (AGOO_ERR_OK != read_type(err, doc, &type, &required)) {
|
443
443
|
return err->code;
|
444
444
|
}
|
@@ -463,7 +463,7 @@ make_field_arg(agooErr err, agooDoc doc, gqlField field) {
|
|
463
463
|
}
|
464
464
|
|
465
465
|
static int
|
466
|
-
make_field(agooErr err, agooDoc doc, gqlType type
|
466
|
+
make_field(agooErr err, agooDoc doc, gqlType type) {
|
467
467
|
char name[256];
|
468
468
|
gqlType return_type;
|
469
469
|
const char *arg_start = NULL;
|
@@ -483,9 +483,6 @@ make_field(agooErr err, agooDoc doc, gqlType type, bool allow_args) {
|
|
483
483
|
agoo_doc_skip_white(doc);
|
484
484
|
switch (*doc->cur) {
|
485
485
|
case '(':
|
486
|
-
if (!allow_args) {
|
487
|
-
return agoo_doc_err(doc, err, "Input fields can not have arguments.");
|
488
|
-
}
|
489
486
|
doc->cur++;
|
490
487
|
arg_start = doc->cur;
|
491
488
|
if (!agoo_doc_skip_to(doc, ')')) {
|
@@ -539,12 +536,56 @@ make_field(agooErr err, agooDoc doc, gqlType type, bool allow_args) {
|
|
539
536
|
return AGOO_ERR_OK;
|
540
537
|
}
|
541
538
|
|
539
|
+
static int
|
540
|
+
make_input_arg(agooErr err, agooDoc doc, gqlType type) {
|
541
|
+
char name[256];
|
542
|
+
gqlType return_type;
|
543
|
+
gqlArg arg;
|
544
|
+
gqlDirUse uses = NULL;
|
545
|
+
gqlValue dval = NULL;
|
546
|
+
const char *desc = NULL;
|
547
|
+
size_t dlen;
|
548
|
+
bool required = false;
|
549
|
+
|
550
|
+
if (AGOO_ERR_OK != extract_desc(err, doc, &desc, &dlen)) {
|
551
|
+
return err->code;
|
552
|
+
}
|
553
|
+
if (0 == read_name(err, doc, name, sizeof(name))) {
|
554
|
+
return err->code;
|
555
|
+
}
|
556
|
+
agoo_doc_skip_white(doc);
|
557
|
+
if (':' != *doc->cur) {
|
558
|
+
return agoo_doc_err(doc, err, "Expected :");
|
559
|
+
}
|
560
|
+
doc->cur++;
|
561
|
+
if (AGOO_ERR_OK != read_type(err, doc, &return_type, &required)) {
|
562
|
+
return err->code;
|
563
|
+
}
|
564
|
+
if ('=' == *doc->cur) {
|
565
|
+
doc->cur++;
|
566
|
+
if (NULL == (dval = agoo_doc_read_value(err, doc, return_type))) {
|
567
|
+
return err->code;
|
568
|
+
}
|
569
|
+
}
|
570
|
+
if (AGOO_ERR_OK != extract_dir_use(err, doc, &uses)) {
|
571
|
+
return err->code;
|
572
|
+
}
|
573
|
+
// TBD zzzzzzzz
|
574
|
+
|
575
|
+
if (NULL == (arg = gql_input_arg(err, type, name, return_type, desc, dlen, dval, required))) {
|
576
|
+
return err->code;
|
577
|
+
}
|
578
|
+
arg->dir = uses;
|
579
|
+
|
580
|
+
return AGOO_ERR_OK;
|
581
|
+
}
|
582
|
+
|
542
583
|
static int
|
543
584
|
make_interface(agooErr err, agooDoc doc, const char *desc, int len) {
|
544
585
|
char name[256];
|
545
586
|
gqlType type;
|
546
587
|
gqlDirUse uses = NULL;
|
547
|
-
|
588
|
+
|
548
589
|
if (AGOO_ERR_OK != extract_name(err, doc, interface_str, sizeof(interface_str) - 1, name, sizeof(name))) {
|
549
590
|
return err->code;
|
550
591
|
}
|
@@ -567,7 +608,7 @@ make_interface(agooErr err, agooDoc doc, const char *desc, int len) {
|
|
567
608
|
doc->cur++; // skip }
|
568
609
|
break;
|
569
610
|
}
|
570
|
-
if (AGOO_ERR_OK != make_field(err, doc, type
|
611
|
+
if (AGOO_ERR_OK != make_field(err, doc, type)) {
|
571
612
|
return err->code;
|
572
613
|
}
|
573
614
|
agoo_doc_skip_white(doc);
|
@@ -604,7 +645,8 @@ make_input(agooErr err, agooDoc doc, const char *desc, int len) {
|
|
604
645
|
doc->cur++; // skip }
|
605
646
|
break;
|
606
647
|
}
|
607
|
-
|
648
|
+
// TBD zzzzzzzzzz make_arg
|
649
|
+
if (AGOO_ERR_OK != make_input_arg(err, doc, type)) {
|
608
650
|
return err->code;
|
609
651
|
}
|
610
652
|
agoo_doc_skip_white(doc);
|
@@ -645,7 +687,7 @@ extract_interfaces(agooErr err, agooDoc doc, gqlTypeLink *interfacesp) {
|
|
645
687
|
return err->code;
|
646
688
|
}
|
647
689
|
if (NULL == (link = (gqlTypeLink)AGOO_MALLOC(sizeof(struct _gqlTypeLink)))) {
|
648
|
-
return
|
690
|
+
return AGOO_ERR_MEM(err, "GraphQL Interface");
|
649
691
|
}
|
650
692
|
link->next = NULL;
|
651
693
|
link->type = type;
|
@@ -695,7 +737,7 @@ make_type(agooErr err, agooDoc doc, const char *desc, int len) {
|
|
695
737
|
doc->cur++; // skip }
|
696
738
|
break;
|
697
739
|
}
|
698
|
-
if (AGOO_ERR_OK != make_field(err, doc, type
|
740
|
+
if (AGOO_ERR_OK != make_field(err, doc, type)) {
|
699
741
|
return err->code;
|
700
742
|
}
|
701
743
|
agoo_doc_skip_white(doc);
|
@@ -708,7 +750,7 @@ sdl_parse(agooErr err, const char *str, int len) {
|
|
708
750
|
struct _agooDoc doc;
|
709
751
|
const char *desc = NULL;
|
710
752
|
size_t dlen = 0;
|
711
|
-
|
753
|
+
|
712
754
|
agoo_doc_init(&doc, str, len);
|
713
755
|
|
714
756
|
while (doc.cur < doc.end) {
|
@@ -769,7 +811,7 @@ sdl_parse(agooErr err, const char *str, int len) {
|
|
769
811
|
if ('p' == doc.cur[2]) {
|
770
812
|
if (AGOO_ERR_OK != make_input(err, &doc, desc, dlen)) {
|
771
813
|
return err->code;
|
772
|
-
}
|
814
|
+
}
|
773
815
|
desc = NULL;
|
774
816
|
dlen = 0;
|
775
817
|
break;
|
@@ -799,11 +841,12 @@ sel_arg_create(agooErr err, const char *name, gqlValue value, gqlVar var) {
|
|
799
841
|
gqlSelArg arg;
|
800
842
|
|
801
843
|
if (NULL == (arg = (gqlSelArg)AGOO_MALLOC(sizeof(struct _gqlSelArg)))) {
|
802
|
-
|
844
|
+
AGOO_ERR_MEM(err, "GraphQL Selection Field Argument");
|
803
845
|
} else {
|
804
846
|
arg->next = NULL;
|
805
847
|
if (NULL == (arg->name = AGOO_STRDUP(name))) {
|
806
|
-
|
848
|
+
AGOO_ERR_MEM(err, "strdup()");
|
849
|
+
AGOO_FREE(arg);
|
807
850
|
return NULL;
|
808
851
|
}
|
809
852
|
arg->var = var;
|
@@ -817,7 +860,7 @@ make_sel_arg(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op, gqlSel sel) {
|
|
817
860
|
gqlValue value = NULL;
|
818
861
|
gqlVar var = NULL;
|
819
862
|
gqlSelArg arg;
|
820
|
-
|
863
|
+
|
821
864
|
agoo_doc_skip_white(doc);
|
822
865
|
if (0 == read_name(err, doc, name, sizeof(name))) {
|
823
866
|
return err->code;
|
@@ -830,7 +873,7 @@ make_sel_arg(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op, gqlSel sel) {
|
|
830
873
|
agoo_doc_skip_white(doc);
|
831
874
|
if ('$' == *doc->cur && NULL != op) {
|
832
875
|
char var_name[256];
|
833
|
-
|
876
|
+
|
834
877
|
doc->cur++;
|
835
878
|
if (0 == read_name(err, doc, var_name, sizeof(var_name))) {
|
836
879
|
return err->code;
|
@@ -873,11 +916,12 @@ gql_op_var_create(agooErr err, const char *name, gqlType type, gqlValue value) {
|
|
873
916
|
gqlVar var;
|
874
917
|
|
875
918
|
if (NULL == (var = (gqlVar)AGOO_MALLOC(sizeof(struct _gqlVar)))) {
|
876
|
-
|
919
|
+
AGOO_ERR_MEM(err, "GraphQL Operations Variable");
|
877
920
|
} else {
|
878
921
|
var->next = NULL;
|
879
922
|
if (NULL == (var->name = AGOO_STRDUP(name))) {
|
880
|
-
|
923
|
+
AGOO_ERR_MEM(err, "strdup()");
|
924
|
+
AGOO_FREE(var);
|
881
925
|
return NULL;
|
882
926
|
}
|
883
927
|
var->type = type;
|
@@ -893,7 +937,7 @@ make_op_var(agooErr err, agooDoc doc, gqlOp op) {
|
|
893
937
|
bool ignore;
|
894
938
|
gqlValue value = NULL;
|
895
939
|
gqlVar var;
|
896
|
-
|
940
|
+
|
897
941
|
agoo_doc_skip_white(doc);
|
898
942
|
if ('$' != *doc->cur) {
|
899
943
|
return agoo_doc_err(doc, err, "Expected $");
|
@@ -907,7 +951,7 @@ make_op_var(agooErr err, agooDoc doc, gqlOp op) {
|
|
907
951
|
return agoo_doc_err(doc, err, "Expected :");
|
908
952
|
}
|
909
953
|
doc->cur++;
|
910
|
-
|
954
|
+
|
911
955
|
if (AGOO_ERR_OK != read_type(err, doc, &type, &ignore)) {
|
912
956
|
return err->code;
|
913
957
|
}
|
@@ -939,14 +983,15 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) {
|
|
939
983
|
gqlSel sel;
|
940
984
|
|
941
985
|
if (NULL == (sel = (gqlSel)AGOO_MALLOC(sizeof(struct _gqlSel)))) {
|
942
|
-
|
986
|
+
AGOO_ERR_MEM(err, "GraphQL Selection Set");
|
943
987
|
} else {
|
944
988
|
sel->next = NULL;
|
945
989
|
if (NULL == name) {
|
946
990
|
sel->name = NULL;
|
947
991
|
} else {
|
948
992
|
if (NULL == (sel->name = AGOO_STRDUP(name))) {
|
949
|
-
|
993
|
+
AGOO_ERR_MEM(err, "strdup()");
|
994
|
+
AGOO_FREE(sel);
|
950
995
|
return NULL;
|
951
996
|
}
|
952
997
|
}
|
@@ -954,7 +999,8 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) {
|
|
954
999
|
sel->alias = NULL;
|
955
1000
|
} else {
|
956
1001
|
if (NULL == (sel->alias = AGOO_STRDUP(alias))) {
|
957
|
-
|
1002
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1003
|
+
AGOO_FREE(sel);
|
958
1004
|
return NULL;
|
959
1005
|
}
|
960
1006
|
}
|
@@ -962,7 +1008,8 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) {
|
|
962
1008
|
sel->frag = NULL;
|
963
1009
|
} else {
|
964
1010
|
if (NULL == (sel->frag = AGOO_STRDUP(frag))) {
|
965
|
-
|
1011
|
+
AGOO_ERR_MEM(err, "strdup()");
|
1012
|
+
AGOO_FREE(sel);
|
966
1013
|
return NULL;
|
967
1014
|
}
|
968
1015
|
}
|
@@ -973,7 +1020,7 @@ sel_create(agooErr err, const char *alias, const char *name, const char *frag) {
|
|
973
1020
|
sel->inline_frag = NULL;
|
974
1021
|
}
|
975
1022
|
return sel;
|
976
|
-
}
|
1023
|
+
}
|
977
1024
|
|
978
1025
|
static gqlSel
|
979
1026
|
make_sel_inline(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op) {
|
@@ -983,7 +1030,7 @@ make_sel_inline(agooErr err, agooDoc doc, gqlDoc gdoc, gqlOp op) {
|
|
983
1030
|
agoo_doc_skip_white(doc);
|
984
1031
|
if ('o' == *doc->cur && 'n' == doc->cur[1]) { // inline fragment
|
985
1032
|
char type_name[256];
|
986
|
-
|
1033
|
+
|
987
1034
|
doc->cur += 2;
|
988
1035
|
agoo_doc_skip_white(doc);
|
989
1036
|
if (0 == read_name(err, doc, type_name, sizeof(type_name))) {
|
@@ -1303,7 +1350,7 @@ make_fragment(agooErr err, agooDoc doc, gqlDoc gdoc) {
|
|
1303
1350
|
static gqlType
|
1304
1351
|
lookup_field_type(gqlType type, const char *field, bool qroot) {
|
1305
1352
|
gqlType ftype = NULL;
|
1306
|
-
|
1353
|
+
|
1307
1354
|
switch (type->kind) {
|
1308
1355
|
case GQL_OBJECT:
|
1309
1356
|
case GQL_INPUT:
|
@@ -1342,7 +1389,7 @@ lookup_field_type(gqlType type, const char *field, bool qroot) {
|
|
1342
1389
|
static int
|
1343
1390
|
sel_set_type(agooErr err, gqlType type, gqlSel sels, bool qroot) {
|
1344
1391
|
gqlSel sel;
|
1345
|
-
|
1392
|
+
|
1346
1393
|
for (sel = sels; NULL != sel; sel = sel->next) {
|
1347
1394
|
if (NULL == sel->name) { // inline or fragment
|
1348
1395
|
sel->type = type;
|
@@ -1377,7 +1424,7 @@ validate_doc(agooErr err, gqlDoc doc) {
|
|
1377
1424
|
gqlType type = NULL;
|
1378
1425
|
gqlFrag frag;
|
1379
1426
|
int cnt;
|
1380
|
-
|
1427
|
+
|
1381
1428
|
if (NULL == (schema = gql_type_get("schema"))) {
|
1382
1429
|
return agoo_err_set(err, AGOO_ERR_EVAL, "No root (schema) type defined.");
|
1383
1430
|
}
|
@@ -1395,7 +1442,7 @@ validate_doc(agooErr err, gqlDoc doc) {
|
|
1395
1442
|
}
|
1396
1443
|
} else {
|
1397
1444
|
gqlOp o2 = op->next;
|
1398
|
-
|
1445
|
+
|
1399
1446
|
for (; NULL != o2; o2 = o2->next) {
|
1400
1447
|
if (NULL == o2->name) {
|
1401
1448
|
continue;
|
data/ext/agoo/sdl.h
CHANGED
@@ -5,13 +5,15 @@
|
|
5
5
|
|
6
6
|
#include "err.h"
|
7
7
|
|
8
|
+
struct _gqlType;
|
8
9
|
struct _gqlVar;
|
10
|
+
struct _gqlValue;
|
9
11
|
|
10
12
|
extern int sdl_parse(agooErr err, const char *str, int len);
|
11
13
|
|
12
14
|
// Parse a execution definition.
|
13
15
|
extern struct _gqlDoc* sdl_parse_doc(agooErr err, const char *str, int len, struct _gqlVar *vars);
|
14
16
|
|
15
|
-
extern gqlVar gql_op_var_create(agooErr err, const char *name,
|
17
|
+
extern gqlVar gql_op_var_create(agooErr err, const char *name, struct _gqlType *type, struct _gqlValue *value);
|
16
18
|
|
17
19
|
#endif // AGOO_SDL_H
|
data/ext/agoo/server.c
CHANGED
@@ -24,17 +24,20 @@
|
|
24
24
|
|
25
25
|
struct _agooServer agoo_server = {false};
|
26
26
|
|
27
|
-
|
28
|
-
agoo_server_setup() {
|
27
|
+
int
|
28
|
+
agoo_server_setup(agooErr err) {
|
29
29
|
long i;
|
30
30
|
|
31
31
|
memset(&agoo_server, 0, sizeof(struct _agooServer));
|
32
32
|
pthread_mutex_init(&agoo_server.up_lock, 0);
|
33
33
|
agoo_server.up_list = NULL;
|
34
34
|
agoo_server.max_push_pending = 32;
|
35
|
-
|
36
|
-
|
37
|
-
|
35
|
+
|
36
|
+
if (AGOO_ERR_OK != agoo_pages_init(err) ||
|
37
|
+
AGOO_ERR_OK != agoo_queue_multi_init(err, &agoo_server.con_queue, 1024, false, true) ||
|
38
|
+
AGOO_ERR_OK != agoo_queue_multi_init(err, &agoo_server.eval_queue, 1024, true, true)) {
|
39
|
+
return err->code;
|
40
|
+
}
|
38
41
|
agoo_server.loop_max = 4;
|
39
42
|
if (0 < (i = sysconf(_SC_NPROCESSORS_ONLN))) {
|
40
43
|
i /= 2;
|
@@ -43,6 +46,7 @@ agoo_server_setup() {
|
|
43
46
|
}
|
44
47
|
agoo_server.loop_max = (int)i;
|
45
48
|
}
|
49
|
+
return AGOO_ERR_OK;
|
46
50
|
}
|
47
51
|
|
48
52
|
static void
|
@@ -301,7 +305,7 @@ agoo_server_add_func_hook(agooErr err,
|
|
301
305
|
agooHook hook = agoo_hook_func_create(method, pattern, func, queue);
|
302
306
|
|
303
307
|
if (NULL == hook) {
|
304
|
-
return
|
308
|
+
return AGOO_ERR_MEM(err, "HTTP Server Hook");
|
305
309
|
}
|
306
310
|
hook->no_queue = quick;
|
307
311
|
for (h = agoo_server.hooks; NULL != h; h = h->next) {
|
data/ext/agoo/server.h
CHANGED
@@ -49,7 +49,8 @@ typedef struct _agooServer {
|
|
49
49
|
} *agooServer;
|
50
50
|
|
51
51
|
extern struct _agooServer agoo_server;
|
52
|
-
|
52
|
+
|
53
|
+
extern int agoo_server_setup(agooErr err);
|
53
54
|
extern void agoo_server_shutdown(const char *app_name, void (*stop)());
|
54
55
|
extern void agoo_server_bind(agooBind b);
|
55
56
|
|
data/ext/agoo/upgraded.c
CHANGED
@@ -55,7 +55,7 @@ agoo_upgraded_release_con(agooUpgraded up) {
|
|
55
55
|
}
|
56
56
|
|
57
57
|
// Called from the con_loop thread, no need to lock, this steals the subject
|
58
|
-
// so the pub subject should set to NULL
|
58
|
+
// so the pub subject should be set to NULL
|
59
59
|
void
|
60
60
|
agoo_upgraded_add_subject(agooUpgraded up, agooSubject subject) {
|
61
61
|
agooSubject s;
|
@@ -166,10 +166,9 @@ agoo_upgraded_pending(agooUpgraded up) {
|
|
166
166
|
|
167
167
|
agooUpgraded
|
168
168
|
agoo_upgraded_create(agooCon c, void * ctx, void *env) {
|
169
|
-
agooUpgraded up = (agooUpgraded)
|
169
|
+
agooUpgraded up = (agooUpgraded)AGOO_CALLOC(1, sizeof(struct _agooUpgraded));
|
170
170
|
|
171
171
|
if (NULL != up) {
|
172
|
-
memset(up, 0, sizeof(struct _agooUpgraded));
|
173
172
|
up->con = c;
|
174
173
|
up->ctx = ctx;
|
175
174
|
up->env = env;
|
data/lib/agoo/version.rb
CHANGED
data/test/static_test.rb
CHANGED
@@ -31,10 +31,13 @@ class StaticTest < Minitest::Test
|
|
31
31
|
|
32
32
|
Agoo::Server.init(6469, 'root', thread_count: 1)
|
33
33
|
Agoo::Server.add_mime('odd', 'text/odd')
|
34
|
+
#Agoo::Server.header_rule('odd.odd', 'text/odd', "Cookie", "fast=Agoo");
|
35
|
+
Agoo::Server.header_rule('odd.odd', '*', "Cookie", "fast=Agoo");
|
36
|
+
Agoo::Server.header_rule('**', 'odd', "Warning", "nothing wrong");
|
34
37
|
Agoo::Server.start()
|
35
38
|
|
36
39
|
@@server_started = true
|
37
|
-
end
|
40
|
+
end
|
38
41
|
|
39
42
|
def setup
|
40
43
|
unless @@server_started
|
@@ -73,6 +76,8 @@ class StaticTest < Minitest::Test
|
|
73
76
|
h.request(req)
|
74
77
|
}
|
75
78
|
assert_equal('text/odd', res['Content-Type'])
|
79
|
+
assert_equal('fast=Agoo', res['Cookie'])
|
80
|
+
assert_equal('nothing wrong', res['Warning'])
|
76
81
|
end
|
77
82
|
|
78
83
|
def test_fetch_auto_index
|