Skip to content

Commit 075ad08

Browse files
committed
feat: add ?head_middlewares to create
1 parent 75d9055 commit 075ad08

File tree

4 files changed

+20
-3
lines changed

4 files changed

+20
-3
lines changed

src/Tiny_httpd.ml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ end
3030
let create ?enable_logging ?(masksigpipe = not Sys.win32) ?max_connections
3131
?(timeout = 0.0) ?buf_size ?(get_time_s = Unix.gettimeofday)
3232
?(new_thread = fun f -> ignore (Thread.create f () : Thread.t))
33-
?(addr = "127.0.0.1") ?(port = 8080) ?sock ?middlewares () : t =
33+
?(addr = "127.0.0.1") ?(port = 8080) ?sock ?head_middlewares ?middlewares ()
34+
: t =
3435
let max_connections = get_max_connection_ ?max_connections () in
3536
let server =
3637
{
@@ -65,4 +66,5 @@ let create ?enable_logging ?(masksigpipe = not Sys.win32) ?max_connections
6566
let tcp_server () = tcp_server_builder
6667
end in
6768
let backend = (module B : IO_BACKEND) in
68-
Server.create_from ?enable_logging ?buf_size ?middlewares ~backend ()
69+
Server.create_from ?enable_logging ?buf_size ?head_middlewares ?middlewares
70+
~backend ()

src/Tiny_httpd.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ val create :
135135
?addr:string ->
136136
?port:int ->
137137
?sock:Unix.file_descr ->
138+
?head_middlewares:Head_middleware.t list ->
138139
?middlewares:([ `Encoding | `Stage of int ] * Middleware.t) list ->
139140
unit ->
140141
t

src/core/server.ml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ type t = {
8888
mutable tcp_server: IO.TCP_server.t option;
8989
mutable handler: IO.Input.t Request.t -> Response.t;
9090
(** toplevel handler, if any *)
91+
mutable head_middlewares: Head_middleware.t list;
9192
mutable middlewares: (int * Middleware.t) list; (** Global middlewares *)
9293
mutable middlewares_sorted: (int * Middleware.t) list lazy_t;
9394
(** sorted version of {!middlewares} *)
@@ -128,6 +129,9 @@ let add_middleware ~stage self m =
128129
self.middlewares <- (stage, m) :: self.middlewares;
129130
self.middlewares_sorted <- lazy (sort_middlewares_ self.middlewares)
130131

132+
let add_head_middleware (self : t) m : unit =
133+
self.head_middlewares <- m :: self.head_middlewares
134+
131135
let add_decode_request_cb self f =
132136
(* turn it into a middleware *)
133137
let m h req ~resp =
@@ -258,6 +262,7 @@ let add_route_server_sent_handler ?accept ?(middlewares = []) self route f =
258262
let add_upgrade_handler ?(accept = fun _ -> Ok ()) ?(middlewares = [])
259263
(self : t) route f : unit =
260264
let ph req : handler_result option =
265+
let middlewares = List.rev_append self.head_middlewares middlewares in
261266
if req.Request.meth <> `GET then
262267
None
263268
else (
@@ -274,7 +279,7 @@ let add_upgrade_handler ?(accept = fun _ -> Ok ()) ?(middlewares = [])
274279
let clear_bytes_ bs = Bytes.fill bs 0 (Bytes.length bs) '\x00'
275280
276281
let create_from ?(enable_logging = not Log.dummy) ?(buf_size = 16 * 1_024)
277-
?(middlewares = []) ~backend () : t =
282+
?(head_middlewares = []) ?(middlewares = []) ~backend () : t =
278283
let handler _req = Response.fail ~code:404 "no top handler" in
279284
let self =
280285
{
@@ -283,6 +288,7 @@ let create_from ?(enable_logging = not Log.dummy) ?(buf_size = 16 * 1_024)
283288
tcp_server = None;
284289
handler;
285290
path_handlers = [];
291+
head_middlewares;
286292
middlewares = [];
287293
middlewares_sorted = lazy [];
288294
bytes_pool =

src/core/server.mli

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ end
8383
val create_from :
8484
?enable_logging:bool ->
8585
?buf_size:int ->
86+
?head_middlewares:Head_middleware.t list ->
8687
?middlewares:([ `Encoding | `Stage of int ] * Middleware.t) list ->
8788
backend:(module IO_BACKEND) ->
8889
unit ->
@@ -94,6 +95,7 @@ val create_from :
9495
{!set_top_handler} to specify how to handle incoming requests.
9596
9697
@param buf_size size for buffers (since 0.11)
98+
@param head_middlewares see {!add_head_middleware} for details (since NEXT_RELEASE)
9799
@param middlewares see {!add_middleware} for more details.
98100
@param enable_logging if true and [Logs] is installed,
99101
emit logs via Logs (since NEXT_RELEASE).
@@ -152,6 +154,12 @@ val add_middleware :
152154
@since 0.11
153155
*)
154156

157+
val add_head_middleware : t -> Head_middleware.t -> unit
158+
(** Add a request-header only {!Head_middleware.t}.
159+
This is called on requests, to modify them, and returns a new request
160+
immediately.
161+
@since NEXT_RELEASE *)
162+
155163
(** {2 Request handlers} *)
156164

157165
val set_top_handler : t -> (IO.Input.t Request.t -> Response.t) -> unit

0 commit comments

Comments
 (0)