From 640a1b218b0c6932088077416455463ffd34f036 Mon Sep 17 00:00:00 2001 From: Anton Bachin Date: Tue, 14 Dec 2021 10:40:56 +0300 Subject: [PATCH] Replace ~debug flag by separate error handler --- src/dream.ml | 2 ++ src/dream.mli | 23 ++++++----------------- src/http/error_handler.ml | 38 +++++++++++++++----------------------- src/http/error_handler.mli | 3 ++- src/http/http.ml | 10 ---------- src/middleware/catch.ml | 2 -- src/pure/dream_pure.mli | 3 --- src/pure/inmost.ml | 9 --------- 8 files changed, 25 insertions(+), 65 deletions(-) diff --git a/src/dream.ml b/src/dream.ml index 9395b927..914f8c9a 100644 --- a/src/dream.ml +++ b/src/dream.ml @@ -54,6 +54,8 @@ include Dream__middleware.Lowercase_headers include Dream__middleware.Catch include Dream__middleware.Site_prefix +let debug_error_handler = + Dream__http.Error_handler.debug_error_handler let error_template = Dream__http.Error_handler.customize diff --git a/src/dream.mli b/src/dream.mli index 63bc6c36..f35d6d2c 100644 --- a/src/dream.mli +++ b/src/dream.mli @@ -1818,7 +1818,6 @@ type error = { response : response option; client : string option; severity : log_level; - debug : bool; will_send_response : bool; } (** Detailed errors. Ignore this type if only using {!Dream.error_template}. @@ -1887,17 +1886,6 @@ type error = { [`Server] errors and [`Warning] for client errors. } - {li - [debug] is [true] if {!Dream.run} was called with [~debug]. - - If so, the default error handler gathers various fields from the current - request, formats the error condition, and passes the resulting string to the - template as [debug_dump]. - - The default template shows this string in its repsonse, instead of returning - a response with no body. - } - {li [will_send_response] is [true] in error contexts where Dream will still send a response. @@ -1921,7 +1909,7 @@ type error_handler = error -> response option promise {!Dream.type-error}. *) val error_template : - (error -> string option -> response -> response promise) -> error_handler + (error -> string -> response -> response promise) -> error_handler (** Builds an {!error_handler} from a template. See example {{:https://github.com/aantron/dream/tree/master/example/9-error#files} [9-error]} \[{{:http://dream.as/9-error} playground}\]. @@ -1951,8 +1939,7 @@ val error_template : the error was likely caused by the client, and [500 Internal Server Error] if the error was likely caused by the server. - If [~debug] was passed to {!Dream.run}, [~debug_dump] will be [Some info], - where [info] is a multi-line string containing an error description, stack + [~debug_dump] is a multi-line string containing an error description, stack trace, request state, and other information. When an error occurs in a context where a response is not possible, the @@ -1963,6 +1950,10 @@ val error_template : If the template itself raises an exception or rejects, an empty [500 Internal Server Error] will be sent in contexts that require a response. *) +val debug_error_handler : error_handler +(** An {!error_handler} for showing extra information about requests and + exceptions, for use during development. *) + (** {1 Servers} *) @@ -1971,7 +1962,6 @@ val run : ?interface:string -> ?port:int -> ?stop:unit promise -> - ?debug:bool -> ?error_handler:error_handler -> ?https:bool -> ?certificate_file:string -> @@ -2031,7 +2021,6 @@ val serve : ?interface:string -> ?port:int -> ?stop:unit promise -> - ?debug:bool -> ?error_handler:error_handler -> ?https:bool -> ?certificate_file:string -> diff --git a/src/http/error_handler.ml b/src/http/error_handler.ml index 04178541..acfbb8c5 100644 --- a/src/http/error_handler.ml +++ b/src/http/error_handler.ml @@ -157,11 +157,7 @@ let customize template (error : Dream.error) = Lwt.return_none else - let debug_dump = - match error.debug with - | false -> None - | true -> Some (dump error) - in + let debug_dump = dump error in let response = match error.condition with @@ -187,24 +183,25 @@ let customize template (error : Dream.error) = -let default_template _error debug_dump response = - match debug_dump with - | None -> Lwt.return response - | Some debug_dump -> - let status = Dream.status response in - let code = Dream.status_to_int status - and reason = Dream.status_to_string status in - response - |> Dream.with_header "Content-Type" Dream_pure.Formats.text_html - |> Dream.with_body - (Dream__middleware.Error_template.render ~debug_dump ~code ~reason) - |> Lwt.return - +let default_template _error _debug_dump response = + Lwt.return response +let debug_template _error debug_dump response = + let status = Dream.status response in + let code = Dream.status_to_int status + and reason = Dream.status_to_string status in + response + |> Dream.with_header "Content-Type" Dream_pure.Formats.text_html + |> Dream.with_body + (Dream__middleware.Error_template.render ~debug_dump ~code ~reason) + |> Lwt.return let default = customize default_template +let debug_error_handler = + customize debug_template + (* Error reporters (called in various places by the framework). *) @@ -371,7 +368,6 @@ let httpaf response = None; client = Some (Adapt.address_to_string client_address); severity; - debug = Dream.debug app; will_send_response = true; } in @@ -430,7 +426,6 @@ let h2 response = None; client = Some (Adapt.address_to_string client_address); severity; - debug = Dream.debug app; will_send_response = true; } in @@ -472,7 +467,6 @@ let tls response = None; client = Some (Adapt.address_to_string client_address); severity = `Warning; - debug = Dream.debug app; will_send_response = false; } in @@ -504,7 +498,6 @@ let websocket response = Some response; client = Some (Dream.client request); severity = `Warning; (* Not sure what these errors are, yet. *) - debug = Dream.debug (Dream.app request); will_send_response = false; } in @@ -527,7 +520,6 @@ let websocket_handshake response = Some response; client = Some (Dream.client request); severity = `Warning; - debug = Dream.debug (Dream.app request); will_send_response = true; } in diff --git a/src/http/error_handler.mli b/src/http/error_handler.mli index cea4917e..cd476551 100644 --- a/src/http/error_handler.mli +++ b/src/http/error_handler.mli @@ -13,8 +13,9 @@ module Dream = Dream_pure templates and/or do logging. *) val default : Dream.error_handler +val debug_error_handler : Dream.error_handler val customize : - (Dream.error -> string option -> Dream.response -> Dream.response Lwt.t) -> + (Dream.error -> string -> Dream.response -> Dream.response Lwt.t) -> Dream.error_handler diff --git a/src/http/http.ml b/src/http/http.ml index 57b06773..9b3641ca 100644 --- a/src/http/http.ml +++ b/src/http/http.ml @@ -749,7 +749,6 @@ let serve_with_maybe_https ~interface ~port ~stop - ?debug ~error_handler ~https ?certificate_file ?key_file @@ -760,11 +759,6 @@ let serve_with_maybe_https let app = Dream.new_app (Error_handler.app error_handler) in try%lwt - begin match debug with - | Some debug -> Dream.set_debug debug app - | None -> () - end; - (* This check will at least catch secrets like "foo" when used on a public interface. *) (* if not (is_localhost interface) then @@ -905,7 +899,6 @@ let serve ?(interface = default_interface) ?(port = default_port) ?(stop = never) - ?debug ?(error_handler = Error_handler.default) ?(https = false) ?certificate_file @@ -918,7 +911,6 @@ let serve ~interface ~port ~stop - ?debug ~error_handler ~https:(if https then `OpenSSL else `No) ?certificate_file @@ -934,7 +926,6 @@ let run ?(interface = default_interface) ?(port = default_port) ?(stop = never) - ?debug ?(error_handler = Error_handler.default) ?(https = false) ?certificate_file @@ -1012,7 +1003,6 @@ let run ~interface ~port ~stop - ?debug ~error_handler ~https:(if https then `OpenSSL else `No) ?certificate_file ?key_file diff --git a/src/middleware/catch.ml b/src/middleware/catch.ml index 01cc30ca..c661eaa7 100644 --- a/src/middleware/catch.ml +++ b/src/middleware/catch.ml @@ -40,7 +40,6 @@ let catch_errors next_handler request = response = Some response; client = Some (Dream.client request); severity = severity; - debug = Dream.debug (Dream.app request); will_send_response = true; } in @@ -64,7 +63,6 @@ let catch_errors next_handler request = response = None; client = Some (Dream.client request); severity = `Error; - debug = Dream.debug (Dream.app request); will_send_response = true; } in diff --git a/src/pure/dream_pure.mli b/src/pure/dream_pure.mli index d5866232..56555659 100644 --- a/src/pure/dream_pure.mli +++ b/src/pure/dream_pure.mli @@ -395,7 +395,6 @@ type error = { response : response option; client : string option; severity : log_level; - debug : bool; will_send_response : bool; } @@ -403,8 +402,6 @@ type error_handler = error -> response option promise val new_app : (error -> response Lwt.t) -> app val app : request -> app -val debug : app -> bool -val set_debug : bool -> app -> unit val app_error_handler : app -> (error -> response promise) val request_from_http : app:app -> diff --git a/src/pure/inmost.ml b/src/pure/inmost.ml index 837fba90..a7df9b26 100644 --- a/src/pure/inmost.ml +++ b/src/pure/inmost.ml @@ -71,7 +71,6 @@ and server = { } and app = { - mutable app_debug : bool; error_handler : error -> response Lwt.t; } @@ -111,22 +110,14 @@ and error = { | `Info | `Debug ]; - debug : bool; will_send_response : bool; } -let debug app = - app.app_debug - -let set_debug value app = - app.app_debug <- value - (* TODO Remove. *) let app_error_handler app = app.error_handler let new_app error_handler = { - app_debug = false; error_handler; }