cowboy_ssl_transport.erl 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. %% Copyright (c) 2011, Loïc Hoguin <essen@dev-extend.eu>
  2. %%
  3. %% Permission to use, copy, modify, and/or distribute this software for any
  4. %% purpose with or without fee is hereby granted, provided that the above
  5. %% copyright notice and this permission notice appear in all copies.
  6. %%
  7. %% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  8. %% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  9. %% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  10. %% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  11. %% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  12. %% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  13. %% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  14. -module(cowboy_ssl_transport).
  15. -export([name/0, messages/0, listen/1, accept/2, recv/3, send/2, setopts/2,
  16. controlling_process/2, peername/1, close/1]). %% API.
  17. -opaque sslsocket() :: term().
  18. -include("include/types.hrl").
  19. %% API.
  20. -spec name() -> ssl.
  21. name() -> ssl.
  22. -spec messages() -> {ssl, ssl_closed, ssl_error}.
  23. messages() -> {ssl, ssl_closed, ssl_error}.
  24. -spec listen([{port, Port::port_number()} | {certfile, CertPath::string()}
  25. | {keyfile, KeyPath::string()} | {password, Password::string()}])
  26. -> {ok, LSocket::sslsocket()} | {error, Reason::posix()}.
  27. listen(Opts) ->
  28. {port, Port} = lists:keyfind(port, 1, Opts),
  29. {certfile, CertFile} = lists:keyfind(certfile, 1, Opts),
  30. {keyfile, KeyFile} = lists:keyfind(keyfile, 1, Opts),
  31. {password, Password} = lists:keyfind(password, 1, Opts),
  32. ssl:listen(Port, [binary, {active, false},
  33. {packet, raw}, {reuseaddr, true},
  34. {certfile, CertFile}, {keyfile, KeyFile}, {password, Password}]).
  35. -spec accept(LSocket::sslsocket(), Timeout::timeout())
  36. -> {ok, Socket::sslsocket()} | {error, Reason::closed | timeout | posix()}.
  37. accept(LSocket, Timeout) ->
  38. case ssl:transport_accept(LSocket, Timeout) of
  39. {ok, CSocket} ->
  40. ssl_accept(CSocket, Timeout);
  41. {error, Reason} ->
  42. {error, Reason}
  43. end.
  44. -spec recv(Socket::sslsocket(), Length::integer(), Timeout::timeout())
  45. -> {ok, Packet::term()} | {error, Reason::closed | posix()}.
  46. recv(Socket, Length, Timeout) ->
  47. ssl:recv(Socket, Length, Timeout).
  48. -spec send(Socket::sslsocket(), Packet::iolist())
  49. -> ok | {error, Reason::posix()}.
  50. send(Socket, Packet) ->
  51. ssl:send(Socket, Packet).
  52. -spec setopts(Socket::sslsocket(), Opts::list(term()))
  53. -> ok | {error, Reason::posix()}.
  54. setopts(Socket, Opts) ->
  55. ssl:setopts(Socket, Opts).
  56. -spec controlling_process(Socket::sslsocket(), Pid::pid())
  57. -> ok | {error, Reason::closed | not_owner | posix()}.
  58. controlling_process(Socket, Pid) ->
  59. ssl:controlling_process(Socket, Pid).
  60. -spec peername(Socket::sslsocket())
  61. -> {ok, {Address::inet:ip_address(), Port::port_number()}} | {error, posix()}.
  62. peername(Socket) ->
  63. ssl:peername(Socket).
  64. -spec close(Socket::sslsocket()) -> ok.
  65. close(Socket) ->
  66. ssl:close(Socket).
  67. %% Internal.
  68. -spec ssl_accept(CSocket::sslsocket(), Timeout::timeout())
  69. -> {ok, Socket::sslsocket()} | {error, Reason::closed | timeout | posix()}.
  70. ssl_accept(CSocket, Timeout) ->
  71. case ssl:ssl_accept(CSocket, Timeout) of
  72. ok ->
  73. {ok, CSocket};
  74. {error, Reason} ->
  75. {error, Reason}
  76. end.