diff options
author | 2023-09-14 23:03:20 -0700 | |
---|---|---|
committer | 2023-09-14 23:03:20 -0700 | |
commit | 94e9f8bdca5f88b5405c5a212051815659ab8b75 (patch) | |
tree | f2c79ad67a5bf3411b0a4fbacee0167b2ffcd08f /src/bun.js/bindings/ZigGlobalObject.cpp | |
parent | 2e6898470e9e329a8de171bd902ac53ba6477ae0 (diff) | |
download | bun-94e9f8bdca5f88b5405c5a212051815659ab8b75.tar.gz bun-94e9f8bdca5f88b5405c5a212051815659ab8b75.tar.zst bun-94e9f8bdca5f88b5405c5a212051815659ab8b75.zip |
fix http set cookie headers (#5428)
* allow multiple set-cookie values
* make it work for `getHeader`
* move `getHeader` to cpp
* remove set-cookie check
* move `setHeader` to cpp
---------
Co-authored-by: Jarred Sumner <jarred@jarredsumner.com>
Diffstat (limited to 'src/bun.js/bindings/ZigGlobalObject.cpp')
-rw-r--r-- | src/bun.js/bindings/ZigGlobalObject.cpp | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/bun.js/bindings/ZigGlobalObject.cpp b/src/bun.js/bindings/ZigGlobalObject.cpp index f5def93d1..f2a114f9c 100644 --- a/src/bun.js/bindings/ZigGlobalObject.cpp +++ b/src/bun.js/bindings/ZigGlobalObject.cpp @@ -1552,6 +1552,89 @@ JSC_DEFINE_HOST_FUNCTION(jsTTYSetMode, (JSC::JSGlobalObject * globalObject, Call return JSValue::encode(jsNumber(err)); } +JSC_DEFINE_HOST_FUNCTION(jsHTTPGetHeader, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + JSValue headersValue = callFrame->argument(0); + + if (auto* headers = jsDynamicCast<WebCore::JSFetchHeaders*>(headersValue)) { + JSValue nameValue = callFrame->argument(1); + if (nameValue.isString()) { + FetchHeaders* impl = &headers->wrapped(); + String name = nameValue.toWTFString(globalObject); + if (WTF::equalIgnoringASCIICase(name, "set-cookie"_s)) { + return fetchHeadersGetSetCookie(globalObject, vm, impl); + } + + WebCore::ExceptionOr<String> res = impl->get(name); + if (res.hasException()) { + WebCore::propagateException(globalObject, scope, res.releaseException()); + return JSValue::encode(jsUndefined()); + } + + String value = res.returnValue(); + if (value.isEmpty()) { + return JSValue::encode(jsUndefined()); + } + + return JSC::JSValue::encode(jsString(vm, value)); + } + } + + return JSValue::encode(jsUndefined()); +} + +JSC_DEFINE_HOST_FUNCTION(jsHTTPSetHeader, (JSGlobalObject * globalObject, CallFrame* callFrame)) +{ + auto& vm = globalObject->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); + + JSValue headersValue = callFrame->argument(0); + + if (auto* headers = jsDynamicCast<WebCore::JSFetchHeaders*>(headersValue)) { + JSValue nameValue = callFrame->argument(1); + if (nameValue.isString()) { + String name = nameValue.toWTFString(globalObject).convertToASCIILowercase(); + FetchHeaders* impl = &headers->wrapped(); + + JSValue valueValue = callFrame->argument(2); + if (valueValue.isUndefined()) + return JSValue::encode(jsUndefined()); + + if (isArray(globalObject, valueValue)) { + auto* array = jsCast<JSArray*>(valueValue); + unsigned length = array->length(); + if (length > 0) { + JSValue item = array->getIndex(globalObject, 0); + if (UNLIKELY(scope.exception())) + return JSValue::encode(jsUndefined()); + impl->set(name, item.getString(globalObject)); + RETURN_IF_EXCEPTION(scope, JSValue::encode(jsUndefined())); + } + for (unsigned i = 1; i < length; ++i) { + JSValue value = array->getIndex(globalObject, i); + if (UNLIKELY(scope.exception())) + return JSValue::encode(jsUndefined()); + if (!value.isString()) + continue; + impl->append(name, value.getString(globalObject)); + RETURN_IF_EXCEPTION(scope, JSValue::encode(jsUndefined())); + } + RELEASE_AND_RETURN(scope, JSValue::encode(jsUndefined())); + return JSValue::encode(jsUndefined()); + } + + impl->set(name, valueValue.getString(globalObject)); + RETURN_IF_EXCEPTION(scope, JSValue::encode(jsUndefined())); + return JSValue::encode(jsUndefined()); + } + } + + return JSValue::encode(jsUndefined()); +} + JSC_DEFINE_CUSTOM_GETTER(noop_getter, (JSGlobalObject*, EncodedJSValue, PropertyName)) { return JSC::JSValue::encode(JSC::jsUndefined()); @@ -1686,6 +1769,17 @@ static JSC_DEFINE_HOST_FUNCTION(functionLazyLoad, return JSC::JSValue::encode(JSSQLStatementConstructor::create(vm, globalObject, JSSQLStatementConstructor::createStructure(vm, globalObject, globalObject->m_functionPrototype.get()))); } + if (string == "http"_s) { + auto* obj = constructEmptyObject(globalObject); + obj->putDirect( + vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "setHeader"_s)), + JSC::JSFunction::create(vm, globalObject, 3, "setHeader"_s, jsHTTPSetHeader, ImplementationVisibility::Public), NoIntrinsic); + obj->putDirect( + vm, JSC::PropertyName(JSC::Identifier::fromString(vm, "getHeader"_s)), + JSC::JSFunction::create(vm, globalObject, 2, "getHeader"_s, jsHTTPGetHeader, ImplementationVisibility::Public), NoIntrinsic); + return JSC::JSValue::encode(obj); + } + if (string == "worker_threads"_s) { JSValue workerData = jsUndefined(); |