fix(fetch): reject Request body for GET and HEAD methods#5201
fix(fetch): reject Request body for GET and HEAD methods#5201HiteshShonak wants to merge 8 commits intoboa-dev:mainfrom
Conversation
There was a problem hiding this comment.
Pull request overview
This PR aligns Boa’s Request constructor with the Fetch Standard by rejecting request bodies for GET and HEAD methods, addressing issue #5200.
Changes:
- Add a
GET/HEAD+ body validation inRequestInit::into_request_builder, returning aTypeErrorwhen violated. - Add regression tests asserting
new Request(..., { method: "GET"/"HEAD", body: "x" })throws aTypeError.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| core/runtime/src/fetch/request.rs | Adds GET/HEAD body rejection logic during request construction. |
| core/runtime/src/fetch/tests/request.rs | Adds regression tests for GET/HEAD requests with an explicit body. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Test262 conformance changes
Tested main commit: |
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #5201 +/- ##
===========================================
+ Coverage 47.24% 59.71% +12.46%
===========================================
Files 476 589 +113
Lines 46892 63679 +16787
===========================================
+ Hits 22154 38023 +15869
- Misses 24738 25656 +918 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
core/runtime/src/fetch/request.rs
Outdated
| is_get_or_head_method = matches!(parts.method, http::Method::GET | http::Method::HEAD); | ||
| has_inherited_body = parts.extensions.get::<HasBody>().is_some() || !body.is_empty(); |
There was a problem hiding this comment.
Can you link the specific part of the spec that handles inherited bodies? I was looking through it and I didn't see it doing this. The only thing it checked was the parent request and the RequestInit object.
There was a problem hiding this comment.
In general I would like to see this being commented with the specific spec lines it's implementing, since it makes maintainance much easier.
There was a problem hiding this comment.
hey, added spec comments to both places. the HasBody extension is there because boa stores body as Vec, so an empty string body and no body both look the same. needed a way to track if body was explicitly set, which is what inputBody is non-null checks in the spec: https://fetch.spec.whatwg.org/#dom-request
There was a problem hiding this comment.
That sounds kinda suboptimal. What about just changing body to an Option<Vec<u8>>? That avoids having to use an extension to something that should be "native" in a way.
There was a problem hiding this comment.
switched to Option<Vec<u8>> and removed the HasBody extension. let me know if this looks good
…move HasBody extension
This Pull Request fixes/closes #5200.
It changes the following:
into_request_buildernow checks if the method isGETorHEADand throws aTypeErrorif a body is provided, matching the Fetch Standard.GETandHEADcases.Testing:
cargo test -p boa_runtime request -- --nocaptureSpec reference: https://fetch.spec.whatwg.org/#dom-request