14 use Symfony\Component\Routing\RequestContext;
23 private $requestStack;
24 private $requestContext;
28 $this->requestStack = $requestStack;
29 $this->requestContext = $requestContext;
34 if (
false !== strpos($path,
'://') ||
'//' === substr($path, 0, 2)) {
38 if (
null === $request = $this->requestStack->getMasterRequest()) {
39 return $this->getAbsoluteUrlFromContext($path);
42 if (
'#' === $path[0]) {
43 $path = $request->getRequestUri().$path;
44 } elseif (
'?' === $path[0]) {
45 $path = $request->getPathInfo().$path;
48 if (!$path ||
'/' !== $path[0]) {
49 $prefix = $request->getPathInfo();
50 $last = \strlen($prefix) - 1;
51 if ($last !== $pos = strrpos($prefix,
'/')) {
52 $prefix = substr($prefix, 0, $pos).
'/';
55 return $request->getUriForPath($prefix.$path);
58 return $request->getSchemeAndHttpHost().$path;
63 if (
false !== strpos($path,
'://') ||
'//' === substr($path, 0, 2)) {
67 if (
null === $request = $this->requestStack->getMasterRequest()) {
71 return $request->getRelativeUriForPath($path);
74 private function getAbsoluteUrlFromContext(
string $path): string
76 if (
null === $this->requestContext ||
'' === $host = $this->requestContext->getHost()) {
80 $scheme = $this->requestContext->getScheme();
83 if (
'http' === $scheme && 80 !== $this->requestContext->getHttpPort()) {
84 $port =
':'.$this->requestContext->getHttpPort();
85 } elseif (
'https' === $scheme && 443 !== $this->requestContext->getHttpsPort()) {
86 $port =
':'.$this->requestContext->getHttpsPort();
89 if (
'#' === $path[0]) {
90 $queryString = $this->requestContext->getQueryString();
91 $path = $this->requestContext->getPathInfo().($queryString ?
'?'.$queryString :
'').$path;
92 } elseif (
'?' === $path[0]) {
93 $path = $this->requestContext->getPathInfo().$path;
96 if (
'/' !== $path[0]) {
97 $path = rtrim($this->requestContext->getBaseUrl(),
'/').
'/'.$path;
100 return $scheme.
'://'.$host.$port.$path;