diff --git a/src/node.c b/src/node.c index 19262b2..86d6aa9 100644 --- a/src/node.c +++ b/src/node.c @@ -501,6 +501,10 @@ node * r3_tree_insert_pathl_(node *tree, const char *path, int path_len, route * // there are two more slugs, we should break them into several parts char *errstr = NULL; int slug_cnt = slug_count(path, path_len, &errstr); + if (errstr) { + printf("Can not insert path '%s'. Error: %s\n", path, errstr); + return NULL; + } if ( slug_cnt > 1 ) { int slug_len; diff --git a/src/slug.c b/src/slug.c index 54b4b30..5428a2a 100644 --- a/src/slug.c +++ b/src/slug.c @@ -137,7 +137,7 @@ r3_slug_t * r3_slug_parse(char *needle, int needle_len, char *offset, char **err if (state > 0) { if (errstr) { - asprintf(errstr, "incomplete slug pattern. PATH (%d): '%s', OFFSET: %ld, STATE: %d", needle_len, needle, p - needle, state); + asprintf(errstr, "Incomplete slug pattern. PATH (%d): '%s', OFFSET: %ld, STATE: %d", needle_len, needle, p - needle, state); } return NULL; } @@ -145,45 +145,6 @@ r3_slug_t * r3_slug_parse(char *needle, int needle_len, char *offset, char **err } -/* -int slug_count2(char * needle, int needle_len, char **errstr) { - // r3_slug_t * s = r3_slug_parse(needle, needle_len, needle); - - - int cnt = 0; - int state = 0; - char * p = (char*) needle; - while( (p-needle) < len) { - - if (*p == '\\' ) { - p++; p++; - } - - if (state == 1 && *p == '}') { - cnt++; - } - if ( *p == '{' ) { - state++; - } else if ( *p == '}' ) { - state--; - } - p++; - }; - info("FOUND PATTERN: '%s' (%d), STATE: %d\n", needle, len, state); - if (state != 0) { - if (errstr) { - asprintf(errstr, "incomplete slug pattern. PATTERN (%d): '%s', OFFSET: %ld, STATE: %d", len, needle, p - needle, state); - } - return 0; - } - return cnt; -} -*/ - - - - - /** * provide a quick way to count slugs, simply search for '{' */ @@ -211,7 +172,7 @@ int slug_count(const char * needle, int len, char **errstr) { info("FOUND PATTERN: '%s' (%d), STATE: %d\n", needle, len, state); if (state != 0) { if (errstr) { - asprintf(errstr, "incomplete slug pattern. PATTERN (%d): '%s', OFFSET: %ld, STATE: %d", len, needle, p - needle, state); + asprintf(errstr, "Incomplete slug pattern. PATTERN (%d): '%s', OFFSET: %ld, STATE: %d", len, needle, p - needle, state); } return 0; } diff --git a/tests/check_tree.c b/tests/check_tree.c index 61b0daf..55141c1 100644 --- a/tests/check_tree.c +++ b/tests/check_tree.c @@ -98,6 +98,27 @@ START_TEST (test_compile) } END_TEST + +START_TEST (test_incomplete_slug_path) +{ + node * n = r3_tree_create(10); + + // r3_tree_insert_path(n, "/foo-{user}-{id}", NULL, NULL); + r3_tree_insert_path(n, "/post/{handle", NULL); + r3_tree_insert_path(n, "/post/{handle:\\", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d{", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d{3", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d{3}", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d{3}}/{", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d{3}}/{a", NULL); + r3_tree_insert_path(n, "/post/{handle:\\d{3}}/{a}", NULL); + + r3_tree_free(n); +} +END_TEST + + START_TEST (test_pcre_patterns_insert) { node * n = r3_tree_create(10); @@ -387,6 +408,7 @@ Suite* r3_suite (void) { tcase_add_test(tcase, test_pcre_patterns_insert); tcase_add_test(tcase, test_pcre_patterns_insert_2); tcase_add_test(tcase, test_pcre_patterns_insert_3); + tcase_add_test(tcase, test_incomplete_slug_path); tcase_set_timeout(tcase, 30); suite_add_tcase(suite, tcase);