Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions packages/kit/src/runtime/server/constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const NULL_BODY_STATUS = [101, 103, 204, 205, 304];
11 changes: 9 additions & 2 deletions packages/kit/src/runtime/server/page/load_data.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { with_request_store, merge_tracing } from '@sveltejs/kit/internal/server
import { record_span } from '../../telemetry/record_span.js';
import { clarify_devalue_error, get_node_type } from '../utils.js';
import { base64_encode, text_decoder } from '../../utils.js';
import { NULL_BODY_STATUS } from '../constants.js';

/**
* Calls the user's server `load` function.
Expand Down Expand Up @@ -345,7 +346,7 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
const proxy = new Proxy(response, {
get(response, key, _receiver) {
/**
* @param {string} body
* @param {string | undefined} body
* @param {boolean} is_b64
*/
async function push_fetched(body, is_b64) {
Expand Down Expand Up @@ -427,6 +428,11 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)
async function text() {
const body = await response.text();

if (body === '' && NULL_BODY_STATUS.includes(response.status)) {
await push_fetched(undefined, false);
return undefined;
}

if (!body || typeof body === 'string') {
await push_fetched(body, false);
}
Expand All @@ -444,7 +450,8 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts)

if (key === 'json') {
return async () => {
return JSON.parse(await text());
const body = await text();
return body ? JSON.parse(body) : undefined;
};
}

Expand Down
2 changes: 1 addition & 1 deletion packages/kit/src/runtime/server/page/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export interface Fetched {
method: string;
request_body?: string | ArrayBufferView | null;
request_headers?: HeadersInit | undefined;
response_body: string;
response_body: string | undefined;
response: Response;
is_b64?: boolean;
}
Expand Down
1 change: 1 addition & 0 deletions packages/kit/test/apps/basics/src/routes/load/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
<a href="/load/fetch-relative">fetch relative</a>
<a href="/load/fetch-credentialed">fetch credentialed</a>
<a href="/load/fetch-request-headers">fetch headers</a>
<a href="/load/fetch-no-body">fetch no body</a>
<a href="/load/large-response">large response</a>
<a href="/load/raw-body">raw body</a>
<a href="/load/server-fetch-request">server fetch request</a>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export async function load({ fetch }) {
const response = await fetch('/load/fetch-no-body/endpoint');

return {
ok: response.ok,
body: await response.text()
};
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<script>
let { data } = $props();
</script>

<h1>ok: {data.ok}</h1>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export function GET() {
return new Response(undefined, {
status: 204
});
}
5 changes: 5 additions & 0 deletions packages/kit/test/apps/basics/test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -599,6 +599,11 @@ test.describe('Load', () => {
expect(await page.textContent('.aborted-during-request')).toBe('Aborted during request: true');
expect(await page.textContent('.successful-data')).toContain('"message":"success"');
});

test('event.fetch handles response without body', async ({ page }) => {
await page.goto('/load/fetch-no-body');
expect(await page.textContent('h1')).toBe('ok: true');
});
});

test.describe('Nested layouts', () => {
Expand Down
Loading