From f2cd16b5f31488eb7cb6dfa278b614ceb9acc27c Mon Sep 17 00:00:00 2001 From: Jess Archer Date: Wed, 6 Mar 2024 15:24:04 +1000 Subject: [PATCH 1/4] Fix URL generation --- src/Response.php | 3 ++- tests/ResponseTest.php | 20 ++++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/Response.php b/src/Response.php index 953a8e52..756abd84 100644 --- a/src/Response.php +++ b/src/Response.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\App; +use Illuminate\Support\Str; use GuzzleHttp\Promise\PromiseInterface; use Illuminate\Support\Traits\Macroable; use Illuminate\Contracts\Support\Arrayable; @@ -99,7 +100,7 @@ public function toResponse($request) $page = [ 'component' => $this->component, 'props' => $props, - 'url' => $request->getBaseUrl().$request->getRequestUri(), + 'url' => Str::after($request->fullUrl(), $request->getSchemeAndHttpHost()), 'version' => $this->version, ]; diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index f8035c51..07cae269 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -361,4 +361,24 @@ public function test_responsable_with_invalid_key(): void $page['props']['resource'] ); } + + public function test_the_page_url_is_prefixed_with_the_proxy_prefix(): void + { + Request::setTrustedProxies(['1.2.3.4'], Request::HEADER_X_FORWARDED_PREFIX); + + $request = Request::create('/user/123', 'GET'); + $request->server->set('REMOTE_ADDR', '1.2.3.4'); + $request->headers->set('X_FORWARDED_PREFIX', '/sub/directory'); + + $user = ['name' => 'Jonathan']; + $response = new Response('User/Edit', ['user' => $user], 'app', '123'); + $response = $response->toResponse($request); + $view = $response->getOriginalContent(); + $page = $view->getData()['page']; + + $this->assertInstanceOf(BaseResponse::class, $response); + $this->assertInstanceOf(View::class, $view); + + $this->assertSame('/sub/directory/user/123', $page['url']); + } } From f4643df84280fef5e4634694ecdf9e32fe5a520e Mon Sep 17 00:00:00 2001 From: Jess Archer Date: Wed, 6 Mar 2024 15:51:07 +1000 Subject: [PATCH 2/4] Fix issue on root requests --- src/Response.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Response.php b/src/Response.php index 756abd84..e58da0f5 100644 --- a/src/Response.php +++ b/src/Response.php @@ -100,7 +100,7 @@ public function toResponse($request) $page = [ 'component' => $this->component, 'props' => $props, - 'url' => Str::after($request->fullUrl(), $request->getSchemeAndHttpHost()), + 'url' => Str::start(Str::after($request->fullUrl(), $request->getSchemeAndHttpHost()), '/'), 'version' => $this->version, ]; From 11a8c93803ebb644116a6956111b0f02e54d6a0f Mon Sep 17 00:00:00 2001 From: Jess Archer Date: Wed, 6 Mar 2024 16:01:19 +1000 Subject: [PATCH 3/4] Prevent test from running on Laravel 6 --- tests/ResponseTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index 07cae269..4d528955 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -364,6 +364,10 @@ public function test_responsable_with_invalid_key(): void public function test_the_page_url_is_prefixed_with_the_proxy_prefix(): void { + if (version_compare(app()->version(), '7', '<')) { + $this->markTestSkipped('This test requires Laravel 7 or higher.'); + } + Request::setTrustedProxies(['1.2.3.4'], Request::HEADER_X_FORWARDED_PREFIX); $request = Request::create('/user/123', 'GET'); From 51394324c446173d044bfc128336a1ef4ae3fb88 Mon Sep 17 00:00:00 2001 From: Jess Archer Date: Wed, 6 Mar 2024 17:02:38 +1000 Subject: [PATCH 4/4] Add test for previously failing scenario --- tests/ResponseTest.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/ResponseTest.php b/tests/ResponseTest.php index 4d528955..b9e29cbb 100644 --- a/tests/ResponseTest.php +++ b/tests/ResponseTest.php @@ -385,4 +385,19 @@ public function test_the_page_url_is_prefixed_with_the_proxy_prefix(): void $this->assertSame('/sub/directory/user/123', $page['url']); } + + public function test_the_page_url_doesnt_double_up(): void + { + $request = Request::create('/subpath/product/123', 'GET', [], [], [], [ + 'SCRIPT_FILENAME' => '/project/public/index.php', + 'SCRIPT_NAME' => '/subpath/index.php', + ]); + $request->headers->add(['X-Inertia' => 'true']); + + $response = new Response('Product/Show', []); + $response = $response->toResponse($request); + $page = $response->getData(); + + $this->assertSame('/subpath/product/123', $page->url); + } }