René's URL Explorer Experiment


Title: feat: Support streaming request bodies by thced · Pull Request #131 · extenda/openapi-httpserver-java · GitHub

Open Graph Title: feat: Support streaming request bodies by thced · Pull Request #131 · extenda/openapi-httpserver-java

X Title: feat: Support streaming request bodies by thced · Pull Request #131 · extenda/openapi-httpserver-java

Description: Summary Request bodies were always buffered in memory (readAllBytes). This adds opt-in streaming, so a handler can take large uploads without holding them in memory. StreamingRequestHandler — a handler implementing it gets the body unread via request.bodyStream(). The Content-Encoding (gzip built in) is decoded lazily under a size cap; StreamingRequestHandler.raw(...) skips decoding and hands over the bytes as sent. bytes() / parsed() / asPojo() throw on a streaming request. Still checked before the handler runs: routing, parameter validation, security, a required body being present (one-byte peek) and the Content-Type matching requestBody.content. The body schema is not validated (it can't be without buffering). Builder.maxConcurrentStreamingRequests(n[, retryAfter]) — optional server-wide cap; excess streaming requests get 503 problem+json with Retry-After. The slot is taken after security and the peek, so slow or unauthenticated clients never hold one. Buffered requests are not counted. After-response hooks see the 503. Builder.maxDecompressedStreamingRequestBytes(long) — a separate cap on the decoded size of a streamed body; any positive long, so past the 2 GiB that bounds buffered bodies (maxDecompressedRequestBytes, held in a byte[]). Defaults to maxDecompressedRequestBytes. Content-Type matching (both paths): media ranges type/* and */* in requestBody.content; a missing Content-Type is treated as application/json if declared, else application/octet-stream (RFC 9110 §8.3). Request.headers() — all request headers, case-insensitive. Streaming extra routes (extraRoute with a StreamingRequestHandler) are supported and share the concurrency cap. A streaming handler on an operation without a requestBody fails at boot. Additive only; existing handlers behave as before. One 400 detail string for a missing Content-Type now names application/octet-stream when JSON isn't declared. Design and plan: docs/superpowers/specs/2026-10-08-streaming-request-bodies-design.md, docs/superpowers/plans/2026-10-08-streaming-request-bodies.md. README has a new "Streaming request bodies" section. Known limits (documented) A buffered 404/405 is still answered after reading the full body (unchanged from master). Clients sending Expect: 100-continue are answered 100 by the JDK before filters run, so a shed client may still send its body. Test plan mvn verify — 758 unit + 128 IT green (incl. 36 in StreamingRequestBodyIT: 8 MiB past the cap, gzip, 413/400/415, separate streaming cap, validation, security, cap + Retry-After, slot release on failures, stalled clients holding no slot) pre-commit hooks pass SonarLint clean on changed files

Open Graph Description: Summary Request bodies were always buffered in memory (readAllBytes). This adds opt-in streaming, so a handler can take large uploads without holding them in memory. StreamingRequestHandler — a ha...

X Description: Summary Request bodies were always buffered in memory (readAllBytes). This adds opt-in streaming, so a handler can take large uploads without holding them in memory. StreamingRequestHandler — a ha...

Opengraph URL: https://github.com/extenda/openapi-httpserver-java/pull/131

X: @github

direct link

Domain: github.com

react-profiling0
react-import-mapreact,react-dom,react-dom/client,react-dom/profiling,react-is,react-reconciler,react/compiler-runtime,react/jsx-dev-runtime,react/jsx-runtime,scheduler@d5750093facf
route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:ad08ab18-384d-0110-8eeb-d795941faa16
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idB8B2:2F3FA9:3A3BE5:516EA5:6AECFD11
html-safe-nonce6d54127b3aeaa3b27b1ef3bc2a38f3285c3e93b19299345fbc56873ff4a65a47
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJCOEIyOjJGM0ZBOTozQTNCRTU6NTE2RUE1OjZBRUNGRDExIiwidmlzaXRvcl9pZCI6IjM3NjA1NzcxNTAzMTQxNTExODUiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac77e5dcccd05adc3d16084920be4eb10e21744eea26db1538288a3ac48339e860
hovercard-subject-tagpull_request:4786761828
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/extenda/openapi-httpserver-java/pull/131/files
twitter:imagehttps://avatars.githubusercontent.com/u/1101587?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/1101587?s=400&v=4
og:image:altSummary Request bodies were always buffered in memory (readAllBytes). This adds opt-in streaming, so a handler can take large uploads without holding them in memory. StreamingRequestHandler — a ha...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
None76be9fd7856c8274dcfc751356c6c2dc12374a9696cbae1046752a000b9a5ca9
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/extenda/openapi-httpserver-java git https://github.com/extenda/openapi-httpserver-java.git
octolytics-dimension-user_id5753979
octolytics-dimension-user_loginextenda
octolytics-dimension-repository_id882991450
octolytics-dimension-repository_nwoextenda/openapi-httpserver-java
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id882991450
octolytics-dimension-repository_network_root_nwoextenda/openapi-httpserver-java
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releasef3ae5cc8182dfd6f403dc93a15ed8017d5ee795b
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://github.com/extenda/openapi-httpserver-java/pull/131/files#start-of-content
https://github.com/
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fextenda%2Fopenapi-httpserver-java%2Fpull%2F131%2Ffiles
GitHubRepository hosting, code review, and collaborationhttps://github.com/platform
CopilotAI coding agent for tasks, projects, and automated workhttps://github.com/features/copilot
ActionsCI/CD and automationhttps://github.com/features/actions
Code QualityQuality analysis, fixes, and enforcementhttps://github.com/features/code-quality
CodespacesCloud development environmentshttps://github.com/features/codespaces
Code SecurityVulnerability detection and remediationhttps://github.com/security/advanced-security/code-security
Secret ProtectionSecret scanning and leak preventionhttps://github.com/security/advanced-security/secret-protection
All Featureshttps://github.com/features
Documentationhttps://docs.github.com/en
Traininghttps://learn.github.com/skills
Certificationshttps://learn.github.com/credentials
Build with Copilothttps://github.com/features/ai
Customize Copilothttps://docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-copilot-overview
Integrationshttps://github.com/marketplace
Trending reposhttps://github.com/trending
GitHub Sponsorshttps://github.com/open-source/sponsors
Developer articleshttps://github.com/resources/articles
ChangelogYour source for the latest features, improvements, and fixes across GitHub products, all in one place.https://github.blog/changelog/
Enterpriseshttps://github.com/enterprise
Teamhttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
See all industrieshttps://github.com/solutions/industry
Why GitHubhttps://github.com/why-github
Customer Storieshttps://github.com/customer-stories
Business insightshttps://github.com/solutions/executive-insights
Trust Centerhttps://github.com/trust-center
GitHub Advanced SecurityEnterprise-grade code securityhttps://github.com/security/advanced-security
Copilot for businessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/enterprise/premium-support
Documentationhttps://docs.github.com/en
Resource centerhttps://github.com/resources
Bloghttps://github.blog/
Events & webinarshttps://github.com/resources/events
Community Forumhttps://github.com/orgs/community/discussions
Customer Storieshttps://github.com/customer-stories
Integrationshttps://github.com/marketplace
Customer supporthttps://help.github.com/
Traininghttps://learn.github.com/skills
GitHub Statushttps://www.githubstatus.com/
Abouthttps://github.com/about
Partnershttps://github.com/partners
Changeloghttps://github.blog/changelog/
GitHub UniverseThe event for developers, by developers — talks, workshops, and what’s next for GitHub.https://githubuniverse.com/
Pricinghttps://github.com/pricing
Sign inhttps://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fextenda%2Fopenapi-httpserver-java%2Fpull%2F131%2Ffiles
Sign uphttps://github.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=extenda%2Fopenapi-httpserver-java
Reloadhttps://github.com/extenda/openapi-httpserver-java/pull/131/files
Reloadhttps://github.com/extenda/openapi-httpserver-java/pull/131/files
Reloadhttps://github.com/extenda/openapi-httpserver-java/pull/131/files
extendahttps://github.com/extenda
openapi-httpserver-javahttps://github.com/extenda/openapi-httpserver-java
Codehttps://github.com/extenda/openapi-httpserver-java
Issueshttps://github.com/extenda/openapi-httpserver-java/issues
Pull requests2 (2)https://github.com/extenda/openapi-httpserver-java/pulls
Actionshttps://github.com/extenda/openapi-httpserver-java/actions
Security and qualityhttps://github.com/extenda/openapi-httpserver-java/security
Insightshttps://github.com/extenda/openapi-httpserver-java/pulse
Sign up for GitHub https://github.com/signup?return_to=%2Fextenda%2Fopenapi-httpserver-java%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://github.com/login?return_to=%2Fextenda%2Fopenapi-httpserver-java%2Fissues%2Fnew%2Fchoose
thcedhttps://github.com/thced
masterhttps://github.com/extenda/openapi-httpserver-java/tree/master
feat/streaming-request-bodieshttps://github.com/extenda/openapi-httpserver-java/tree/feat/streaming-request-bodies
Conversation 1 https://github.com/extenda/openapi-httpserver-java/pull/131
Commits 4 https://github.com/extenda/openapi-httpserver-java/pull/131/commits
Checks 5 https://github.com/extenda/openapi-httpserver-java/pull/131/checks
Files changed https://github.com/extenda/openapi-httpserver-java/pull/131/files
Please reload this pagehttps://github.com/extenda/openapi-httpserver-java/pull/131/files
feat: Support streaming request bodies https://github.com/extenda/openapi-httpserver-java/pull/131/files#top
Show all changes 4 commits https://github.com/extenda/openapi-httpserver-java/pull/131/files
a3dfc7a feat: Support streaming request bodies thced Oct 8, 2026 https://github.com/extenda/openapi-httpserver-java/pull/131/commits/a3dfc7a9470328d3826c788a27d614afb7774e8a
e7fb1c2 feat: Separate decompression cap for streamed bodies thced Oct 8, 2026 https://github.com/extenda/openapi-httpserver-java/pull/131/commits/e7fb1c201f2e2011ae8e85d8788665ef9473b772
ed88f03 docs: Point streaming cap references at the new setting thced Oct 8, 2026 https://github.com/extenda/openapi-httpserver-java/pull/131/commits/ed88f03acf4c1f2e78bd8d0d0020f776c97b6ecf
c59f467 refactor: Use a stream in validateStreamingWiring thced Oct 8, 2026 https://github.com/extenda/openapi-httpserver-java/pull/131/commits/c59f467d8f7d625b7e5cac4f9b63a16d99a6e606
Clear filters https://github.com/extenda/openapi-httpserver-java/pull/131/files
Please reload this pagehttps://github.com/extenda/openapi-httpserver-java/pull/131/files
Please reload this pagehttps://github.com/extenda/openapi-httpserver-java/pull/131/files
CLAUDE.md https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-6ebdb617a8104a7756d0cf36578ab01103dc9f07e4dc6feb751296b9c402faf7
README.md https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
2026-10-08-streaming-request-bodies.md https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-69989c0c78eac02334920c497fe353e168e843c082a19c38f9e2ebf3b6fbcdf0
2026-10-08-streaming-request-bodies-design.md https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-6b6e4818b973a89422e5cf4f22dc1b0f46a66dbd2f711a0cfb74e17f887ad59c
ContentCoding.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-5ed9f40492182d87630fa884bae18780570bd314b462699899e81478433143e6
OpenApiServer.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-3a18cfb76c0dfa3899243b203697e106a4b62c9f26962d4b229f2acbbf6b2290
Request.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-a0bcca00c02f35a119c0efc4e835dae4bbbf8e458b9b06f55be4488bd209c50f
StreamingRequestHandler.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-84cf8ffd8bd95839fa86f58cdb5a47ffe30520ca9ad0f62ab4d961118f74bd3b
DecodingInputStream.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-553c32c5ad4a1282ab12ac012407474e99b5c3f939e267e0e22c8afc7cda594d
DispatchHandler.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-06b025b471680d48f608f215925f6ed93f284ab5a11328f910a5ded6daea8983
ExtrasRouter.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-18ca00af1a0eaae53e1c6ccd0322758ca98aa561d0dce1380bacec2c24fe472a
RequestBodyReader.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-9734bf9cc4a2a7fe05478124daf312c83413641ce90f656b8edd8f72aeb01c0a
RequestContentType.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-7395d1c03a7eb04983929659e28081240b553adb277fbfed329ae15ee190008e
RequestPreparationFilter.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-a0d508581384b2b2342eca6e456fd0f68652ea16c51e1bcb22db5db39b3368ea
SpecBinding.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-c7d27a965a3e651845cd71cdb196f78b6d7f679a95074784e9fe74a5b1fc83a6
StreamingLimit.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-903a3855b7922d81692b17a2d8a5200bd04b63626fb453832eb9d49689a125dd
OpenApiServerBuilderTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-04c398c8d38be46ca5e4b48b949de0633391b98d50e8ba5738d5fd322cd063c0
RequestTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-4b616b93c15f837c627f041b20d16c105052b31e489167aef8b063002ff39bbf
StreamingRequestBodyIT.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-5df72b6e9742c03830ef00938cbc0f6ee50c19579e539cd9e6b8dd3407341867
StreamingRequestHandlerTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b1c7aa51b5aa055773aa66d6621bdf6ab211c299297e0aeabaeaf27847a0cdd9
DecodingInputStreamTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-7dc095d6adb902876c408808c97b110171c4e0b5b4ac1a3ae5fa352382cd9bfe
RequestBodyReaderTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-0f7d2fd0d2a65179f262272cd842e232b388b9bc5b7d4eb5c9bd383293ef7d71
RequestContentTypeTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-9426c44b9ba4bf9ded79972e0db3a5582460133b4ff6d6f6b9c76ffc6bba4cb5
StreamingLimitTest.java https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-226c0ec872f6bb2c80a0cc062f53f02bea580ee4e90e1b836d70d327b60ea423
streaming-openapi.json https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-5dfcabc0a47a47bd75dcdfacd0df618abac8d29fdb88929edf83bc46ba22e091
CLAUDE.mdhttps://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-6ebdb617a8104a7756d0cf36578ab01103dc9f07e4dc6feb751296b9c402faf7
View file https://github.com/extenda/openapi-httpserver-java/blob/c59f467d8f7d625b7e5cac4f9b63a16d99a6e606/CLAUDE.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/extenda/openapi-httpserver-java/pull/131/{{ revealButtonHref }}
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-6ebdb617a8104a7756d0cf36578ab01103dc9f07e4dc6feb751296b9c402faf7
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-6ebdb617a8104a7756d0cf36578ab01103dc9f07e4dc6feb751296b9c402faf7
README.mdhttps://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
View file https://github.com/extenda/openapi-httpserver-java/blob/c59f467d8f7d625b7e5cac4f9b63a16d99a6e606/README.md
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://github.com/extenda/openapi-httpserver-java/pull/131/{{ revealButtonHref }}
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
https://github.com/extenda/openapi-httpserver-java/pull/131/files#diff-b335630551682c19a781afebcf4d07bf978fb1f8ac04c6bf87428ed5106870f5
Please reload this pagehttps://github.com/extenda/openapi-httpserver-java/pull/131/files
Please reload this pagehttps://github.com/extenda/openapi-httpserver-java/pull/131/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.