Skip to content

Commit e770ff6

Browse files
committed
Update Headers implementation
1 parent 0e952e8 commit e770ff6

27 files changed

+663
-535
lines changed

src/workerd/api/cache.c++

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,9 @@ jsg::Promise<void> Cache::put(jsg::Lock& js,
255255
"Cannot cache response to a range request (206 Partial Content).");
256256

257257
auto responseHeadersRef = jsResponse->getHeaders(js);
258-
auto cacheControl = responseHeadersRef->getNoChecks(js, "cache-control"_kj);
258+
auto cacheControl = responseHeadersRef->getCommon(js, capnp::CommonHeaderName::CACHE_CONTROL);
259259

260-
KJ_IF_SOME(vary, responseHeadersRef->getNoChecks(js, "vary"_kj)) {
260+
KJ_IF_SOME(vary, responseHeadersRef->getCommon(js, capnp::CommonHeaderName::VARY)) {
261261
JSG_REQUIRE(vary.findFirst('*') == kj::none, TypeError,
262262
"Cannot cache response with 'Vary: *' header.");
263263
}
@@ -532,7 +532,7 @@ kj::Own<kj::HttpClient> Cache::getHttpClient(IoContext& context,
532532
kj::Maybe<kj::String> cfBlobJson,
533533
kj::LiteralStringConst operationName,
534534
kj::StringPtr url,
535-
kj::Maybe<jsg::ByteString> cacheControl,
535+
kj::Maybe<kj::String> cacheControl,
536536
bool enableCompatFlags) {
537537
auto span = context.makeTraceSpan(operationName);
538538
auto userSpan = context.makeUserTraceSpan(operationName);

src/workerd/api/cache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ class Cache: public jsg::Object {
9393
kj::Maybe<kj::String> cfBlobJson,
9494
kj::LiteralStringConst operationName,
9595
kj::StringPtr url,
96-
kj::Maybe<jsg::ByteString> cacheControl,
96+
kj::Maybe<kj::String> cacheControl,
9797
bool enableCompatFlags);
9898
};
9999

src/workerd/api/eventsource.c++

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -362,10 +362,8 @@ void EventSource::start(jsg::Lock& js) {
362362
js, self, kj::str("The response status code was ", response->getStatus(), "."));
363363
}
364364

365-
// TODO(cleanup): Using jsg::ByteString here is really annoying. It would be nice to have
366-
// an internal alternative that doesn't require an allocation.
367365
KJ_IF_SOME(contentType,
368-
response->getHeaders(js)->get(js, jsg::ByteString(kj::str("content-type")))) {
366+
response->getHeaders(js)->getCommon(js, capnp::CommonHeaderName::CONTENT_TYPE)) {
369367
bool invalid = false;
370368
KJ_IF_SOME(parsed, MimeType::tryParse(contentType)) {
371369
invalid = parsed != MimeType::EVENT_STREAM;
@@ -421,12 +419,10 @@ void EventSource::start(jsg::Lock& js) {
421419
});
422420

423421
auto headers = js.alloc<Headers>();
424-
headers->set(
425-
js, jsg::ByteString(kj::str("accept")), jsg::ByteString(MimeType::EVENT_STREAM.essence()));
426-
headers->set(js, jsg::ByteString(kj::str("cache-control")), jsg::ByteString(kj::str("no-cache")));
422+
headers->setCommon(capnp::CommonHeaderName::ACCEPT, MimeType::EVENT_STREAM.essence());
423+
headers->setCommon(capnp::CommonHeaderName::CACHE_CONTROL, kj::str("no-cache"));
427424
if (lastEventId != ""_kjc) {
428-
headers->set(
429-
js, jsg::ByteString(kj::str("last-event-id")), jsg::ByteString(kj::str(lastEventId)));
425+
headers->setUnguarded(js, kj::str("last-event-id"), kj::str(lastEventId));
430426
}
431427

432428
fetchImpl(js, kj::mv(fetcher), kj::str(i.url),

src/workerd/api/global-scope.c++

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,6 @@ kj::Promise<DeferredProxy<void>> ServiceWorkerGlobalScope::request(kj::HttpMetho
143143

144144
CfProperty cf(cfBlobJson);
145145

146-
auto jsHeaders = js.alloc<Headers>(js, headers, Headers::Guard::REQUEST);
147-
148146
// We only create the body stream if there is a body to read.
149147
kj::Maybe<jsg::Ref<ReadableStream>> maybeJsStream = kj::none;
150148

@@ -180,19 +178,17 @@ kj::Promise<DeferredProxy<void>> ServiceWorkerGlobalScope::request(kj::HttpMetho
180178
maybeJsStream = kj::mv(jsStream);
181179
}
182180

181+
auto jsHeaders = js.alloc<Headers>(js, headers, Headers::Guard::REQUEST);
182+
183183
// If the request doesn't specify "Content-Length" or "Transfer-Encoding", set "Content-Length"
184184
// to the body length if it's known. This ensures handlers for worker-to-worker requests can
185185
// access known body lengths if they're set, without buffering bodies.
186-
if (body != kj::none && headers.get(kj::HttpHeaderId::CONTENT_LENGTH) == kj::none &&
187-
headers.get(kj::HttpHeaderId::TRANSFER_ENCODING) == kj::none) {
188-
// We can't use headers.set() here as headers is marked const. Instead, we call set() on the
189-
// JavaScript headers object, ignoring the REQUEST guard that usually makes them immutable.
186+
if (body != kj::none && !jsHeaders->hasCommon(capnp::CommonHeaderName::CONTENT_LENGTH) &&
187+
!jsHeaders->hasCommon(capnp::CommonHeaderName::TRANSFER_ENCODING)) {
190188
KJ_IF_SOME(l, requestBody.tryGetLength()) {
191-
jsHeaders->setUnguarded(
192-
js, jsg::ByteString(kj::str("Content-Length")), jsg::ByteString(kj::str(l)));
189+
jsHeaders->setCommon(capnp::CommonHeaderName::CONTENT_LENGTH, kj::str(l));
193190
} else {
194-
jsHeaders->setUnguarded(
195-
js, jsg::ByteString(kj::str("Transfer-Encoding")), jsg::ByteString(kj::str("chunked")));
191+
jsHeaders->setCommon(capnp::CommonHeaderName::TRANSFER_ENCODING, kj::str("chunked"));
196192
}
197193
}
198194

0 commit comments

Comments
 (0)