--- /dev/null
+--TEST--
+Bug #73192: parse_url return wrong hostname
+--FILE--
+<?php
+
+var_dump(parse_url("http://example.com:80#@google.com/"));
+var_dump(parse_url("http://example.com:80?@google.com/"));
+
+?>
+--EXPECT--
+array(4) {
+ ["scheme"]=>
+ string(4) "http"
+ ["host"]=>
+ string(11) "example.com"
+ ["port"]=>
+ int(80)
+ ["fragment"]=>
+ string(12) "@google.com/"
+}
+array(4) {
+ ["scheme"]=>
+ string(4) "http"
+ ["host"]=>
+ string(11) "example.com"
+ ["port"]=>
+ int(80)
+ ["query"]=>
+ string(12) "@google.com/"
+}
int(6)
}
---> http://?:/: array(3) {
- ["scheme"]=>
- string(4) "http"
- ["host"]=>
- string(1) "?"
- ["path"]=>
- string(1) "/"
-}
+--> http://?:/: bool(false)
---> http://@?:/: array(4) {
- ["scheme"]=>
- string(4) "http"
- ["host"]=>
- string(1) "?"
- ["user"]=>
- string(0) ""
- ["path"]=>
- string(1) "/"
-}
+--> http://@?:/: bool(false)
--> file:///:: array(2) {
["scheme"]=>
--> http://::? : string(4) "http"
--> http://::# : string(4) "http"
--> x://::6.5 : string(1) "x"
---> http://?:/ : string(4) "http"
---> http://@?:/ : string(4) "http"
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : string(4) "file"
--> file:///a:/ : string(4) "file"
--> file:///ab:/ : string(4) "file"
--> http://::? : string(1) ":"
--> http://::# : string(1) ":"
--> x://::6.5 : string(1) ":"
---> http://?:/ : string(1) "?"
---> http://@?:/ : string(1) "?"
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : NULL
--> file:///a:/ : NULL
--> file:///ab:/ : NULL
--> http://::? : NULL
--> http://::# : NULL
--> x://::6.5 : int(6)
---> http://?:/ : NULL
---> http://@?:/ : NULL
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : NULL
--> file:///a:/ : NULL
--> file:///ab:/ : NULL
--> http://::? : NULL
--> http://::# : NULL
--> x://::6.5 : NULL
---> http://?:/ : NULL
---> http://@?:/ : string(0) ""
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : NULL
--> file:///a:/ : NULL
--> file:///ab:/ : NULL
--> http://::? : NULL
--> http://::# : NULL
--> x://::6.5 : NULL
---> http://?:/ : NULL
---> http://@?:/ : NULL
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : NULL
--> file:///a:/ : NULL
--> file:///ab:/ : NULL
--> http://::? : NULL
--> http://::# : NULL
--> x://::6.5 : NULL
---> http://?:/ : string(1) "/"
---> http://@?:/ : string(1) "/"
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : string(2) "/:"
--> file:///a:/ : string(3) "a:/"
--> file:///ab:/ : string(5) "/ab:/"
--> http://::? : NULL
--> http://::# : NULL
--> x://::6.5 : NULL
---> http://?:/ : NULL
---> http://@?:/ : NULL
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : NULL
--> file:///a:/ : NULL
--> file:///ab:/ : NULL
--> http://::? : NULL
--> http://::# : NULL
--> x://::6.5 : NULL
---> http://?:/ : NULL
---> http://@?:/ : NULL
+--> http://?:/ : bool(false)
+--> http://@?:/ : bool(false)
--> file:///: : NULL
--> file:///a:/ : NULL
--> file:///ab:/ : NULL
goto nohost;
}
- e = ue;
-
- if (!(p = memchr(s, '/', (ue - s)))) {
- char *query, *fragment;
-
- query = memchr(s, '?', (ue - s));
- fragment = memchr(s, '#', (ue - s));
-
- if (query && fragment) {
- if (query > fragment) {
- e = fragment;
- } else {
- e = query;
- }
- } else if (query) {
- e = query;
- } else if (fragment) {
- e = fragment;
- }
- } else {
- e = p;
- }
+ e = s + strcspn(s, "/?#");
/* check for login and password */
if ((p = zend_memrchr(s, '@', (e-s)))) {