Implement "Followup improvements for ext/uri" RFC - RFC 3986 URI building#22173
Implement "Followup improvements for ext/uri" RFC - RFC 3986 URI building#22173kocsismate wants to merge 8 commits into
Conversation
TimWolla
left a comment
There was a problem hiding this comment.
I'm not yet sure how I feel about the manual validation happening during recomposition. I'd like to take a second look later.
| return uriIsWellFormedFragmentA(p, p + len); | ||
| } | ||
|
|
||
| ZEND_ATTRIBUTE_NONNULL_ARGS(2,3,4,5,6,7,8) php_uri_parser_rfc3986_uris *php_uri_parser_rfc3986_build_from_zval( |
There was a problem hiding this comment.
how about this method? I think it's more efficient than the previous implementation, because the recomposition part was eliminated. It was also possible to get rid of two custom validation of the "global state" below. The remaining two are needed because uriparser doesn't fail in these cases (
php-src/ext/uri/uriparser/src/UriSetPath.c
Line 279 in 8fd69e1
|
I fixed a few suggestions, thank you very much! I'll continue tomorrow with the rest |
| static zend_result php_uri_parser_rfc3986_add_base_url( | ||
| UriUriA *tmp, const UriUriA *uri, const php_uri_parser_rfc3986_uris *uriparser_base_urls, const bool silent | ||
| ) { | ||
| const int result = uriAddBaseUriExMmA(tmp, uri, &uriparser_base_urls->uri, URI_RESOLVE_STRICTLY, mm); |
There was a problem hiding this comment.
CLion started to nag me about adding the const modifier for scalar values like this. As far as I know, the compilers usually find out themselves without the modifier if a value is modified or not, so in practice, its only benefit is maybe some extra explicitness. WDYT?
There was a problem hiding this comment.
The const modifier only helps you, the programmer, marking local as const won't influence the quality of the resulting machine code.
I don't think it's terribly important to mark them as const. If it's not a burden for you or goes automatically feel free to add it of course.
4ccd652 to
3048323
Compare
| char buf[MAX_LENGTH_OF_LONG + 1]; | ||
| const char *res = zend_print_long_to_buf(buf + sizeof(buf) - 1, port); | ||
|
|
||
| const bool well_formed = uriIsWellFormedPortA(res, res + strlen(res)); |
There was a problem hiding this comment.
Should also work:
| const bool well_formed = uriIsWellFormedPortA(res, res + strlen(res)); | |
| const bool well_formed = uriIsWellFormedPortA(res, buf + sizeof(buf) - 1 - res); |
There was a problem hiding this comment.
Hm, very clever, but the current approach seems much more straightforward for me
a3ec042 to
0bf64ff
Compare
TimWolla
left a comment
There was a problem hiding this comment.
I wonder if all success tests should reparse the resulting URL for extra safety. So basically add:
var_dump($uri->equals(new Uri\Rfc3986\Uri($uri->toRawString())));
at the end of every test (it should always be bool(true)).
I looked at all the tests for now. Did not yet take a full look at the implementation.
There was a problem hiding this comment.
Given that the test description explicitly mentions “falls back to a registered name”, should the test also assert on getHostType()?
| <?php | ||
|
|
||
| $builder = new Uri\Rfc3986\UriBuilder(); | ||
| $builder->setUserInfo(null); |
There was a problem hiding this comment.
| $builder->setUserInfo(null); | |
| $builder->setUserInfo('something'); | |
| $builder->setUserInfo(null); |
I think all the null tests should first set the value to something else, otherwise we are just testing that we're successfully not doing anything - since null already effectively is the default value.
| NULL | ||
| ["fragment"]=> | ||
| NULL | ||
| } No newline at end of file |
| const char *p = Z_STRVAL_P(path); | ||
| while (*p != '\0' && *p != '/') { | ||
| if (*p == ':') { | ||
| zend_throw_exception(php_uri_ce_invalid_uri_exception, "The path must not begin with \":\" when the URI doesn't contain a scheme", 0); |
There was a problem hiding this comment.
| zend_throw_exception(php_uri_ce_invalid_uri_exception, "The path must not begin with \":\" when the URI doesn't contain a scheme", 0); | |
| zend_throw_exception(php_uri_ce_invalid_uri_exception, "The path must not begin with \":\" when the URI does not contain a scheme", 0); |
Using contractions is colloquial (same applies to the other error message.
/cc @Girgias for error message suggestions.
RFC: https://wiki.php.net/rfc/uri_followup#uri_building