Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update path2regex (again) #169

Merged
merged 1 commit into from
Oct 12, 2022
Merged

Conversation

Lord-Kamina
Copy link

@eao197 it appears the previous PR had some sort of weird merge issue, because the code was different from what I'd pushed to the performous fork. It should be fixed. If there are still problems with it, could you just let me know but not close the PR, so I can work to fix them?

Most odd was that optional-lite error you posted about, because I don't really know how that related to the PR, or where that issue was coming from.

Original PR description below:

Updated the path2regex code to be in line with the latest version of the javascript code, this version does not rely on std::cregex_iterator to create the matching pattern., and thus solves #166

I haven't tested it too extensively, but I did test it with some of the examples from the wiki, as well as in the context of performous, and it appears to be working as expected.

Of note: This version does not allow modifiers outside a capturing group, so for example to match anything the route would be "(.*)" instead of ".*"

@Lord-Kamina
Copy link
Author

I tested this under c++17 initially. Have reproduced the errors you've mentioned under c++14. They evidently have something to do with differences between the real optional/string_view and the nonstd versions.

Will update once I figure how to get it fixed.

Updated the path2regex code to be in line with the latest version of the javascript code, this version does not rely on std::cregex_iterator to create the matching pattern.
@Lord-Kamina
Copy link
Author

Lord-Kamina commented Oct 12, 2022

I just compiled it under c++14 and it seems to be working properly now.

The optional-lite error somehow came about because I did optional_t<const std::string> instead of optional_t<std::string>. There was also another error because it appears I can't use += between std::string and nonstd::string_view, both of these cases worked fine under c++17, which is why I'm assuming it had something to do with the nonstd versions.

@eao197 eao197 changed the base branch from master to 0.6-dev-pr-169 October 12, 2022 05:40
@eao197 eao197 merged commit 594fd55 into Stiffstream:0.6-dev-pr-169 Oct 12, 2022
@eao197
Copy link
Member

eao197 commented Oct 12, 2022

I'm sorry, but this PR can't be accepted too because it breaks the compatibility with existing behavior:

  • there is no more options_t::delimiters(), you replaced it by a new method options_t::prefixes(). It will break code for users that call options_t::delimiters();
  • your implementation doesn't pass our tests (at least test/router/express reports 31 broken assertions). It means that someone can find his/her routes not working anymore.

It's a pity that you spent some of your time for code that can't be merged into RESTinio-0.6. Maybe it's better to provide a minimal and self-sufficient example that shows a problem from #166 and we'll try to modify our implementation without breaking the existing behavior?

@Lord-Kamina
Copy link
Author

I'm sorry, but this PR can't be accepted too because it breaks the compatibility with existing behavior:

  • there is no more options_t::delimiters(), you replaced it by a new method options_t::prefixes(). It will break code for users that call options_t::delimiters();

I did this because it's what that field is called in the original code, and it took me quite a while to understand that. Your version has options_t::delimiter and options_t::delimiters (which came about because in your code, you merged two separate structs to create options_t), which is kinda confusing. Maybe an acceptable workaround would be to make the change, but keep options_t::delimiters as a (deprecated) alias?

  • your implementation doesn't pass our tests (at least test/router/express reports 31 broken assertions). It means that someone can find his/her routes not working anymore.

Could you give me details on this?

It's a pity that you spent some of your time for code that can't be merged into RESTinio-0.6. Maybe it's better to provide a minimal and self-sufficient example that shows a problem from #166 and we'll try to modify our implementation without breaking the existing behavior?

You can't fix it without changing it fundamentally, because I don't think it's really a problem with your code itself but rather with std::cregex_iterator, which your implementation is based around. It's as simple as, if you create a cregex_iterator after calling std::locale::global, it behaves in unexpected ways.

I am willing to keep working on this until it can be merged, but the way you manage PRs is very awkward and makes it difficult to do so, because I need to make a new PR whenever I make new changes.

@eao197
Copy link
Member

eao197 commented Oct 12, 2022

Could you give me details on this?

There is the output from the failed test:

-------------------------------------------------------------------------------
Original tests #7
-------------------------------------------------------------------------------
test/router/express/original_tests_part1.ipp:360
...............................................................................                                          

test/router/express/original_tests_part1.ipp:378: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #8
-------------------------------------------------------------------------------
test/router/express/original_tests_part1.ipp:434
...............................................................................                                          

test/router/express/original_tests_part1.ipp:476: FAILED:
  REQUIRE( params.match() == R"match(/test//)match" )
with expansion:
  /test/ == "/test//"

-------------------------------------------------------------------------------
Original tests #9
-------------------------------------------------------------------------------
test/router/express/original_tests_part1.ipp:508
...............................................................................                                          

test/router/express/original_tests_part1.ipp:526: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #11
-------------------------------------------------------------------------------
test/router/express/original_tests_part1.ipp:591
...............................................................................                                          

test/router/express/original_tests_part1.ipp:609: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #13
-------------------------------------------------------------------------------
test/router/express/original_tests_part1.ipp:732
...............................................................................                                          

test/router/express/original_tests_part1.ipp:750: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #14
-------------------------------------------------------------------------------
test/router/express/original_tests_part1.ipp:790
...............................................................................                                          

test/router/express/original_tests_part1.ipp:808: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #21
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:50
...............................................................................                                          

