8000 Merge branch '3.3' into 3.4 · symfony/symfony@b3547a0 · GitHub
[go: up one dir, main page]

Skip to content

Commit b3547a0

Browse files
Merge branch '3.3' into 3.4
* 3.3: Use the default host even if context is empty and fallback to relative URL if empty host
2 parents ec691b6 + ba843c6 commit b3547a0

File tree

2 files changed

+68
-37
lines changed

2 files changed

+68
-37
lines changed

src/Symfony/Component/Routing/Generator/UrlGenerator.php

Lines changed: 36 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -181,57 +181,56 @@ protected function doGenerate($variables, $defaults, $requirements, $tokens, $pa
181181
}
182182

183183
$schemeAuthority = '';
184-
if ($host = $this->context->getHost()) {
185-
$scheme = $this->context->getScheme();
184+
$host = $this->context->getHost();
185+
$scheme = $this->context->getScheme();
186186

187-
if ($requiredSchemes) {
188-
if (!in_array($scheme, $requiredSchemes, true)) {
189-
$referenceType = self::ABSOLUTE_URL;
190-
$scheme = current($requiredSchemes);
191-
}
187+
if ($requiredSchemes) {
188+
if (!in_array($scheme, $requiredSchemes, true)) {
189+
$referenceType = self::ABSOLUTE_URL;
190+
$scheme = current($requiredSchemes);
192191
}
192+
}
193193

194-
if ($hostTokens) {
195-
$routeHost = '';
196-
foreach ($hostTokens as $token) {
197-
if ('variable' === $token[0]) {
198-
if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#i'.(empty($token[4]) ? '' : 'u'), $mergedParams[$token[3]])) {
199-
if ($this->strictRequirements) {
200-
throw new InvalidParameterException(strtr($message, array('{parameter}' => $token[3], '{route}' => $name, '{expected}' => $token[2], '{given}' => $mergedParams[$token[3]])));
201-
}
202-
203-
if ($this->logger) {
204-
$this->logger->error($message, array('parameter' => $token[3], 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$token[3]]));
205-
}
194+
if ($hostTokens) {
195+
$routeHost = '';
196+
foreach ($hostTokens as $token) {
197+
if ('variable' === $token[0]) {
198+
if (null !== $this->strictRequirements && !preg_match('#^'.$token[2].'$#i'.(empty($token[4]) ? '' : 'u'), $mergedParams[$token[3]])) {
199+
if ($this->strictRequirements) {
200+
throw new InvalidParameterException(strtr($message, array('{parameter}' => $token[3], '{route}' => $name, '{expected}' => $token[2], '{given}' => $me 10000 rgedParams[$token[3]])));
201+
}
206202

207-
return;
203+
if ($this->logger) {
204+
$this->logger->error($message, array('parameter' => $token[3], 'route' => $name, 'expected' => $token[2], 'given' => $mergedParams[$token[3]]));
208205
}
209206

210-
$routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
211-
} else {
212-
$routeHost = $token[1].$routeHost;
207+
return;
213208
}
214-
}
215209

216-
if ($routeHost !== $host) {
217-
$host = $routeHost;
218-
if (self::ABSOLUTE_URL !== $referenceType) {
219-
$referenceType = self::NETWORK_PATH;
220-
}
210+
$routeHost = $token[1].$mergedParams[$token[3]].$routeHost;
211+
} else {
212+
$routeHost = $token[1].$routeHost;
221213
}
222214
}
223215

224-
if (self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) {
225-
$port = '';
226-
if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
227-
$port = ':'.$this->context->getHttpPort();
228-
} elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
229-
$port = ':'.$this->context->getHttpsPort();
216+
if ($routeHost !== $host) {
217+
$host = $routeHost;
218+
if (self::ABSOLUTE_URL !== $referenceType) {
219+
$referenceType = self::NETWORK_PATH;
230220
}
221+
}
222+
}
231223

232-
$schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://";
233-
$schemeAuthority .= $host.$port;
224+
if ((self::ABSOLUTE_URL === $referenceType || self::NETWORK_PATH === $referenceType) && !empty($host)) {
225+
$port = '';
226+
if ('http' === $scheme && 80 != $this->context->getHttpPort()) {
227+
$port = ':'.$this->context->getHttpPort();
228+
} elseif ('https' === $scheme && 443 != $this->context->getHttpsPort()) {
229+
$port = ':'.$this->context->getHttpsPort();
234230
}
231+
232+
$schemeAuthority = self::NETWORK_PATH === $referenceType ? '//' : "$scheme://";
233+
$schemeAuthority .= $host.$port;
235234
}
236235

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

src/Symfony/Component/Routing/Tests/Generator/UrlGeneratorTest.php

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

481+
public function testDefaultHostIsUsedWhenContextHostIsEmpty()
482+
{
483+
$routes = $this->getRoutes('test', new Route('/route', array('domain' => 'my.fallback.host'), array('domain' => '.+'), array(), '{domain}', array('http')));
484+
485+
$generator = $this->getGenerator($routes);
486+
$generator->getContext()->setHost('');
487+
488+
$this->assertSame('http://my.fallback.host/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
489+
}
490+
491+
public function testDefaultHostIsUsedWhenContextHostIsEmptyAndSchemeIsNot()
492+
{
493+
$routes = $this->getRoutes('test', new Route('/route', array('domain' => 'my.fallback.host'), array('domain' => '.+'), array(), '{domain}', array('http', 'https')));
494+
495+
$generator = $this->getGenerator($routes);
496+
$generator->getContext()->setHost('');
497+
$generator->getContext()->setScheme('https');
498+
499+
$this->assertSame('https://my.fallback.host/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
500+
}
501+
502+
public function testAbsoluteUrlFallbackToRelativeIfHostIsEmptyAndSchemeIsNot()
503+
{
504+
$routes = $this->getRoutes('test', new Route('/route', array(), array(), array(), '', array('http', 'https')));
505+
506+
$generator = $this->getGenerator($routes);
507+
$generator->getContext()->setHost('');
508+
$generator->getContext()->setScheme('https');
509+
510+
$this->assertSame('/app.php/route', $generator->generate('test', array(), UrlGeneratorInterface::ABSOLUTE_URL));
511+
}
512+
481513
public function testGenerateNetworkPath()
482514
{
483515
$routes = $this->getRoutes('test', new Route('/{name}', array(), array(), array(), '{locale}.example.com', array('http')));

0 commit comments

Comments
 (0)
0