aboutsummaryrefslogtreecommitdiff
path: root/src/bun.js/bindings/ZigGlobalObject.cpp
diff options
context:
space:
mode:
authorGravatar Dylan Conway <35280289+dylan-conway@users.noreply.github.com> 2023-09-14 23:03:20 -0700
committerGravatar GitHub <noreply@github.com> 2023-09-14 23:03:20 -0700
commit94e9f8bdca5f88b5405c5a212051815659ab8b75 (patch)
treef2c79ad67a5bf3411b0a4fbacee0167b2ffcd08f /src/bun.js/bindings/ZigGlobalObject.cpp
parent2e6898470e9e329a8de171bd902ac53ba6477ae0 (diff)
downloadbun-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.cpp94
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();