test/router/express/original_tests_part2.ipp:68: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #26
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:339
...............................................................................                                          

test/router/express/original_tests_part2.ipp:357: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #27
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:396
...............................................................................                                          

test/router/express/original_tests_part2.ipp:396: FAILED:
due to unexpected exception with message:
  unable to process route "/:test*-bar": regex_error

-------------------------------------------------------------------------------
Original tests #28
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:472
...............................................................................                                          

test/router/express/original_tests_part2.ipp:472: FAILED:
due to unexpected exception with message:
  unable to process route "/:test+": regex_error

-------------------------------------------------------------------------------
Original tests #29
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:543
...............................................................................                                          

test/router/express/original_tests_part2.ipp:543: FAILED:
due to unexpected exception with message:
  unable to process route "/:test(\d+)+": regex_error

-------------------------------------------------------------------------------
Original tests #30
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:588
...............................................................................                                          

test/router/express/original_tests_part2.ipp:588: FAILED:
due to unexpected exception with message:
  unable to process route "/route.:ext(json|xml)+": regex_error

-------------------------------------------------------------------------------
Original tests #31
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:659
...............................................................................                                          

test/router/express/original_tests_part2.ipp:659: FAILED:
due to unexpected exception with message:
  unable to process route "/:test*": regex_error

-------------------------------------------------------------------------------
Original tests #32
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:742
...............................................................................                                          

test/router/express/original_tests_part2.ipp:742: FAILED:
due to unexpected exception with message:
  unable to process route "/route.:ext([a-z]+)*": regex_error

-------------------------------------------------------------------------------
Original tests #34
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:877
...............................................................................                                          

test/router/express/original_tests_part2.ipp:895: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #38
-------------------------------------------------------------------------------
test/router/express/original_tests_part2.ipp:1107
...............................................................................                                          

test/router/express/original_tests_part2.ipp:1107: FAILED:
due to unexpected exception with message:
  unable to process route "/:path(abc|xyz)*": regex_error

-------------------------------------------------------------------------------
Original tests #42
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:121
...............................................................................                                          

test/router/express/original_tests_part3.ipp:139: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #46
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:400
...............................................................................                                          

test/router/express/original_tests_part3.ipp:437: FAILED:
  REQUIRE_FALSE( rm.match_route( target_path, params ) )
with expansion:
  !true

-------------------------------------------------------------------------------
Original tests #47
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:445
...............................................................................                                          

test/router/express/original_tests_part3.ipp:445: FAILED:
due to unexpected exception with message:
  unable to process route "/test.:format+": regex_error

-------------------------------------------------------------------------------
Original tests #48
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:502
...............................................................................                                          

test/router/express/original_tests_part3.ipp:520: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #50
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:592
...............................................................................                                          

test/router/express/original_tests_part3.ipp:647: FAILED:
  REQUIRE( nps[0].second == R"value(route.html)value" )
with expansion:
  route == "route.html"

-------------------------------------------------------------------------------
Original tests #51
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:662
...............................................................................                                          

test/router/express/original_tests_part3.ipp:732: FAILED:
  REQUIRE( nps[0].second == R"value(route.json)value" )
with expansion:
  route == "route.json"

-------------------------------------------------------------------------------
Original tests #52
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:747
...............................................................................                                          

test/router/express/original_tests_part3.ipp:765: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #53
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:832
...............................................................................                                          

test/router/express/original_tests_part3.ipp:857: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #55
-------------------------------------------------------------------------------
test/router/express/original_tests_part3.ipp:945
...............................................................................                                          

test/router/express/original_tests_part3.ipp:963: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #68
-------------------------------------------------------------------------------
test/router/express/original_tests_part4.ipp:82
...............................................................................                                          

test/router/express/original_tests_part4.ipp:82: FAILED:
due to unexpected exception with message:
  Missing parameter name at: 8

-------------------------------------------------------------------------------
Original tests #70
-------------------------------------------------------------------------------
test/router/express/original_tests_part4.ipp:209
...............................................................................                                          

test/router/express/original_tests_part4.ipp:227: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #75
-------------------------------------------------------------------------------
test/router/express/original_tests_part4.ipp:451
...............................................................................                                          

test/router/express/original_tests_part4.ipp:451: FAILED:
due to unexpected exception with message:
  unable to process route "/:foo+baz": regex_error

-------------------------------------------------------------------------------
Original tests #76
-------------------------------------------------------------------------------
test/router/express/original_tests_part4.ipp:515
...............................................................................                                          

test/router/express/original_tests_part4.ipp:552: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Original tests #86
-------------------------------------------------------------------------------
test/router/express/original_tests_part5.ipp:295
...............................................................................                                          

test/router/express/original_tests_part5.ipp:313: FAILED:
  REQUIRE( rm.match_route( target_path, params ) )
with expansion:
  false

-------------------------------------------------------------------------------
Invalid path
-------------------------------------------------------------------------------
test/router/express/additional_tests.ipp:69
...............................................................................

test/router/express/additional_tests.ipp:79: FAILED:
  REQUIRE_THROWS( try_to_create( R"(/:foo([123]+)))" ) )
because no exception was thrown where one was expected:

===============================================================================
test cases:  83 |  52 passed | 31 failed
assertions: 852 | 821 passed | 31 failed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants