Skip to content

Commit 208daf8

Browse files
committed
make it supports resource uri creation
1 parent f21c216 commit 208daf8

File tree

8 files changed

+104
-40
lines changed

8 files changed

+104
-40
lines changed

serve/bbf.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ static const param_dispatch_t param_map[] = {
3636
},
3737
{
3838
.property = "source",
39-
.type = PARAM_TYPE_BLOB,
39+
.type = PARAM_TYPE_BODY,
4040
.on_blob = uri_bbf_on_source_blob,
4141
.offset = 0,
4242
},
@@ -76,7 +76,7 @@ static void uri_bbf_on_source_blob(void* context, ebb_buf data)
7676
parser->source = data;
7777
}
7878

79-
void* uri_bbf_detect_objects_parse(const void* context, void* parsed, const char* buf, size_t len, uri_parse_state_t state, int header_index)
79+
void* uri_bbf_detect_objects_parse(const void* context, void* parsed, int resource_id, const char* buf, size_t len, uri_parse_state_t state, int header_index)
8080
{
8181
bbf_param_parser_t* parser;
8282
if (parsed)
@@ -94,7 +94,7 @@ void* uri_bbf_detect_objects_parse(const void* context, void* parsed, const char
9494
case URI_MULTIPART_HEADER_FIELD:
9595
case URI_MULTIPART_HEADER_VALUE:
9696
case URI_MULTIPART_DATA:
97-
param_parser_execute(&parser->param_parser, buf, len, state, header_index);
97+
param_parser_execute(&parser->param_parser, resource_id, buf, len, state, header_index);
9898
break;
9999
}
100100
return parser;
@@ -135,6 +135,8 @@ int uri_bbf_detect_objects_intro(const void* context, const void* parsed, ebb_bu
135135

136136
int uri_bbf_detect_objects(const void* context, const void* parsed, ebb_buf* buf)
137137
{
138+
if (!parsed)
139+
return -1;
138140
bbf_param_parser_t* parser = (bbf_param_parser_t*)parsed;
139141
param_parser_terminate(&parser->param_parser);
140142
if (parser->source.data == 0)

serve/dpm.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ static const param_dispatch_t param_map[] = {
2626
},
2727
{
2828
.property = "source",
29-
.type = PARAM_TYPE_BLOB,
29+
.type = PARAM_TYPE_BODY,
3030
.on_blob = uri_dpm_on_source_blob,
3131
.offset = 0,
3232
},
@@ -74,7 +74,7 @@ static void uri_dpm_on_source_blob(void* context, ebb_buf data)
7474
parser->source = data;
7575
}
7676

77-
void* uri_dpm_detect_objects_parse(const void* context, void* parsed, const char* buf, size_t len, uri_parse_state_t state, int header_index)
77+
void* uri_dpm_detect_objects_parse(const void* context, void* parsed, int resource_id, const char* buf, size_t len, uri_parse_state_t state, int header_index)
7878
{
7979
dpm_param_parser_t* parser;
8080
if (parsed)
@@ -92,7 +92,7 @@ void* uri_dpm_detect_objects_parse(const void* context, void* parsed, const char
9292
case URI_MULTIPART_HEADER_FIELD:
9393
case URI_MULTIPART_HEADER_VALUE:
9494
case URI_MULTIPART_DATA:
95-
param_parser_execute(&parser->param_parser, buf, len, state, header_index);
95+
param_parser_execute(&parser->param_parser, resource_id, buf, len, state, header_index);
9696
break;
9797
}
9898
return parser;
@@ -142,6 +142,8 @@ int uri_dpm_detect_objects_intro(const void* context, const void* parsed, ebb_bu
142142

143143
int uri_dpm_detect_objects(const void* context, const void* parsed, ebb_buf* buf)
144144
{
145+
if (!parsed)
146+
return -1;
145147
dpm_param_parser_t* parser = (dpm_param_parser_t*)parsed;
146148
param_parser_terminate(&parser->param_parser);
147149
if (parser->source.data == 0)

serve/parsers.c

Lines changed: 37 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,10 @@ void param_parser_terminate(param_parser_t* parser)
438438
case PARAM_TYPE_INT:
439439
*(int*)(parser->parsed + dispatch->offset) = (int)(parser->numeric_parser.result + 0.5);
440440
break;
441+
case PARAM_TYPE_ID:
442+
if (*(int*)(parser->parsed + dispatch->offset) < 0) // original is illegal resource id
443+
*(int*)(parser->parsed + dispatch->offset) = (int)(parser->numeric_parser.result + 0.5);
444+
break;
441445
case PARAM_TYPE_FLOAT:
442446
*(float*)(parser->parsed + dispatch->offset) = (float)parser->numeric_parser.result;
443447
break;
@@ -458,6 +462,7 @@ void param_parser_terminate(param_parser_t* parser)
458462
dispatch->on_string(parser->context, parser->string_parser.string);
459463
break;
460464
case PARAM_TYPE_BLOB:
465+
case PARAM_TYPE_BODY:
461466
if (dispatch->on_blob)
462467
dispatch->on_blob(parser->context, parser->blob_parser.data);
463468
break;
@@ -477,6 +482,7 @@ static void param_type_parser_init(param_parser_t* parser)
477482
switch (parser->param_map[parser->state].type)
478483
{
479484
case PARAM_TYPE_INT:
485+
case PARAM_TYPE_ID:
480486
case PARAM_TYPE_FLOAT:
481487
case PARAM_TYPE_DOUBLE:
482488
numeric_parser_init(&parser->numeric_parser);
@@ -492,6 +498,7 @@ static void param_type_parser_init(param_parser_t* parser)
492498
string_parser_init(&parser->string_parser);
493499
break;
494500
case PARAM_TYPE_BLOB:
501+
case PARAM_TYPE_BODY:
495502
blob_parser_init(&parser->blob_parser);
496503
break;
497504
}
@@ -503,6 +510,7 @@ static void param_type_parser_execute(param_parser_t* parser, const char* buf, s
503510
switch (parser->param_map[parser->state].type)
504511
{
505512
case PARAM_TYPE_INT:
513+
case PARAM_TYPE_ID:
506514
case PARAM_TYPE_FLOAT:
507515
case PARAM_TYPE_DOUBLE:
508516
numeric_parser_execute(&parser->numeric_parser, buf, len);
@@ -526,6 +534,7 @@ static void param_type_parser_execute(param_parser_t* parser, const char* buf, s
526534
parser->state = s_param_skip;
527535
break;
528536
case PARAM_TYPE_BLOB:
537+
case PARAM_TYPE_BODY:
529538
blob_parser_execute(&parser->blob_parser, buf, len);
530539
break;
531540
}
@@ -585,11 +594,27 @@ void param_parser_init(param_parser_t* parser, const param_dispatch_t* param_map
585594
parser->context = context;
586595
parser->cursor = 0;
587596
memset(parser->name, 0, sizeof(parser->name));
588-
// we treat "source" differently, because it is the parameter for content body
589-
parser->source = find_param_dispatch_state(parser, "source");
597+
// find out the special bodies that we cared about (PARAM_TYPE_BODY and PARAM_TYPE_ID)
598+
parser->body = parser->resource = s_param_start;
599+
int i;
600+
for (i = 0; i < len; i++)
601+
switch (param_map[i].type)
602+
{
603+
default:
604+
break;
605+
case PARAM_TYPE_ID:
606+
assert(parser->resource == s_param_start);
607+
*(int*)(parser->parsed + param_map[i].offset) = -1; // set id == -1 first.
608+
parser->resource = i;
609+
break;
610+
case PARAM_TYPE_BODY:
611+
assert(parser->body == s_param_start);
612+
parser->body = i;
613+
break;
614+
}
590615
}
591616

592-
void param_parser_execute(param_parser_t* parser, const char* buf, size_t len, uri_parse_state_t state, int header_index)
617+
void param_parser_execute(param_parser_t* parser, int resource_id, const char* buf, size_t len, uri_parse_state_t state, int header_index)
593618
{
594619
switch (state)
595620
{
@@ -599,13 +624,13 @@ void param_parser_execute(param_parser_t* parser, const char* buf, size_t len, u
599624
query_string_parser_execute(&parser->query_string_parser, buf, len);
600625
break;
601626
case URI_CONTENT_BODY:
602-
if (parser->source == s_param_skip)
627+
if (parser->body == s_param_skip)
603628
break;
604-
if (parser->state != s_param_start && parser->state != parser->source)
629+
if (parser->state != s_param_start && parser->state != parser->body)
605630
param_parser_terminate(parser);
606631
if (parser->state == s_param_start)
607632
{
608-
parser->state = parser->source;
633+
parser->state = parser->body;
609634
param_type_parser_init(parser);
610635
}
611636
param_type_parser_execute(parser, buf, len);
@@ -632,6 +657,8 @@ void param_parser_execute(param_parser_t* parser, const char* buf, size_t len, u
632657
param_type_parser_execute(parser, buf, len);
633658
break;
634659
}
660+
if (resource_id >= 0 && parser->resource != s_param_start)
661+
*(int*)(parser->parsed + parser->param_map[parser->resource].offset) = resource_id;
635662
}
636663

637664
ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len, const char* response_format)
@@ -652,6 +679,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
652679
switch (param_map[i].type)
653680
{
654681
case PARAM_TYPE_INT:
682+
case PARAM_TYPE_ID:
655683
body_len += sizeof(int_type) - 1;
656684
break;
657685
case PARAM_TYPE_FLOAT:
@@ -671,6 +699,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
671699
body_len += sizeof(string_type) - 1;
672700
break;
673701
case PARAM_TYPE_BLOB:
702+
case PARAM_TYPE_BODY:
674703
body_len += sizeof(blob_type) - 1;
675704
break;
676705
}
@@ -695,6 +724,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
695724
switch (param_map[i].type)
696725
{
697726
case PARAM_TYPE_INT:
727+
case PARAM_TYPE_ID:
698728
memcpy(data + body.written, int_type, sizeof(int_type) - 1);
699729
body.written += sizeof(int_type) + 2;
700730
break;
@@ -720,6 +750,7 @@ ebb_buf param_parser_map_http_body(const param_dispatch_t* param_map, size_t len
720750
body.written += sizeof(string_type) + 2;
721751
break;
722752
case PARAM_TYPE_BLOB:
753+
case PARAM_TYPE_BODY:
723754
memcpy(data + body.written, blob_type, sizeof(blob_type) - 1);
724755
body.written += sizeof(blob_type) + 2;
725756
break;

serve/serve.c

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ typedef struct {
1111

1212
typedef struct {
1313
ebb_connection* connection;
14+
int resource;
1415
uri_dispatch_t* dispatcher;
1516
void* context;
1617
ebb_buf response;
@@ -20,46 +21,62 @@ static void on_request_path(ebb_request* request, const char* at, size_t length)
2021
{
2122
ebb_request_extras* request_extras = (ebb_request_extras*)request->data;
2223
char* path = (char*)at;
23-
char eof = path[length];
24-
path[length] = '\0';
24+
int i;
25+
int resource = 0, multiple = 1;
26+
for (i = length - 1; i >= 0; i--)
27+
if (path[i] >= '0' && path[i] <= '9')
28+
{
29+
resource += (path[i] - '0') * multiple;
30+
multiple *= 10;
31+
} else if (path[i] != '/') {
32+
i = length;
33+
resource = -1;
34+
break;
35+
} else
36+
break;
37+
char eof = path[i];
38+
path[i] = '\0';
2539
request_extras->dispatcher = find_uri_dispatch(path);
40+
request_extras->resource = resource;
2641
request_extras->context = 0;
27-
path[length] = eof;
42+
if (resource >= 0 && request_extras->dispatcher && request_extras->dispatcher->parse)
43+
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, request_extras->resource, at, length, URI_PARSE_TERMINATE, 0); // this kicks off resource id
44+
path[i] = eof;
2845
}
2946

3047
static void on_request_query_string(ebb_request* request, const char* at, size_t length)
3148
{
3249
ebb_request_extras* request_extras = (ebb_request_extras*)request->data;
3350
if (request_extras->dispatcher && request_extras->dispatcher->parse)
34-
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, at, length, URI_QUERY_STRING, 0);
51+
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, request_extras->resource, at, length, URI_QUERY_STRING, 0);
3552
}
3653

3754
static void on_request_part_data(ebb_request* request, const char* at, size_t length)
3855
{
3956
ebb_request_extras* request_extras = (ebb_request_extras*)request->data;
4057
if (request_extras->dispatcher && request_extras->dispatcher->parse)
41-
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, at, length, URI_MULTIPART_DATA, -1);
58+
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, request_extras->resource, at, length, URI_MULTIPART_DATA, -1);
4259
}
4360

4461
static void on_request_multipart_header_field(ebb_request* request, const char* at, size_t length, int header_index)
4562
{
4663
ebb_request_extras* request_extras = (ebb_request_extras*)request->data;
4764
if (request_extras->dispatcher && request_extras->dispatcher->parse)
48-
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, at, length, URI_MULTIPART_HEADER_FIELD, header_index);
65+
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, request_extras->resource, at, length, URI_MULTIPART_HEADER_FIELD, header_index);
4966
}
5067

5168
static void on_request_multipart_header_value(ebb_request* request, const char* at, size_t length, int header_index)
5269
{
5370
ebb_request_extras* request_extras = (ebb_request_extras*)request->data;
5471
if (request_extras->dispatcher && request_extras->dispatcher->parse)
55-
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, at, length, URI_MULTIPART_HEADER_VALUE, header_index);
72+
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, request_extras->resource, at, length, URI_MULTIPART_HEADER_VALUE, header_index);
5673
}
5774

5875
static void on_request_body(ebb_request* request, const char* at, size_t length)
5976
{
6077
ebb_request_extras* request_extras = (ebb_request_extras*)request->data;
6178
if (request_extras->dispatcher && request_extras->dispatcher->parse && request->multipart_boundary_len == 0)
62-
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, at, length, URI_CONTENT_BODY, -1);
79+
request_extras->context = request_extras->dispatcher->parse(request_extras->dispatcher->context, request_extras->context, request_extras->resource, at, length, URI_CONTENT_BODY, -1);
6380
}
6481

6582
static void on_connection_response_continue(ebb_connection* connection)
@@ -109,7 +126,7 @@ static void on_request_execute(void* context)
109126
case EBB_DELETE:
110127
if (request_extras->dispatcher->delete)
111128
{
112-
response_code = request_extras->dispatcher->get(request_extras->dispatcher->context, request_extras->context, &request_extras->response);
129+
response_code = request_extras->dispatcher->delete(request_extras->dispatcher->context, request_extras->context, &request_extras->response);
113130
break;
114131
}
115132
default:

serve/sift.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ static const param_dispatch_t param_map[] = {
3434
},
3535
{
3636
.property = "source",
37-
.type = PARAM_TYPE_BLOB,
37+
.type = PARAM_TYPE_BODY,
3838
.on_blob = uri_sift_on_source_blob,
3939
.offset = 0,
4040
},
@@ -93,7 +93,7 @@ void uri_sift_destroy(void* context)
9393
free(sift_context);
9494
}
9595

96-
void* uri_sift_parse(const void* context, void* parsed, const char* buf, size_t len, uri_parse_state_t state, int header_index)
96+
void* uri_sift_parse(const void* context, void* parsed, int resource_id, const char* buf, size_t len, uri_parse_state_t state, int header_index)
9797
{
9898
sift_param_parser_t* parser;
9999
if (parsed)
@@ -111,7 +111,7 @@ void* uri_sift_parse(const void* context, void* parsed, const char* buf, size_t
111111
case URI_MULTIPART_HEADER_FIELD:
112112
case URI_MULTIPART_HEADER_VALUE:
113113
case URI_MULTIPART_DATA:
114-
param_parser_execute(&parser->param_parser, buf, len, state, header_index);
114+
param_parser_execute(&parser->param_parser, resource_id, buf, len, state, header_index);
115115
break;
116116
}
117117
return parser;
@@ -127,6 +127,8 @@ int uri_sift_intro(const void* context, const void* parsed, ebb_buf* buf)
127127

128128
int uri_sift(const void* context, const void* parsed, ebb_buf* buf)
129129
{
130+
if (!parsed)
131+
return -1;
130132
sift_param_parser_t* parser = (sift_param_parser_t*)parsed;
131133
param_parser_terminate(&parser->param_parser);
132134
if (parser->source.data == 0)

serve/swt.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ static const param_dispatch_t param_map[] = {
104104
},
105105
{
106106
.property = "source",
107-
.type = PARAM_TYPE_BLOB,
107+
.type = PARAM_TYPE_BODY,
108108
.on_blob = uri_swt_on_source_blob,
109109
.offset = 0,
110110
},
@@ -164,7 +164,7 @@ static void uri_swt_on_source_blob(void* context, ebb_buf data)
164164
parser->source = data;
165165
}
166166

167-
void* uri_swt_detect_words_parse(const void* context, void* parsed, const char* buf, size_t len, uri_parse_state_t state, int header_index)
167+
void* uri_swt_detect_words_parse(const void* context, void* parsed, int resource_id, const char* buf, size_t len, uri_parse_state_t state, int header_index)
168168
{
169169
swt_param_parser_t* parser;
170170
if (parsed)
@@ -181,7 +181,7 @@ void* uri_swt_detect_words_parse(const void* context, void* parsed, const char*
181181
case URI_MULTIPART_HEADER_FIELD:
182182
case URI_MULTIPART_HEADER_VALUE:
183183
case URI_MULTIPART_DATA:
184-
param_parser_execute(&parser->param_parser, buf, len, state, header_index);
184+
param_parser_execute(&parser->param_parser, resource_id, buf, len, state, header_index);
185185
break;
186186
}
187187
return parser;
@@ -197,6 +197,8 @@ int uri_swt_detect_words_intro(const void* context, const void* parsed, ebb_buf*
197197

198198
int uri_swt_detect_words(const void* context, const void* parsed, ebb_buf* buf)
199199
{
200+
if (!parsed)
201+
return -1;
200202
swt_param_parser_t* parser = (swt_param_parser_t*)parsed;
201203
param_parser_terminate(&parser->param_parser);
202204
if (parser->source.data == 0)

0 commit comments

Comments
 (0)