[erlang-questions] Unimplemented {buffer, integer()} option in ssl module - bug?

Richard Jones rj@REDACTED
Thu Dec 1 12:37:37 CET 2016


The {buffer, integer()} option from gen_tcp is useful for breaking up
incoming data into manageable sizes, especially when in {packet, line}
mode.

The docs suggest (kinda) that the gen_tcp options should also work
when connecting via the ssl module, but this isn't always the case -
the buffer option is silently ignored by ssl:connect.

Is this a bug? Tested on erl 17, 18, 19

Examples follow using netcat/socat as a server. Note that gen_tcp
breaks the incoming data into 3 messages, ssl delivers as one large
message.

Non-SSL example:
----------------

$ echo "12345678901234567890123" | nc -l 1234

1> {ok, _} = gen_tcp:connect("localhost", 1234, [
 binary,
 {packet, line},
 {buffer, 10},
 {active, true}]).

{ok,#Port<0.1180>}

2> flush().

Shell got {tcp,#Port<0.1180>,<<"1234567890">>}
Shell got {tcp,#Port<0.1180>,<<"1234567890">>}
Shell got {tcp,#Port<0.1180>,<<"123\n">>}
Shell got {tcp_closed,#Port<0.1180>}
ok

SSL example:
------------

$ echo "12345678901234567890123" | socat STDIO
OPENSSL-LISTEN:1234,reuseaddr,cert=/some.pem,cafile=/some.crt,verify=0

1> {ok, _} = ssl:connect("localhost", 1234, [
  binary,
  {packet, line},
  {buffer, 10},
  {active, true},
  {verify, verify_none}]).

{ok,{sslsocket,{gen_tcp,#Port<0.1179>,tls_connection,
                        undefined},
               <0.54.0>}}

2> flush().

Shell got {ssl,{sslsocket,{gen_tcp,#Port<0.1179>,tls_connection,undefined},
                          <0.54.0>},
               <<"12345678901234567890123\n">>}
Shell got {ssl_closed,
              {sslsocket,
                  {gen_tcp,#Port<0.1179>,tls_connection,undefined},
                  <0.54.0>}}
ok



More information about the erlang-questions mailing list