Skip to content

Commit

Permalink
Allow using Lwt_ssl and / or Tls_lwt, or neither of them
Browse files Browse the repository at this point in the history
  • Loading branch information
Antonio Nuno Monteiro committed Jan 30, 2019
1 parent 396b717 commit 1ac80ea
Show file tree
Hide file tree
Showing 9 changed files with 181 additions and 60 deletions.
2 changes: 1 addition & 1 deletion examples/lwt/lwt_https_get.ml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ let () =
let response_handler = response_handler notify_response_received in

let request_body =
Httpaf_lwt.Client.request_tls
Httpaf_lwt.Client.TLS.request
socket
request_headers
~error_handler
Expand Down
2 changes: 1 addition & 1 deletion examples/lwt/lwt_https_server.ml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ let connection_handler : Unix.sockaddr -> Lwt_unix.file_descr -> unit Lwt.t =

let certfile = "./certificates/server.pem" in
let keyfile = "./certificates/server.key" in
Httpaf_lwt.Server.create_tls_connection_handler
Httpaf_lwt.Server.TLS.create_connection_handler
?server:None
~certfile
~keyfile
Expand Down
37 changes: 32 additions & 5 deletions lwt/dune
Original file line number Diff line number Diff line change
@@ -1,9 +1,36 @@
(* -*- tuareg -*- *)
(* This was inspired by `conduit-lwt-unix`'s dune file *)

let v ~ssl ~tls () =
let ssl, ssl_d =
if ssl then "ssl_io_real", "lwt_ssl "
else "ssl_io_dummy", ""
in
let tls, tls_d =
if tls then "tls_io_real", "tls.lwt "
else "tls_io_dummy", ""
in
Printf.sprintf {|
(rule (copy %s.ml ssl_io.ml))
(rule (copy %s.ml tls_io.ml))

(library
(name httpaf_lwt)
(public_name httpaf-lwt)
(libraries faraday-lwt-unix httpaf lwt.unix
(select tls_impl.ml from
(tls.lwt -> tls_io.ml)
(lwt_ssl -> ssl_io.ml)))
(modules buffer httpaf_lwt tls_impl)
(libraries faraday-lwt-unix httpaf lwt.unix %s%s)
(modules buffer httpaf_lwt tls_io ssl_io)
(flags (:standard -safe-string)))
|} ssl tls ssl_d tls_d

let main () =
let is_installed s = Printf.kprintf Sys.command "ocamlfind query %s" s = 0 in
let ssl = is_installed "lwt_ssl" in
let tls = Sys.unix && is_installed "tls.lwt" in
Printf.printf
"Configuration\n\
\ ssl : %b\n\
\ tls : %b\n%!"
ssl tls;
v ~ssl ~tls ()

let () = Jbuild_plugin.V1.send @@ main ()
101 changes: 70 additions & 31 deletions lwt/httpaf_lwt.ml
Original file line number Diff line number Diff line change
Expand Up @@ -130,25 +130,49 @@ module Server = struct
in
start_read_write_loops ~config ~socket connection

let create_tls_connection_handler
?server
?certfile
?keyfile
?(config=Config.default)
~request_handler
~error_handler =
fun client_addr socket ->
let connection =
Server_connection.create
~config
~error_handler:(error_handler client_addr)
(request_handler client_addr)
in
Tls_impl.make_server ?server ?certfile ?keyfile socket >>= fun tls_server ->
let readf = Tls_impl.readf tls_server in
let writev = Tls_impl.writev tls_server in
start_read_write_loops ~config ~readf ~writev ~socket connection
>>= Lwt.return
module TLS = struct
let create_connection_handler
?server
?certfile
?keyfile
?(config=Config.default)
~request_handler
~error_handler =
fun client_addr socket ->
let connection =
Server_connection.create
~config
~error_handler:(error_handler client_addr)
(request_handler client_addr)
in
Tls_io.make_server ?server ?certfile ?keyfile socket >>= fun tls_server ->
let readf = Tls_io.readf tls_server in
let writev = Tls_io.writev tls_server in
start_read_write_loops ~config ~readf ~writev ~socket connection
>>= Lwt.return
end

module SSL = struct
let create_connection_handler
?server
?certfile
?keyfile
?(config=Config.default)
~request_handler
~error_handler =
fun client_addr socket ->
let connection =
Server_connection.create
~config
~error_handler:(error_handler client_addr)
(request_handler client_addr)
in
Ssl_io.make_server ?server ?certfile ?keyfile socket >>= fun tls_server ->
let readf = Ssl_io.readf tls_server in
let writev = Ssl_io.writev tls_server in
start_read_write_loops ~config ~readf ~writev ~socket connection
>>= Lwt.return
end
end


Expand Down Expand Up @@ -249,18 +273,33 @@ module Client = struct
start_read_write_loops ~config ~socket connection;
request_body

let request_tls ?client ?(config=Config.default) socket request ~error_handler ~response_handler =
let request_body, connection =
Client_connection.request ~config request ~error_handler ~response_handler
in
module TLS = struct
let request ?client ?(config=Config.default) socket request ~error_handler ~response_handler =
let request_body, connection =
Client_connection.request ~config request ~error_handler ~response_handler
in

Lwt.async(fun () ->
Tls_impl.make_client ?client socket >|= fun tls_client ->
let readf = Tls_impl.readf tls_client in
let writev = Tls_impl.writev tls_client in
Lwt.async(fun () ->
Tls_io.make_client ?client socket >|= fun tls_client ->
let readf = Tls_io.readf tls_client in
let writev = Tls_io.writev tls_client in

start_read_write_loops ~config ~readf ~writev ~socket connection);
request_body
end
start_read_write_loops ~config ~readf ~writev ~socket connection);
request_body
end

module Tls_impl = Tls_impl
module SSL = struct
let request ?client ?(config=Config.default) socket request ~error_handler ~response_handler =
let request_body, connection =
Client_connection.request ~config request ~error_handler ~response_handler
in

Lwt.async(fun () ->
Ssl_io.make_client ?client socket >|= fun tls_client ->
let readf = Ssl_io.readf tls_client in
let writev = Ssl_io.writev tls_client in

start_read_write_loops ~config ~readf ~writev ~socket connection);
request_body
end
end
67 changes: 45 additions & 22 deletions lwt/httpaf_lwt.mli
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,31 @@ module Server : sig
-> Lwt_unix.file_descr
-> unit Lwt.t

val create_tls_connection_handler
: ?server : Tls_impl.server
-> ?certfile : string
-> ?keyfile : string
-> ?config : Config.t
-> request_handler : (Unix.sockaddr -> Server_connection.request_handler)
-> error_handler : (Unix.sockaddr -> Server_connection.error_handler)
-> Unix.sockaddr
-> Lwt_unix.file_descr
-> unit Lwt.t
module TLS : sig
val create_connection_handler
: ?server : Tls_io.server
-> ?certfile : string
-> ?keyfile : string
-> ?config : Config.t
-> request_handler : (Unix.sockaddr -> Server_connection.request_handler)
-> error_handler : (Unix.sockaddr -> Server_connection.error_handler)
-> Unix.sockaddr
-> Lwt_unix.file_descr
-> unit Lwt.t
end

module SSL : sig
val create_connection_handler
: ?server : Ssl_io.server
-> ?certfile : string
-> ?keyfile : string
-> ?config : Config.t
-> request_handler : (Unix.sockaddr -> Server_connection.request_handler)
-> error_handler : (Unix.sockaddr -> Server_connection.error_handler)
-> Unix.sockaddr
-> Lwt_unix.file_descr
-> unit Lwt.t
end
end

(* For an example, see [examples/lwt_get.ml]. *)
Expand All @@ -35,17 +50,25 @@ module Client : sig
-> response_handler : Client_connection.response_handler
-> [`write] Body.t

val request_tls
: ?client : Tls_impl.client
-> ?config : Config.t
-> Lwt_unix.file_descr
-> Request.t
-> error_handler : Client_connection.error_handler
-> response_handler : Client_connection.response_handler
-> [`write] Body.t
end
module TLS : sig
val request
: ?client : Tls_io.client
-> ?config : Config.t
-> Lwt_unix.file_descr
-> Request.t
-> error_handler : Client_connection.error_handler
-> response_handler : Client_connection.response_handler
-> [`write] Body.t
end

module Tls_impl : sig
type client = Tls_impl.client
type server = Tls_impl.server
module SSL : sig
val request
: ?client : Ssl_io.client
-> ?config : Config.t
-> Lwt_unix.file_descr
-> Request.t
-> error_handler : Client_connection.error_handler
-> response_handler : Client_connection.response_handler
-> [`write] Body.t
end
end
16 changes: 16 additions & 0 deletions lwt/ssl_io_dummy.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
let readf _socket =
fun _fd _buffer ->
Lwt.fail_with "Ssl not available"

let writev _socket _fd =
fun _iovecs ->
Lwt.fail_with "Ssl not available"

type client = [ `Ssl_not_available ]
type server = [ `Ssl_not_available ]

let make_client ?client:_ _socket =
Lwt.fail_with "Ssl not available"

let make_server ?server:_ ?certfile:_ ?keyfile:_ _socket =
Lwt.fail_with "Ssl not available"
File renamed without changes.
16 changes: 16 additions & 0 deletions lwt/tls_io_dummy.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
let readf _tls =
fun _fd _buffer ->
Lwt.fail_with "Tls not available"

let writev _tls _fd =
fun _iovecs ->
Lwt.fail_with "Tls not available"

type client = [ `Tls_not_available ]
type server = [ `Tls_not_available ]

let make_client ?client:_ _socket =
Lwt.fail_with "Tls not available"

let make_server ?server:_ ?certfile:_ ?keyfile:_ _socket =
Lwt.fail_with "Tls not available"
File renamed without changes.

0 comments on commit 1ac80ea

Please sign in to comment.