Skip to content

Commit e0aada4

Browse files
Merge branch '2.7' into 2.8
* 2.7: Use the default host even if context is empty and fallback to relative URL if empty host
2 parents 67d6e4a + 21d7630 commit e0aada4

File tree

2 files changed

+72
-41
lines changed

2 files changed

+72
-41
lines changed

Generator/UrlGenerator.php

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -195,63 +195,62 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
195195
}
196196

197197
$schemeAuthority = '';
198-
if ($host = $this->context->getHost()) {
199-
$scheme = $this->context->getScheme();
198+
$host = $this->context->getHost();
199+
$scheme = $this->context->getScheme();
200200

201-
if ($requiredSchemes) {
202-
if (!in_array($scheme, $requiredSchemes, true)) {
203-
$referenceType = self::ABSOLUTE_URL;
204-
$scheme = current($requiredSchemes);
205-
}
206-
} elseif (isset($requirements['_scheme']) && ($req = strtolower($requirements['_scheme'])) && $scheme !== $req) {
207-
// We do this for BC; to be removed if _scheme is not supported anymore
201+
if ($requiredSchemes) {
202+
if (!in_array($scheme, $requiredSchemes, true)) {
208203
$referenceType = self::ABSOLUTE_URL;
209-
$scheme = $req;
204+
$scheme = current($requiredSchemes);
210205
}
206+
} elseif (isset($requirements['_scheme']) && ($req = strtolower($requirements['_scheme'])) && $scheme !== $req) {
207+
// We do this for BC; to be removed if _scheme is not supported anymore
208+
$referenceType = self::ABSOLUTE_URL;
209+
$scheme = $req;
210+
}
211211

212-
if ($hostTokens) {
213-
$routeHost = '';
214-
foreach ($hostTokens as $token) {
215-
if ('variable' === $token[0]) {
216-
if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#i', $mergedParams[$token[3]])) {
217-
$message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);
218-
219-
if ($this->strictRequirements) {
220-
throw new InvalidParameterException($message);
221-
}
212+
if ($hostTokens) {
213+
$routeHost = '';
214+
foreach ($hostTokens as $token) {
215+
if ('variable' === $token[0]) {
216+
if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#i', $mergedParams[$token[3]])) {
217+
$message = sprintf('Parameter "%s" for route "%s" must match "%s" ("%s" given) to generate a corresponding URL.', $token[3], $name, $token[2], $mergedParams[$token[3]]);
222218

223-
if ($this->logger) {
224-
$this->logger->error($message);
225-
}
219+
if ($this->strictRequirements) {
220+
throw new InvalidParameterException($message);
221+
}
226222

227-
return;
223+
if ($this->logger) {
224+
$this->logger->error($message);
228225
}
229226

230-
$routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
231-
} else {
232-
$routeHost = $token[1].$routeHost;
227+
return;
233228
}
234-
}
235229

236-
if ($routeHost !== $host) {
237-
$host = $routeHost;
238-
if (self::ABSOLUTE_URL !== $referenceType) {
239-
$referenceType = self::NETWORK_PATH;
240-
}
230+
$routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
231+
} else {
232+
$routeHost = $token[1].$routeHost;
241233
}
242234
}
243235

244-
if (self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) {
245-
$port = '';
246-
if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
247-
$port = ':'.$this->context->getHttpPort();
248-
} elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
249-
$port = ':'.$this->context->getHttpsPort();
236+
if ($routeHost !== $host) {
237+
$host = $routeHost;
238+
if (self::ABSOLUTE_URL !== $referenceType) {
239+
$referenceType = self::NETWORK_PATH;
250240
}
241+
}
242+
}
251243

252-
$schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://";
253-
$schemeAuthority .= $host.$port;
244+
if ((self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) && !empty($host)) {
245+
$port = '';
246+
if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
247+
$port = ':'.$this->context->getHttpPort();
248+
} elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
249+
$port = ':'.$this->context->getHttpsPort();
254250
}
251+
252+
$schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://";
253+
$schemeAuthority .= $host.$port;
255254
}
256255

257256
if (self::RELATIVE_PATH === $referenceType) {

Tests/Generator/UrlGeneratorTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,38 @@ public function testHostIsCaseInsensitive()
469469
$this->assertSame('//EN.FooBar.com/app.php/', $generator->generate('test', array('locale' => 'EN'), UrlGeneratorInterface::NETWORK_PATH));
470470
}
471471

472+
public function testDefaultHostIsUsedWhenContextHostIsEmpty()
473+
{
474+
$routes = $this->getRoutes('test', new Route('/route', array('domain' => 'my.fallback.host'), array('domain' => '.+'), array(), '{domain}', array('http')));
475+
476+
$generator = $this->getGenerator($routes);
477+
$generator->getContext()->setHost('');
478+
479+
$this->assertSame('http://my.fallback.host/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
480+
}
481+
482+
public function testDefaultHostIsUsedWhenContextHostIsEmptyAndSchemeIsNot()
483+
{
484+
$routes = $this->getRoutes('test', new Route('/route', array('domain' => 'my.fallback.host'), array('domain' => '.+'), array(), '{domain}', array('http', 'https')));
485+
486+
$generator = $this->getGenerator($routes);
487+
$generator->getContext()->setHost('');
488+
$generator->getContext()->setScheme('https');
489+
490+
$this->assertSame('https://my.fallback.host/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
491+
}
492+
493+
public function testAbsoluteUrlFallbackToRelativeIfHostIsEmptyAndSchemeIsNot()
494+
{
495+
$routes = $this->getRoutes('test', new Route('/route', array(), array(), array(), '', array('http', 'https')));
496+
497+
$generator = $this->getGenerator($routes);
498+
$generator->getContext()->setHost('');
499+
$generator->getContext()->setScheme('https');
500+
501+
$this->assertSame('/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
502+
}
503+
472504
/**
473505
* @group legacy
474506
*/

0 commit comments

Comments
 (0)