detached 2565526

docs(middleware): note the full-duplex body drain limit of the inactivity timeout

commit
25655269805e90b7d8ab2d10f666776fe2db2d4d
author
brice · · 2026-10-16 19:29 UTC
parent
2a5c221
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
refs
feat/configurable-http-timeouts
1 file · +5 -2
M internal/adapters/in/http/middleware/transfer_idle.go +5 -2
@@ -52,8 +52,11 @@ const idleWriteChunk = 8 * 1024
5252 // into the next request. The timer never touches the controller after return.
5353 //
5454 // Limits: a handler that ignores the canceled context and never touches the
55-// connection again keeps its HTTP/1 connection until it returns. A non-positive
56-// idle disables the middleware.
55+// connection again keeps its HTTP/1 connection until it returns. A handler that
56+// enables HTTP/1 full-duplex mode (ResponseController.EnableFullDuplex) is not
57+// covered for the unread-body drain: net/http clears the read deadline before
58+// that drain, so such a handler must consume or bound its request body itself.
59+// A non-positive idle disables the middleware.
5760 func TransferIdleTimeout(idle time.Duration) func(http.Handler) http.Handler {
5861 return func(next http.Handler) http.Handler {
5962 if idle <= 0 {
@@ -52,8 +52,11 @@ const idleWriteChunk = 8 * 1024
52 // into the next request. The timer never touches the controller after return.52 // into the next request. The timer never touches the controller after return.
53 //53 //
54 // Limits: a handler that ignores the canceled context and never touches the54 // Limits: a handler that ignores the canceled context and never touches the
55-// connection again keeps its HTTP/1 connection until it returns. A non-positive55+// connection again keeps its HTTP/1 connection until it returns. A handler that
56-// idle disables the middleware.56+// enables HTTP/1 full-duplex mode (ResponseController.EnableFullDuplex) is not
57+// covered for the unread-body drain: net/http clears the read deadline before
58+// that drain, so such a handler must consume or bound its request body itself.
59+// A non-positive idle disables the middleware.
57 func TransferIdleTimeout(idle time.Duration) func(http.Handler) http.Handler {60 func TransferIdleTimeout(idle time.Duration) func(http.Handler) http.Handler {
58 return func(next http.Handler) http.Handler {61 return func(next http.Handler) http.Handler {
59 if idle <= 0 {62 if idle <= 0 {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close