Ability to customize regular expression engine #192
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
class Validator becomes a templated type accepting a RegexEngine type which perform the regular expression creation and matching for the pattern constraint.
Provide the DefaultRegexEngine which perform exactly as of today (using std::regex). No breaking changes in library user.
(note that other place where std::regex are in used are not changed, (.i.e format constraint) because they are not likely to cause issue (regular expression is hard coded, not coming from the schema).
Add 2 examples with gtest_skip that can easily be uncommented to exercice the 2 problems.
Not added, because I don't want to add new dependency in the project : a full example of what can be a CustomRegexEngine class handling both problem. This can be done with pcre which allows to set
match_limit
andmatch_limit_recursion
on a pcre_extra struct that can be passed to the pcre_exec.In case theses limits are reached obviously we are not able to really know if the payload match the pattern but we can safely handle this without crash or infinite recursion.
This solution also gives library user the ability to choose any Regular Expression engine depending on its use case.