Commit adf76aa
committed
BUG/MINOR: mux-quic: do not close STREAM with empty FIN if no data sent
A stream may be shut without any HTX EOM reported. This is the case for
QCS instances flagged with QC_SF_UNKNOWN_PL_LENGTH. In this case, shut
is conducted with an empty FIN emission instead of a RESET_STREAM. This
has been implemented since the following patch :
24962dd
BUG/MEDIUM: mux-quic: do not emit RESET_STREAM for unknown length
However, in case of HTTP/3, an empty FIN should only be done after a
full message is emitted, which requires a HEADERS frame. If an empty FIN
is emitted without it, client may interpret this as invalid and close
the connection. To prevent this, fallback to a RESET_STREAM emission if
not data were emitted on the stream.
This was reproduced using ngtcp2-client with 10% loss (-r 0.1) on a
remote host, with httpterm request "/?s=100k&C=1&b=0&P=400". An error
ERR_H3_FRAME_UNEXPECTED is returned by ngtcp2-client when the bug occurs.
Note that this change is incomplete. The message validity depends solely
on the application protocol in use. As such, a new app_ops callback
should be implemented to ensure the stream is closed accordingly.
However, this first patch ensures that at least HTTP/3 case is valid
while keeping a minimal backport process.
This should be backported up to 2.8.1 parent 1cae481 commit adf76aa
1 file changed
+7
-3
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3359 | 3359 | | |
3360 | 3360 | | |
3361 | 3361 | | |
3362 | | - | |
3363 | | - | |
| 3362 | + | |
| 3363 | + | |
| 3364 | + | |
| 3365 | + | |
| 3366 | + | |
| 3367 | + | |
3364 | 3368 | | |
3365 | 3369 | | |
3366 | 3370 | | |
| |||
3485 | 3489 | | |
3486 | 3490 | | |
3487 | 3491 | | |
3488 | | - | |
| 3492 | + | |
3489 | 3493 | | |
3490 | 3494 | | |
3491 | 3495 | | |
| |||
0 commit comments