@@ -92,54 +92,61 @@ public static function removeDotSegments($input)
92
92
private function absolutizeUrl ()
93
93
{
94
94
$ b = $ this ->parseUrl ($ this ->baseUrl );
95
-
96
- if (!($ this ->relativeUrl === null )) {
97
- $ r = $ this ->parseUrl ($ this ->relativeUrl );
98
-
99
- // Copy relative parts to base url.
100
- if (isset ($ r ['scheme ' ])) {
101
- $ b ['scheme ' ] = $ r ['scheme ' ];
102
- }
103
- if (isset ($ r ['host ' ])) {
104
- $ b ['host ' ] = $ r ['host ' ];
105
- }
106
- if (isset ($ r ['port ' ])) {
107
- $ b ['port ' ] = $ r ['port ' ];
108
- }
109
- if (isset ($ r ['user ' ])) {
110
- $ b ['user ' ] = $ r ['user ' ];
111
- }
112
- if (isset ($ r ['pass ' ])) {
113
- $ b ['pass ' ] = $ r ['pass ' ];
114
- }
115
-
116
- if (!isset ($ r ['path ' ]) || $ r ['path ' ] === '' ) {
117
- $ r ['path ' ] = '/ ' ;
118
- }
119
- // Merge relative url with base when relative url's path doesn't start with a slash.
120
- if (!(StrUtil::startsWith ($ r ['path ' ], '/ ' ))) {
121
- $ base = mb_strrchr ($ b ['path ' ], '/ ' , true );
122
- if ($ base === false ) {
123
- $ base = '' ;
95
+ if (!isset ($ b ['path ' ])) {
96
+ $ b ['path ' ] = '/ ' ;
97
+ }
98
+ if (is_null ($ this ->relativeUrl )) {
99
+ return $ this ->unparseUrl ($ b );
100
+ }
101
+ $ r = $ this ->parseUrl ($ this ->relativeUrl );
102
+ $ r ['authorized ' ] = isset ($ r ['scheme ' ]) || isset ($ r ['host ' ]) || isset ($ r ['port ' ])
103
+ || isset ($ r ['user ' ]) || isset ($ r ['pass ' ]);
104
+ $ target = array ();
105
+ if (isset ($ r ['scheme ' ])) {
106
+ $ target ['scheme ' ] = $ r ['scheme ' ];
107
+ $ target ['host ' ] = isset ($ r ['host ' ]) ? $ r ['host ' ] : null ;
108
+ $ target ['port ' ] = isset ($ r ['port ' ]) ? $ r ['port ' ] : null ;
109
+ $ target ['user ' ] = isset ($ r ['user ' ]) ? $ r ['user ' ] : null ;
110
+ $ target ['pass ' ] = isset ($ r ['pass ' ]) ? $ r ['pass ' ] : null ;
111
+ $ target ['path ' ] = isset ($ r ['path ' ]) ? self ::removeDotSegments ($ r ['path ' ]) : null ;
112
+ $ target ['query ' ] = isset ($ r ['query ' ]) ? $ r ['query ' ] : null ;
113
+ } else {
114
+ $ target ['scheme ' ] = isset ($ b ['scheme ' ]) ? $ b ['scheme ' ] : null ;
115
+ if ($ r ['authorized ' ]) {
116
+ $ target ['host ' ] = isset ($ r ['host ' ]) ? $ r ['host ' ] : null ;
117
+ $ target ['port ' ] = isset ($ r ['port ' ]) ? $ r ['port ' ] : null ;
118
+ $ target ['user ' ] = isset ($ r ['user ' ]) ? $ r ['user ' ] : null ;
119
+ $ target ['pass ' ] = isset ($ r ['pass ' ]) ? $ r ['pass ' ] : null ;
120
+ $ target ['path ' ] = isset ($ r ['path ' ]) ? self ::removeDotSegments ($ r ['path ' ]) : null ;
121
+ $ target ['query ' ] = isset ($ r ['query ' ]) ? $ r ['query ' ] : null ;
122
+ } else {
123
+ $ target ['host ' ] = isset ($ b ['host ' ]) ? $ b ['host ' ] : null ;
124
+ $ target ['port ' ] = isset ($ b ['port ' ]) ? $ b ['port ' ] : null ;
125
+ $ target ['user ' ] = isset ($ b ['user ' ]) ? $ b ['user ' ] : null ;
126
+ $ target ['pass ' ] = isset ($ b ['pass ' ]) ? $ b ['pass ' ] : null ;
127
+ if (!isset ($ r ['path ' ]) || $ r ['path ' ] === '' ) {
128
+ $ target ['path ' ] = $ b ['path ' ];
129
+ $ target ['query ' ] = isset ($ r ['query ' ]) ? $ r ['query ' ] : (isset ($ b ['query ' ]) ? $ b ['query ' ] : null );
130
+ } else {
131
+ if (StrUtil::startsWith ($ r ['path ' ], '/ ' )) {
132
+ $ target ['path ' ] = self ::removeDotSegments ($ r ['path ' ]);
133
+ } else {
134
+ $ base = mb_strrchr ($ b ['path ' ], '/ ' , true );
135
+ if ($ base === false ) {
136
+ $ base = '' ;
137
+ }
138
+ $ target ['path ' ] = self ::removeDotSegments ($ base . '/ ' . $ r ['path ' ]);
139
+ }
140
+ $ target ['query ' ] = isset ($ r ['query ' ]) ? $ r ['query ' ] : null ;
124
141
}
125
- $ r ['path ' ] = $ base . '/ ' . $ r ['path ' ];
126
- }
127
- $ b ['path ' ] = $ r ['path ' ];
128
- $ b ['path ' ] = $ this ->removeDotSegments ($ b ['path ' ]);
129
-
130
- if (isset ($ r ['query ' ])) {
131
- $ b ['query ' ] = $ r ['query ' ];
132
- }
133
- if (isset ($ r ['fragment ' ])) {
134
- $ b ['fragment ' ] = $ r ['fragment ' ];
135
142
}
136
143
}
137
-
138
- if (!isset ($ b ['path ' ])) {
139
- $ b ['path ' ] = '/ ' ;
144
+ if ($ this ->relativeUrl === '' ) {
145
+ $ target ['fragment ' ] = isset ($ b ['fragment ' ]) ? $ b ['fragment ' ] : null ;
146
+ } else {
147
+ $ target ['fragment ' ] = isset ($ r ['fragment ' ]) ? $ r ['fragment ' ] : null ;
140
148
}
141
-
142
- $ absolutized_url = $ this ->unparseUrl ($ b );
149
+ $ absolutized_url = $ this ->unparseUrl ($ target );
143
150
return $ absolutized_url ;
144
151
}
145
152
@@ -160,8 +167,8 @@ private function parseUrl($url)
160
167
$ unreserved = $ alpha . $ digit . preg_quote ('-._~ ' );
161
168
162
169
// sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
163
- // / "*" / "+" / "," / ";" / "="
164
- $ sub_delims = preg_quote ('!$& \'()*+,;= ' );
170
+ // / "*" / "+" / "," / ";" / "=" / "#"
171
+ $ sub_delims = preg_quote ('!$& \'()*+,;=# ' );
165
172
166
173
// HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
167
174
$ hexdig = $ digit . 'A-F ' ;
0 commit comments