summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Arsh <69170106+lilnasy@users.noreply.github.com> 2024-02-01 07:02:40 +0000
committerGravatar GitHub <noreply@github.com> 2024-02-01 07:02:40 +0000
commit2f6d1faa6f2d6de2d4ccd2a48adf5adadc82e593 (patch)
tree1301971a34f7e5fca25a85784ae08b146e104614
parent440bdff8cca7df7bb4e123539c77f3631293c6e8 (diff)
downloadastro-2f6d1faa6f2d6de2d4ccd2a48adf5adadc82e593.tar.gz
astro-2f6d1faa6f2d6de2d4ccd2a48adf5adadc82e593.tar.zst
astro-2f6d1faa6f2d6de2d4ccd2a48adf5adadc82e593.zip
fix(NodeApp): end with "Internal server error" on mid-stream error (#9908)
* fix(NodeApp): end with "Internal server error" on mid-stream error * add changeset * add test * Apply suggestions from code review --------- Co-authored-by: Nate Moore <natemoo-re@users.noreply.github.com>
-rw-r--r--.changeset/clever-roses-sleep.md5
-rw-r--r--packages/astro/src/core/app/node.ts4
-rw-r--r--packages/integrations/node/test/errors.test.js19
-rw-r--r--packages/integrations/node/test/fixtures/errors/src/pages/generator.astro11
4 files changed, 35 insertions, 4 deletions
diff --git a/.changeset/clever-roses-sleep.md b/.changeset/clever-roses-sleep.md
new file mode 100644
index 000000000..fd159eb3b
--- /dev/null
+++ b/.changeset/clever-roses-sleep.md
@@ -0,0 +1,5 @@
+---
+"astro": patch
+---
+
+Improves http behavior relating to errors encountered while streaming a response.
diff --git a/packages/astro/src/core/app/node.ts b/packages/astro/src/core/app/node.ts
index ddfa70997..db61157e3 100644
--- a/packages/astro/src/core/app/node.ts
+++ b/packages/astro/src/core/app/node.ts
@@ -118,12 +118,12 @@ export class NodeApp extends App {
destination.write(result.value);
result = await reader.read();
}
+ destination.end();
// the error will be logged by the "on end" callback above
} catch {
- destination.write('Internal server error');
+ destination.end('Internal server error');
}
}
- destination.end();
}
}
diff --git a/packages/integrations/node/test/errors.test.js b/packages/integrations/node/test/errors.test.js
index 983187475..23deba02c 100644
--- a/packages/integrations/node/test/errors.test.js
+++ b/packages/integrations/node/test/errors.test.js
@@ -1,4 +1,4 @@
-import * as assert from 'node:assert/strict';
+import assert from 'node:assert/strict';
import { describe, it, before, after } from 'node:test';
import nodejs from '../dist/index.js';
import { loadFixture } from './test-utils.js';
@@ -22,11 +22,26 @@ describe('Errors', () => {
after(async () => {
await devPreview.stop();
});
- it('when mode is standalone', async () => {
+
+ it('rejected promise in template', async () => {
const res = await fixture.fetch('/in-stream');
const html = await res.text();
const $ = cheerio.load(html);
assert.equal($('p').text().trim(), 'Internal server error');
});
+
+ it('generator that throws called in template', async () => {
+ /** @type {Response} */
+ const res = await fixture.fetch('/generator');
+ const reader = res.body.getReader();
+ const decoder = new TextDecoder();
+ const expect = async ({ done, value }) => {
+ const result = await reader.read();
+ assert.equal(result.done, done);
+ if (!done) assert.equal(decoder.decode(result.value), value);
+ }
+ await expect({ done: false, value: "<!DOCTYPE html><h1>Astro</h1> 1Internal server error" });
+ await expect({ done: true });
+ });
});
diff --git a/packages/integrations/node/test/fixtures/errors/src/pages/generator.astro b/packages/integrations/node/test/fixtures/errors/src/pages/generator.astro
new file mode 100644
index 000000000..65b8ae62c
--- /dev/null
+++ b/packages/integrations/node/test/fixtures/errors/src/pages/generator.astro
@@ -0,0 +1,11 @@
+---
+function * generator () {
+ yield 1
+ throw Error('ohnoes')
+}
+---
+<h1>Astro</h1>
+{generator()}
+<footer>
+ Footer
+</footer> \ No newline at end of file