diff --git a/packages/astro/e2e/fixtures/server-client-address/astro.config.mjs b/packages/astro/e2e/fixtures/server-client-address/astro.config.mjs new file mode 100644 index 0000000000..10eb309c96 --- /dev/null +++ b/packages/astro/e2e/fixtures/server-client-address/astro.config.mjs @@ -0,0 +1,8 @@ +import { defineConfig } from 'astro/config'; +import nodejs from '@astrojs/node'; + +// https://astro.build/config +export default defineConfig({ + output: 'server', + adapter: nodejs({ mode: 'standalone' }), +}); diff --git a/packages/astro/e2e/fixtures/server-client-address/package.json b/packages/astro/e2e/fixtures/server-client-address/package.json new file mode 100644 index 0000000000..89dc676dae --- /dev/null +++ b/packages/astro/e2e/fixtures/server-client-address/package.json @@ -0,0 +1,12 @@ +{ + "name": "@e2e/server-client-address", + "version": "0.0.0", + "private": true, + "scripts": { + "dev": "astro dev" + }, + "dependencies": { + "astro": "workspace:*", + "@astrojs/node": "^9.0.0" + } +} diff --git a/packages/astro/e2e/fixtures/server-client-address/src/actions/index.ts b/packages/astro/e2e/fixtures/server-client-address/src/actions/index.ts new file mode 100644 index 0000000000..f28c683062 --- /dev/null +++ b/packages/astro/e2e/fixtures/server-client-address/src/actions/index.ts @@ -0,0 +1,11 @@ +import { defineAction } from 'astro:actions'; + +export const server = { + address: defineAction({ + accept: 'form', + handler: async (_, ctx) => { + console.log('Actions executed'); + return ctx.clientAddress; + } + }) +} diff --git a/packages/astro/e2e/fixtures/server-client-address/src/middleware.ts b/packages/astro/e2e/fixtures/server-client-address/src/middleware.ts new file mode 100644 index 0000000000..88aec7ecd4 --- /dev/null +++ b/packages/astro/e2e/fixtures/server-client-address/src/middleware.ts @@ -0,0 +1,5 @@ +export const onRequest = (ctx, next) => { + console.log(ctx.clientAddress); + + return next(); +} diff --git a/packages/astro/e2e/fixtures/server-client-address/src/pages/endpoint.ts b/packages/astro/e2e/fixtures/server-client-address/src/pages/endpoint.ts new file mode 100644 index 0000000000..600a4123b4 --- /dev/null +++ b/packages/astro/e2e/fixtures/server-client-address/src/pages/endpoint.ts @@ -0,0 +1,11 @@ +export const GET = (ctx) => { + return Response.json({ + clientAddress: ctx.clientAddress !== undefined + }); +} + +export const POST = (ctx) => { + return Response.json({ + clientAddress: ctx.clientAddress !== undefined + }); +} diff --git a/packages/astro/e2e/fixtures/server-client-address/src/pages/index.astro b/packages/astro/e2e/fixtures/server-client-address/src/pages/index.astro new file mode 100644 index 0000000000..f025a44c38 --- /dev/null +++ b/packages/astro/e2e/fixtures/server-client-address/src/pages/index.astro @@ -0,0 +1,5 @@ +--- +const address = Astro.clientAddress; +--- + +
{address !== undefined}
diff --git a/packages/astro/e2e/server-client-address.test.js b/packages/astro/e2e/server-client-address.test.js new file mode 100644 index 0000000000..ea167fe7fe --- /dev/null +++ b/packages/astro/e2e/server-client-address.test.js @@ -0,0 +1,50 @@ +import { expect } from '@playwright/test'; +import { testFactory } from './test-utils.js'; + +const test = testFactory(import.meta.url, { + root: './fixtures/server-client-address/', +}); + +test.describe('Server access to client address', () => { + test.describe('Development', () => { + let devServer; + + test.beforeAll(async ({ astro }) => { + devServer = await astro.startDevServer({ + logLevel: 'debug', + vite: { + logLevel: 'debug', + } + }); + }); + + test.afterAll(async () => { + await devServer.stop(); + }); + + test('Load a page using client address', async ({ page, astro }) => { + await page.goto(astro.resolveUrl('/')); + let el = page.locator('div#address'); + await el.click(); + + await expect(el, 'element rendered').toBeVisible(); + await expect(el, 'should have content').toHaveText('true'); + }); + + test('Load an endpoint using client address', async ({ page, astro }) => { + await page.goto(astro.resolveUrl('/endpoint')); + const res = await astro.fetch('/endpoint'); + const content = await res.json(); + + expect(content).toEqual({ clientAddress: true }); + }); + + test('Load a POST endpoint using client address', async ({ page, astro }) => { + await page.goto(astro.resolveUrl('/endpoint')); + const res = await astro.fetch('/endpoint', {method: 'POST'}); + const content = await res.json(); + + expect(content).toEqual({ clientAddress: true }); + }); + }); +}); diff --git a/packages/astro/src/core/request.ts b/packages/astro/src/core/request.ts index 624bee8798..68514d03bd 100644 --- a/packages/astro/src/core/request.ts +++ b/packages/astro/src/core/request.ts @@ -62,6 +62,10 @@ export function createRequest({ url.search = ''; } + console.log({ + isPrerendered, body, + }); + const request = new Request(url, { method: method, headers: headersObj,