Mailing List Archive

[7.3] d9dd7826a req_fsm: Use status 408 for reset streams
commit d9dd7826ac75c4a334d576e8f5169293eee8bff8
Author: Dridi Boukelmoune <dridi.boukelmoune@gmail.com>
Date: Fri Dec 1 16:25:00 2023 +0100

req_fsm: Use status 408 for reset streams

The 503 synth and 500 minimal response status codes are too misleading
in this context, where the failure is attributed to the client. Among
existing 4XX status codes, this is the closest if we stretch the timeout
definition to "didn't complete rapidly enough before the client went
away".

diff --git a/bin/varnishd/cache/cache_req_fsm.c b/bin/varnishd/cache/cache_req_fsm.c
index 9373ec4ef..d587fa1f9 100644
--- a/bin/varnishd/cache/cache_req_fsm.c
+++ b/bin/varnishd/cache/cache_req_fsm.c
@@ -289,8 +289,13 @@ cnt_vclfail(struct worker *wrk, struct req *req)

Req_Rollback(ctx);

- req->err_code = 503;
- req->err_reason = "VCL failed";
+ if (req->req_reset) {
+ req->err_code = 408;
+ req->err_reason = "Client disconnected";
+ } else {
+ req->err_code = 503;
+ req->err_reason = "VCL failed";
+ }
req->req_step = R_STP_SYNTH;
req->doclose = SC_VCL_FAILURE;
req->filter_list = NULL;
@@ -306,6 +311,7 @@ cnt_synth(struct worker *wrk, struct req *req)
{
struct vsb *synth_body;
ssize_t sz, szl;
+ uint16_t status;
uint8_t *ptr;
const char *body;

@@ -340,7 +346,8 @@ cnt_synth(struct worker *wrk, struct req *req)
}
VSB_destroy(&synth_body);
(void)VRB_Ignore(req);
- (void)req->transport->minimal_response(req, 500);
+ status = req->req_reset ? 408 : 500;
+ (void)req->transport->minimal_response(req, status);
req->doclose = SC_VCL_FAILURE; // XXX: Not necessary any more ?
VSLb_ts_req(req, "Resp", W_TIM_real(wrk));
http_Teardown(req->resp);
diff --git a/bin/varnishtest/tests/t02025.vtc b/bin/varnishtest/tests/t02025.vtc
index 578dbf5c8..4b83fe95b 100644
--- a/bin/varnishtest/tests/t02025.vtc
+++ b/bin/varnishtest/tests/t02025.vtc
@@ -46,7 +46,7 @@ varnish v1 -expect req_reset == 1
# is interpreted as before a second elapsed. Session VXIDs showing up
# numerous times become increasingly more suspicious. The format can of
# course be extended to add anything else useful for data mining.
-shell -expect "1000 ${localhost}" {
+shell -expect "1000 ${localhost} 408" {
varnishncsa -n ${v1_name} -d \
- -q 'Timestamp:Reset[2] < 1.0' -F '%{VSL:Begin[2]}x %h'
+ -q 'Timestamp:Reset[2] < 1.0' -F '%{VSL:Begin[2]}x %h %s'
}
diff --git a/doc/sphinx/reference/vsl.rst b/doc/sphinx/reference/vsl.rst
index 98c126d2d..e3c6d0db8 100644
--- a/doc/sphinx/reference/vsl.rst
+++ b/doc/sphinx/reference/vsl.rst
@@ -79,7 +79,8 @@ Restart
Reset
The client closed its connection, reset its stream or caused
a stream error that forced Varnish to reset the stream. Request
- processing is interrupted and considered failed.
+ processing is interrupted and considered failed, with a 408
+ "Request Timeout" status code.

Pipe handling timestamps
~~~~~~~~~~~~~~~~~~~~~~~~
_______________________________________________
varnish-commit mailing list
varnish-commit@varnish-cache.org
https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit