Skip to content

Commit

Permalink
Rename "locals" to "fields"
Browse files Browse the repository at this point in the history
  • Loading branch information
aantron committed Dec 17, 2021
1 parent dd41df9 commit 5a54d5c
Show file tree
Hide file tree
Showing 14 changed files with 112 additions and 92 deletions.
10 changes: 5 additions & 5 deletions src/cipher/cipher.ml
Expand Up @@ -118,8 +118,8 @@ struct
| Some plaintext -> Some (Cstruct.to_string plaintext)
end

let secrets_variable =
Dream.new_local
let secrets_field =
Dream.new_field
~name:"dream.secret"
~show_value:(fun _secrets -> "[redacted]")
()
Expand All @@ -131,19 +131,19 @@ let secrets_variable =
let set_secret ?(old_secrets = []) secret =
let value = secret::old_secrets in
fun next_handler request ->
Dream.set_local request secrets_variable value;
Dream.set_field request secrets_field value;
next_handler request

let fallback_secrets =
lazy [Random.random 32]

let encryption_secret request =
match Dream.local request secrets_variable with
match Dream.field request secrets_field with
| Some secrets -> List.hd secrets
| None -> List.hd (Lazy.force fallback_secrets)

let decryption_secrets request =
match Dream.local request secrets_variable with
match Dream.field request secrets_field with
| Some secrets -> secrets
| None -> Lazy.force fallback_secrets

Expand Down
6 changes: 5 additions & 1 deletion src/dream.ml
Expand Up @@ -182,8 +182,12 @@ let with_stream message =
set_stream message;
message

type 'a local = 'a field
let new_local = new_field
let local = field

let with_local key value message =
set_local message key value;
set_field message key value;
message

let first message =
Expand Down
28 changes: 24 additions & 4 deletions src/dream.mli
Expand Up @@ -2349,20 +2349,40 @@ val decrypt :
Dream supports user-defined per-message variables for use by middlewares. *)

type 'a local
type 'a field
(** Per-message variable. *)

val new_local : ?name:string -> ?show_value:('a -> string) -> unit -> 'a local
(**/**)
type 'a local = 'a field
[@@ocaml.deprecated " Renamed to type Dream.field."]
(**/**)

val new_field : ?name:string -> ?show_value:('a -> string) -> unit -> 'a field
(** Declares a variable of type ['a] in all messages. The variable is initially
unset in each message. The optional [~name] and [~show_value] are used by
{!Dream.run} [~debug] to show the variable in debug dumps. *)

val local : 'b message -> 'a local -> 'a option
(**/**)
val new_local : ?name:string -> ?show_value:('a -> string) -> unit -> 'a field
[@@ocaml.deprecated " Renamed to Dream.new_field."]
(**/**)

val field : 'b message -> 'a field -> 'a option
(** Retrieves the value of the per-message variable. *)

val set_local : 'b message -> 'a local -> 'a -> unit
(**/**)
val local : 'b message -> 'a field -> 'a option
[@@ocaml.deprecated " Renamed to Dream.field."]
(**/**)

val set_field : 'b message -> 'a field -> 'a -> unit
(** Sets the per-message variable to the value. *)

(**/**)
val set_field : 'b message -> 'a field -> 'a -> unit
[@@ocaml.deprecated " Renamed to Dream.set_field."]
(**/**)

(**/**)
val with_local : 'a local -> 'a -> 'b message -> 'b message
[@@ocaml.deprecated
Expand Down
2 changes: 1 addition & 1 deletion src/http/error_handler.ml
Expand Up @@ -97,7 +97,7 @@ let dump (error : Catch.error) =
Dream.all_headers request
|> List.iter (fun (name, value) -> p "\n%s: %s" name value);

Dream.fold_locals (fun name value first ->
Dream.fold_fields (fun name value first ->
if first then
p "\n";
p "\n%s: %s" name value;
Expand Down
2 changes: 1 addition & 1 deletion src/http/http.ml
Expand Up @@ -406,7 +406,7 @@ let wrap_handler
request_id field in requests. *)
let user's_websocket_handler websocket =
Lwt.with_value
Dream__middleware.Log.lwt_key
Dream__middleware.Log.id_lwt_key
(Dream__middleware.Log.get_request_id ~request ())
(fun () -> user's_websocket_handler websocket)
in
Expand Down
8 changes: 4 additions & 4 deletions src/middleware/flash.ml
Expand Up @@ -15,8 +15,8 @@ let log =
let five_minutes =
5. *. 60.

let storage =
Dream.new_local ~name:"dream.flash" ()
let storage_field =
Dream.new_field ~name:"dream.flash" ()

let flash_cookie =
"dream.flash"
Expand Down Expand Up @@ -53,7 +53,7 @@ let flash request =

let put_flash request category message =
let outbox =
match Dream.local request storage with
match Dream.field request storage_field with
| Some outbox -> outbox
| None ->
let message = "Missing flash message middleware" in
Expand All @@ -75,7 +75,7 @@ let flash_messages inner_handler request =
else
log ~request "%s" "No flash messages.");
let outbox = ref [] in
Dream.set_local request storage outbox;
Dream.set_field request storage_field outbox;
let existing = Cookie.cookie request flash_cookie in
let%lwt response = inner_handler request in
let entries = List.rev !outbox in
Expand Down
20 changes: 10 additions & 10 deletions src/middleware/log.ml
Expand Up @@ -70,13 +70,13 @@ let logs_lib_tag : string Logs.Tag.def =

(* Lwt sequence-associated storage key used to pass request ids for use when
~request is not provided. *)
let lwt_key : string Lwt.key =
let id_lwt_key : string Lwt.key =
Lwt.new_key ()

(* The actual request id "field" associated with each request by the logger. If
this field is missing, the logger assigns the request a fresh id. *)
let id =
Dream.new_local
let id_field =
Dream.new_field
~name:request_id_label
~show_value:(fun id -> id)
()
Expand All @@ -86,11 +86,11 @@ let get_request_id ?request () =
let request_id =
match request with
| None -> None
| Some request -> Dream.local request id
| Some request -> Dream.field request id_field
in
match request_id with
| Some _ -> request_id
| None -> Lwt.get lwt_key
| None -> Lwt.get id_lwt_key

(* The current state of the request id sequence. *)
let last_id =
Expand Down Expand Up @@ -470,13 +470,13 @@ struct

(* Get the requwst's id or assign a new one. *)
let id =
match Dream.local request id with
match Dream.field request id_field with
| Some id -> id
| None ->
last_id := !last_id + 1;
let new_id = string_of_int !last_id in
Dream.set_local request id new_id;
new_id
let id = string_of_int !last_id in
Dream.set_field request id_field id;
id
in

(* Identify the request in the log. *)
Expand All @@ -495,7 +495,7 @@ struct
(* Call the rest of the app. *)
Lwt.try_bind
(fun () ->
Lwt.with_value lwt_key (Some id) (fun () ->
Lwt.with_value id_lwt_key (Some id) (fun () ->
next_handler request))
(fun response ->
(* Log the elapsed time. If the response is a redirection, log the
Expand Down
26 changes: 13 additions & 13 deletions src/middleware/router.ml
Expand Up @@ -165,8 +165,8 @@ let scope prefix middlewares routes =



let path_variable : string list Dream.local =
Dream.new_local
let path_field : string list Dream.field =
Dream.new_field
~name:"dream.path"
~show_value:(fun path -> String.concat "/" path)
()
Expand All @@ -175,35 +175,35 @@ let path_variable : string list Dream.local =
string. *)
(* TODO Remove this from the API. *)
let path the_request =
match Dream.local the_request path_variable with
match Dream.field the_request path_field with
| Some path -> path
| None ->
Dream.(Formats.(the_request |> target |> split_target |> fst |> from_path))

(* TODO Move site_prefix into this file and remove with_path from the API. *)
let set_path request path =
Dream.set_local request path_variable path
Dream.set_field request path_field path

(* Prefix is stored backwards. *)
let prefix_variable : string list Dream.local =
Dream.new_local
let prefix_field : string list Dream.field =
Dream.new_field
~name:"dream.prefix"
~show_value:(fun prefix -> String.concat "/" (List.rev prefix))
()

let internal_prefix request =
match Dream.local request prefix_variable with
match Dream.field request prefix_field with
| Some prefix -> prefix
| None -> []

let prefix request =
Formats.make_path (List.rev (internal_prefix request))

let set_prefix request prefix =
Dream.set_local request prefix_variable prefix
Dream.set_field request prefix_field prefix

let params_variable : (string * string) list Dream.local =
Dream.new_local
let params_field : (string * string) list Dream.field =
Dream.new_field
~name:"dream.params"
~show_value:(fun params ->
params
Expand All @@ -222,7 +222,7 @@ let missing_param request name =
failwith message

let param request name =
match Dream.local request params_variable with
match Dream.field request params_field with
| None -> missing_param request name
| Some params ->
try List.assoc name params
Expand Down Expand Up @@ -261,7 +261,7 @@ let router routes =
match node with
| Handler (method_, handler)
when method_matches method_ (Dream.method_ request) ->
Dream.set_local request params_variable bindings;
Dream.set_field request params_field bindings;
if is_wildcard then begin
set_prefix request prefix;
set_path request path;
Expand All @@ -279,7 +279,7 @@ let router routes =
in

let params =
match Dream.local request params_variable with
match Dream.field request params_field with
| Some params -> params
| None -> []
in
Expand Down
16 changes: 8 additions & 8 deletions src/middleware/server.ml
Expand Up @@ -11,37 +11,37 @@ module Stream = Dream_pure.Stream



let client_variable =
Dream.new_local
let client_field =
Dream.new_field
~name:"dream.client"
~show_value:(fun client -> client)
()

(* TODO What should be reported when the client address is missing? This is a
sign of local testing. *)
let client request =
match Dream.local request client_variable with
match Dream.field request client_field with
| None -> "127.0.0.1:0"
| Some client -> client

let set_client request client =
Dream.set_local request client_variable client
Dream.set_field request client_field client



let https_variable =
Dream.new_local
let https_field =
Dream.new_field
~name:"dream.https"
~show_value:string_of_bool
()

let https request =
match Dream.local request https_variable with
match Dream.field request https_field with
| Some true -> true
| _ -> false

let set_https request https =
Dream.set_local request https_variable https
Dream.set_field request https_field https



Expand Down
14 changes: 7 additions & 7 deletions src/middleware/session.ml
Expand Up @@ -19,14 +19,14 @@ type 'a back_end = {
send : 'a -> Dream.request -> Dream.response -> Dream.response Lwt.t;
}

let middleware local back_end = fun inner_handler request ->
let middleware field back_end = fun inner_handler request ->
let%lwt session = back_end.load request in
Dream.set_local request local session;
Dream.set_field request field session;
let%lwt response = inner_handler request in
back_end.send session request response

let getter local request =
match Dream.local request local with
let getter field request =
match Dream.field request field with
| Some session ->
session
| None ->
Expand All @@ -40,10 +40,10 @@ type 'a typed_middleware = {
}

let typed_middleware ?show_value () =
let local = Dream.new_local ~name:"dream.session" ?show_value () in
let field = Dream.new_field ~name:"dream.session" ?show_value () in
{
middleware = middleware local;
getter = getter local;
middleware = middleware field;
getter = getter field;
}


Expand Down
4 changes: 2 additions & 2 deletions src/middleware/upload.ml
Expand Up @@ -30,8 +30,8 @@ let initial_multipart_state () = {
}

(* TODO Dump the value of the multipart state somehow? *)
let multipart_state_variable : multipart_state Dream.local =
Dream.new_local
let multipart_state_field : multipart_state Dream.field =
Dream.new_field
~name:"dream.multipart"
()

Expand Down

0 comments on commit 5a54d5c

Please sign in to comment.