From 97a3108576c6a9d64c03e1455654dba88367992a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Sat, 12 Jul 2014 12:09:43 +0200 Subject: Reply with 400 on header parsing crash This is a first step to improve the HTTP status codes returned by Cowboy on crashes. We will tweak it over time. Also fixes a small bug where two replies may have been sent when using loop handlers under rare conditions. --- src/cowboy_req.erl | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src/cowboy_req.erl') diff --git a/src/cowboy_req.erl b/src/cowboy_req.erl index 02089c2..86f06ec 100644 --- a/src/cowboy_req.erl +++ b/src/cowboy_req.erl @@ -1036,15 +1036,22 @@ continue(#http_req{socket=Socket, transport=Transport, << HTTPVer/binary, " ", (status(100))/binary, "\r\n\r\n" >>). %% Meant to be used internally for sending errors after crashes. --spec maybe_reply(cowboy:http_status(), req()) -> ok. -maybe_reply(Status, Req) -> +-spec maybe_reply([{module(), atom(), arity() | [term()], _}], req()) -> ok. +maybe_reply(Stacktrace, Req) -> receive {cowboy_req, resp_sent} -> ok after 0 -> - _ = cowboy_req:reply(Status, Req), + _ = do_maybe_reply(Stacktrace, Req), ok end. +do_maybe_reply([ + {cow_http_hd, _, _, _}, + {cowboy_req, parse_header, _, _}|_], Req) -> + cowboy_req:reply(400, Req); +do_maybe_reply(_, Req) -> + cowboy_req:reply(500, Req). + -spec ensure_response(req(), cowboy:http_status()) -> ok. %% The response has already been fully sent to the client. ensure_response(#http_req{resp_state=done}, _) -> -- cgit v1.2.3