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.

@@ -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, bool allow_args) {
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, true)) {
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
- if (AGOO_ERR_OK != make_field(err, doc, type, false)) {
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 agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocation memory for a GraphQL interface.");
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, true)) {
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocation memory for a selection field argument.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of field name failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocation memory for a operation variable.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of variable name failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "Failed to allocation memory for a selection set.");
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of selection name failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of selection alias failed. %s:%d", __FILE__, __LINE__);
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
- agoo_err_set(err, AGOO_ERR_MEMORY, "strdup of selection fragment failed. %s:%d", __FILE__, __LINE__);
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;
@@ -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, gqlType type, gqlValue value);
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
@@ -24,17 +24,20 @@
24
24
 
25
25
  struct _agooServer agoo_server = {false};
26
26
 
27
- void
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
- agoo_pages_init();
36
- agoo_queue_multi_init(&agoo_server.con_queue, 1024, false, true);
37
- agoo_queue_multi_init(&agoo_server.eval_queue, 1024, true, true);
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 agoo_err_set(err, AGOO_ERR_MEMORY, "failed to allocate memory for HTTP server Hook.");
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) {
@@ -49,7 +49,8 @@ typedef struct _agooServer {
49
49
  } *agooServer;
50
50
 
51
51
  extern struct _agooServer agoo_server;
52
- extern void agoo_server_setup();
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
 
@@ -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)AGOO_MALLOC(sizeof(struct _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;
@@ -1,5 +1,5 @@
1
1
 
2
2
  module Agoo
3
3
  # Agoo version.
4
- VERSION = '2.6.1'
4
+ VERSION = '2.7.0'
5
5
  end
@@ -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