diff --git a/include/types/proto_http.h b/include/types/proto_http.h
index 3457a2a381..76c8e6b506 100644
--- a/include/types/proto_http.h
+++ b/include/types/proto_http.h
@@ -264,6 +264,7 @@ enum {
ST_ADM_ACTION_ENABLE,
ST_ADM_ACTION_STOP,
ST_ADM_ACTION_START,
+ ST_ADM_ACTION_SHUTDOWN,
};
/* status codes available for the stats admin page */
diff --git a/src/dumpstats.c b/src/dumpstats.c
index a01c6ed0de..d79c880626 100644
--- a/src/dumpstats.c
+++ b/src/dumpstats.c
@@ -3173,6 +3173,7 @@ static int stats_dump_proxy(struct stream_interface *si, struct proxy *px, struc
""
""
""
+ ""
""
""
" "
diff --git a/src/proto_http.c b/src/proto_http.c
index c0a66879fc..8834532289 100644
--- a/src/proto_http.c
+++ b/src/proto_http.c
@@ -2611,6 +2611,9 @@ int http_process_req_stat_post(struct stream_interface *si, struct http_txn *txn
else if (strcmp(value, "start") == 0) {
action = ST_ADM_ACTION_START;
}
+ else if (strcmp(value, "shutdown") == 0) {
+ action = ST_ADM_ACTION_SHUTDOWN;
+ }
else {
si->applet.ctx.stats.st_code = STAT_STATUS_ERRP;
goto out;
@@ -2680,6 +2683,18 @@ int http_process_req_stat_post(struct stream_interface *si, struct http_txn *txn
altered_servers++;
total_servers++;
break;
+ case ST_ADM_ACTION_SHUTDOWN:
+ if (px->state != PR_STSTOPPED) {
+ struct session *sess, *sess_bck;
+
+ list_for_each_entry_safe(sess, sess_bck, &sv->actconns, by_srv)
+ if (sess->srv_conn == sv)
+ session_shutdown(sess, SN_ERR_KILLED);
+
+ altered_servers++;
+ total_servers++;
+ }
+ break;
}
} else {
/* the server name is unknown or ambiguous (duplicate names) */