Browse Source

Fix missing base path in HttpsEnforcerMiddleware

Fixes #16094
Mark Story 4 years ago
parent
commit
a8d2db674b

+ 4 - 0
src/Http/Middleware/HttpsEnforcerMiddleware.php

@@ -82,6 +82,10 @@ class HttpsEnforcerMiddleware implements MiddlewareInterface
 
         if ($this->config['redirect'] && $request->getMethod() === 'GET') {
             $uri = $request->getUri()->withScheme('https');
+            $base = $request->getAttribute('base');
+            if ($base) {
+                $uri = $uri->withPath($base . $uri->getPath());
+            }
 
             return new RedirectResponse(
                 $uri,

+ 20 - 0
tests/TestCase/Http/Middleware/HttpsEnforcerMiddlewareTest.php

@@ -95,6 +95,26 @@ class HttpsEnforcerMiddlewareTest extends TestCase
         );
     }
 
+    public function testRedirectBasePath(): void
+    {
+        $request = new ServerRequest([
+            'url' => '/articles',
+            'base' => '/base',
+            'method' => 'GET',
+        ]);
+
+        $handler = new TestRequestHandler(function () {
+            return new Response();
+        });
+
+        $middleware = new HttpsEnforcerMiddleware();
+
+        $result = $middleware->process($request, $handler);
+        $this->assertInstanceOf(RedirectResponse::class, $result);
+        $this->assertSame(301, $result->getStatusCode());
+        $this->assertEquals(['location' => ['https://localhost/base/articles']], $result->getHeaders());
+    }
+
     /**
      * Test that exception is thrown when redirect is disabled.
      */