cloudflare / cloudflare/workerd

content-length header dropped on HTTP/3 requests

Open
#6,830 0 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
8.7k
Forks
739
Avg merge
2d 20h
Merged PRs (30d)
174

Description

### What versions & operating system are you using?

```
System:
OS: macOS 26.5
CPU: (11) arm64 Apple M3 Pro
Memory: 115.63 MB / 18.00 GB
Shell: 5.9 - /bin/zsh
Binaries:
Node: 20.19.1 - /Users/alukach/.nvm/versions/node/v20.19.1/bin/node
npm: 10.8.2 - /Users/alukach/.nvm/versions/node/v20.19.1/bin/npm
pnpm: 8.15.5 - /Users/alukach/.nvm/versions/node/v20.19.1/bin/pnpm
npmPackages:
@cloudflare/workers-types: ^4.20250601.0 => 4.20260606.1
wrangler: ^4.20.0 => 4.86.0
```

### Please provide a link to a minimal reproduction

https://github.com/alukach/cf-workers-head-content-length-bug

### Describe the Bug

When a HEAD request is sent over HTTP/3, the response comes back missing a content-length header. The header is present for the same request/server over HTTP/2 or HTTP1.

The worker logic is very simple:

```ts
const BODY = "Hello from a Cloudflare Worker.\n";
const CONTENT_LENGTH = String(new TextEncoder().encode(BODY).byteLength);

export default {
async fetch(request: Request): Promise {
const headers = {
"content-type": "text/plain; charset=utf-8",
"content-length": CONTENT_LENGTH,
};

// HEAD carries no body but still advertises the size.
if (request.method === "HEAD") {
return new Response(null, { headers });
}

return new Response(BODY, { headers });
},
};
```

(copy/paste from https://community.cloudflare.com/t/content-length-header-missing-on-http-3-head-requests/932208)

### Please provide any relevant error logs

```
# content-length present on HTTP/2 requests
▶ docker run --rm --platform linux/amd64 ymuski/curl-http3 \
curl --http2 -sI https://cf-missing-content-length.alukach.workers.dev
HTTP/2 200
date: Sat, 06 Jun 2026 20:38:48 GMT
content-type: application/octet-stream
content-length: 4873129725
cf-ray: a07a390a8a245c9d-YVR
cf-cache-status: DYNAMIC
accept-ranges: bytes
etag: "96aef95a001f80149b0d5a8eb7e77932-581"
last-modified: Wed, 04 Dec 2024 22:00:18 GMT
server: cloudflare
x-amz-id-2: lXOphchlNx386l8+V1wOCipadOjDWQ1/0xQbqwf1yidbsJmknXVL7G1qpOA4eTwFayuGRdXxcL0=
x-amz-request-id: PDP4HFSRYF3RP219
x-amz-server-side-encryption: AES256
x-amz-version-id: Kh_uXM_g91CtDHmqwiWhvZfKhiCQQu6u
report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=1I3CWAL%2Fyi8U70%2Fyhn%2BvSpNvqhkuSSEbDKK8bzUR3lasA2%2FFBHaCL6mh77Jnj6vol0sUaYRlb1m0yS%2FtRei8Sog7fm73ZB6uQLsA0lSB%2FAKoiaWOYAhl4XoGLWXlPLUqRF1iQlAodOGtpFVXTd67HKMa9d6V1s1KnZAbPQ%3D%3D"}]}
nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
alt-svc: h3=":443"; ma=86400

# content-length missing on HTTP/3 requests
▶ docker run --rm --platform linux/amd64 ymuski/curl-http3 \
curl --http3 -sI https://cf-missing-content-length.alukach.workers.dev
HTTP/3 200
nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
report-to: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=ba0e3PqQNnKl5ajNVFNcPHUzqp8aAA2XItRCTS9KFiBrdTYPnuPrYpWjijsDTjPvKWufM4Gz8Koje%2Birkkzm9ypKxnsP9G5YfhAVcaPWimUoJj4jkKxbd1jgB8hq1Ue4%2FW0ul5WWKU9%2B5BQuWYhU9ku1Zhzprb22Vrtjog%3D%3D"}]}
date: Sat, 06 Jun 2026 20:38:56 GMT
content-type: application/octet-stream
priority: u=3,i=?0
cf-ray: a07a39382bf25c9d-YVR
cf-cache-status: DYNAMIC
accept-ranges: bytes
etag: "96aef95a001f80149b0d5a8eb7e77932-581"
last-modified: Wed, 04 Dec 2024 22:00:18 GMT
server: cloudflare
x-amz-id-2: rWw37E7d3fWg4sa8x7iYu6wzEO/WNnHf3CpYtXk9aKcPf+4tyP13wturActexQrczrIrxTQaMhw=
x-amz-request-id: 6ZM87ZC2SXT58AMJ
x-amz-server-side-encryption: AES256
x-amz-version-id: Kh_uXM_g91CtDHmqwiWhvZfKhiCQQu6u
alt-svc: h3=":443"; ma=86400
server-timing: cfExtPri
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.