aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-15 21:05:15 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-15 21:05:15 -0700
commit3482d761758368c74d4971f75606af5657aff53c (patch)
tree095e7ea605f620feb5485f1a19db07102d4b2cfd
parent63c9315b24910095b76c7a01c3129c3500a2a5ad (diff)
downloadbun-3482d761758368c74d4971f75606af5657aff53c.tar.gz
bun-3482d761758368c74d4971f75606af5657aff53c.tar.zst
bun-3482d761758368c74d4971f75606af5657aff53c.zip
Fix crash when BodyMixin functions throw
Fixes https://github.com/oven-sh/bun/issues/1331#issuecomment-1279844836
-rw-r--r--src/bun.js/webcore/response.zig19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/bun.js/webcore/response.zig b/src/bun.js/webcore/response.zig
index b1142fc98..0b6f09162 100644
--- a/src/bun.js/webcore/response.zig
+++ b/src/bun.js/webcore/response.zig
@@ -5334,7 +5334,7 @@ pub const Request = struct {
) callconv(.C) JSC.JSValue {
this.ensureURL() catch {
globalObject.throw("Failed to join URL", .{});
- return JSValue.jsUndefined();
+ return .zero;
};
return ZigString.init(this.url).withEncoding().toValueGC(globalObject);
@@ -5506,8 +5506,7 @@ fn BodyMixin(comptime Type: type) type {
) callconv(.C) JSC.JSValue {
var value: *Body.Value = this.getBodyValue();
if (value.* == .Used) {
- globalThis.throw("Body already used", .{});
- return JSValue.jsUndefined();
+ return handleBodyAlreadyUsed(globalThis);
}
if (value.* == .Locked) {
@@ -5524,8 +5523,8 @@ fn BodyMixin(comptime Type: type) type {
) callconv(.C) JSValue {
var body: *Body.Value = this.getBodyValue();
if (body.* == .Used) {
- globalThis.throw("Body already used", .{});
- return JSValue.jsUndefined();
+ // TODO: make this closed
+ return JSC.WebCore.ReadableStream.empty(globalThis);
}
return body.toReadableStream(globalThis);
@@ -5545,8 +5544,7 @@ fn BodyMixin(comptime Type: type) type {
) callconv(.C) JSC.JSValue {
var value: *Body.Value = this.getBodyValue();
if (value.* == .Used) {
- globalObject.throw("Body already used", .{});
- return JSValue.jsUndefined();
+ return handleBodyAlreadyUsed(globalObject);
}
if (value.* == .Locked) {
@@ -5557,6 +5555,13 @@ fn BodyMixin(comptime Type: type) type {
return JSC.JSPromise.wrap(globalObject, blob.toJSON(globalObject, .share));
}
+ fn handleBodyAlreadyUsed(globalObject: *JSC.JSGlobalObject) JSValue {
+ return JSC.JSPromise.rejectedPromiseValue(
+ globalObject,
+ ZigString.static("Body already used").toErrorInstance(globalObject),
+ );
+ }
+
pub fn getArrayBuffer(
this: *Type,
globalObject: *JSC.JSGlobalObject,