Skip to content

Commit b79dadf

Browse files
authored
Merge pull request #539 from timacdonald/session
Restore request and session on redirects
2 parents a657a07 + e662c4e commit b79dadf

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

src/ResponseFactory.php

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@
55
use Closure;
66
use Illuminate\Support\Arr;
77
use Illuminate\Support\Facades\App;
8-
use Illuminate\Http\RedirectResponse;
98
use Illuminate\Support\Facades\Request;
109
use Illuminate\Support\Traits\Macroable;
1110
use Illuminate\Contracts\Support\Arrayable;
11+
use Illuminate\Support\Facades\Redirect;
1212
use Illuminate\Support\Facades\Response as BaseResponse;
13+
use Symfony\Component\HttpFoundation\Response as SymfonyResponse;
14+
use Symfony\Component\HttpFoundation\RedirectResponse as SymfonyRedirect;
1315

1416
class ResponseFactory
1517
{
@@ -103,18 +105,14 @@ public function render(string $component, $props = []): Response
103105
}
104106

105107
/**
106-
* @param string|RedirectResponse $url
108+
* @param string|SymfonyRedirect $url
107109
*/
108-
public function location($url): \Symfony\Component\HttpFoundation\Response
110+
public function location($url): SymfonyResponse
109111
{
110-
if ($url instanceof RedirectResponse) {
111-
$url = $url->getTargetUrl();
112-
}
113-
114112
if (Request::inertia()) {
115-
return BaseResponse::make('', 409, ['X-Inertia-Location' => $url]);
113+
return BaseResponse::make('', 409, ['X-Inertia-Location' => $url instanceof SymfonyRedirect ? $url->getTargetUrl() : $url]);
116114
}
117115

118-
return new RedirectResponse($url);
116+
return $url instanceof SymfonyRedirect ? $url : Redirect::away($url);
119117
}
120118
}

tests/ResponseFactoryTest.php

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
use Illuminate\Support\Facades\Request;
1212
use Inertia\Tests\Stubs\ExampleMiddleware;
1313
use Illuminate\Contracts\Support\Arrayable;
14+
use Illuminate\Http\Request as HttpRequest;
1415
use Illuminate\Session\Middleware\StartSession;
16+
use Illuminate\Session\NullSessionHandler;
17+
use Illuminate\Session\Store;
1518

1619
class ResponseFactoryTest extends TestCase
1720
{
@@ -75,6 +78,30 @@ public function test_location_response_for_non_inertia_requests_using_redirect_r
7578
$this->assertEquals('https://inertiajs.com', $response->headers->get('location'));
7679
}
7780

81+
public function test_location_redirects_are_not_modified(): void
82+
{
83+
$response = (new ResponseFactory())->location('/foo');
84+
85+
$this->assertInstanceOf(RedirectResponse::class, $response);
86+
$this->assertEquals(Response::HTTP_FOUND, $response->getStatusCode());
87+
$this->assertEquals('/foo', $response->headers->get('location'));
88+
}
89+
90+
public function test_location_response_for_non_inertia_requests_using_redirect_response_with_existing_session_and_request_properties(): void
91+
{
92+
$redirect = new RedirectResponse('https://inertiajs.com');
93+
$redirect->setSession($session = new Store('test', new NullSessionHandler));
94+
$redirect->setRequest($request = new HttpRequest);
95+
$response = (new ResponseFactory())->location($redirect);
96+
97+
$this->assertInstanceOf(RedirectResponse::class, $response);
98+
$this->assertEquals(Response::HTTP_FOUND, $response->getStatusCode());
99+
$this->assertEquals('https://inertiajs.com', $response->headers->get('location'));
100+
$this->assertSame($session, $response->getSession());
101+
$this->assertSame($request, $response->getRequest());
102+
$this->assertSame($response, $redirect);
103+
}
104+
78105
public function test_the_version_can_be_a_closure(): void
79106
{
80107
Route::middleware([StartSession::class, ExampleMiddleware::class])->get('/', function () {

0 commit comments

Comments
 (0)