1+ <?php
2+
3+ namespace Symfony \Polyfill \Php85 \Uri ;
4+
5+ use Symfony \Polyfill \Php85 \Exception \ParsingException ;
6+
7+ /**
8+ * @author Alexandre Daubois <alex.daubois@gmail.com>
9+ *
10+ * @internal
11+ */
12+ class Rfc3986Uri extends Uri
13+ {
14+ public function __construct (string $ uri , ?string $ baseUrl = null )
15+ {
16+ if ('' === trim ($ uri )) {
17+ throw new \ValueError ('Argument #1 ($uri) cannot be empty ' );
18+ }
19+
20+ if (null !== $ baseUrl && '' === trim ($ baseUrl )) {
21+ throw new \ValueError ('Argument #2 ($baseUrl) cannot be empty ' );
22+ }
23+
24+ try {
25+ $ this ->parse ($ uri , $ baseUrl );
26+ } catch (ParsingException ) {
27+ throw new \Error ('Argument #1 ($uri) must be a valid URI ' );
28+ }
29+ }
30+
31+ private function parse (string $ uri , ?string $ baseUrl ): void
32+ {
33+ if (!preg_match ('/^[a-zA-Z][a-zA-Z\d+\-.]*:/ ' , $ uri ) && null !== $ baseUrl ) {
34+ // uri is a relative uri and bse url exists
35+ $ this ->parse (rtrim ($ baseUrl , '/ ' ).'/ ' .ltrim ($ uri , '/ ' ), null );
36+
37+ return ;
38+ }
39+
40+ if (preg_match ('/[^\x20-\x7e]/ ' , $ uri )) {
41+ // the string contains non-ascii chars
42+ throw new ParsingException ();
43+ }
44+
45+ preg_match (self ::URI_GLOBAL_REGEX , $ uri , $ matches );
46+ if (!$ matches || !isset ($ matches ['scheme ' ]) || '' === $ matches ['scheme ' ]) {
47+ //throw new InvalidUriException($uri);
48+ }
49+
50+ if (preg_match ('~ ' .$ matches ['scheme ' ].':/(?!/)~ ' , $ uri )) {
51+ //throw new InvalidUriException($uri);
52+ }
53+
54+ if (isset ($ matches ['authority ' ])) {
55+ if (!str_contains ($ uri , ':// ' ) && '' !== $ matches ['authority ' ]) {
56+ //throw new InvalidUriException($uri);
57+ }
58+
59+ preg_match (self ::URI_AUTHORITY_REGEX , $ matches ['authority ' ], $ authMatches );
60+
61+ $ matches = array_merge ($ matches , $ authMatches );
62+ unset($ matches ['authority ' ]);
63+ }
64+
65+ $ matches = array_filter ($ matches , function (string $ value ) { return '' !== $ value ; });
66+
67+ if (isset ($ matches ['host ' ]) && false === \filter_var ($ matches ['host ' ], FILTER_VALIDATE_DOMAIN , FILTER_FLAG_HOSTNAME )) {
68+ // the host contains invalid code points
69+ throw new ParsingException ();
70+ }
71+
72+ $ this ->scheme = $ matches ['scheme ' ] ?? null ;
73+ $ this ->user = isset ($ matches ['user ' ]) ? rawurldecode ($ matches ['user ' ]) : null ;
74+ $ this ->password = isset ($ matches ['pass ' ]) ? rawurldecode ($ matches ['pass ' ]) : null ;
75+ $ this ->host = $ matches ['host ' ] ?? null ;
76+ $ this ->port = $ matches ['port ' ] ?? null ;
77+ $ this ->path = isset ($ matches ['path ' ]) ? ltrim ($ matches ['path ' ], '/ ' ) : null ;
78+ $ this ->query = $ matches ['query ' ] ?? null ;
79+ $ this ->fragment = $ matches ['fragment ' ] ?? null ;
80+ }
81+ }
0 commit comments