ssl and {active, once} - bug?

Roberto Ostinelli <>
Sun Apr 11 13:49:28 CEST 2010


dear all,

i really hope some kind sould can take me out of this.

i'm using ssl to provide an https service. i start a ssl listener with
the following options:

[binary, {packet,http}, {ip,{0,0,0,0}}, {reuseaddr,true},
{active,false}, {backlog,128},
{certfile, "/Users/roberto/Code/test/server.pem"},
{keyfile, "/Users/roberto/Code/test/privkey.pem"},
{password,"test"}]

once i have the listening socket, i accept incoming requests like this:

accept(ListenSocket) ->
	case ssl:transport_accept(ListenSocket) of
		{ok, NewSocket} ->
			case ssl:ssl_accept(NewSocket) of
				ok -> {ok, NewSocket};
				{error, Reason} -> {error, Reason}
			end;
		{error, Reason} -> {error, Reason}
	end.

once i get the NewSocket, i spawn a controlling process with Pid and i
set it as controller of NewSocket:

ssl:controlling_process(NewSocket, Pid)

the controlling process has the following loop [abstract]:

request(#c{sock = Sock, recv_timeout = RecvTimeout} = C, Req) ->
	ssl:setopts(Sock, [{active, once}]),
	?LOG_DEBUG("waiting http request line", []),
	receive
		{ssl, Sock, {http_request, Method, Path, Version}} ->
			?LOG_DEBUG("received full headers of a new HTTP packet", []),
			headers(C, Req#req{vsn = Version, method = Method, uri = Path,
connection = default_connection(Version)}, []);
		{ssl, Sock, {http_error, "\r\n"}} ->
			request(C, Req);
		{ssl, Sock, {http_error, "\n"}} ->
			request(C, Req);
		{ssl, Sock, _Other} when is_list(_Other) ->
			?LOG_WARNING("invalid tcp data received for ~p socked :~p",
[SocketMode, _Other]),
			exit(normal);
		_Other ->
			?LOG_WARNING("tcp error on incoming request: ~p", [_Other]),
			exit({error, unknown data});
	after RecvTimeout ->
		?LOG_DEBUG("normal receive timeout, exit", []),
		close(Sock, SocketMode),
		exit(normal)
	end.


when i run my server and i point a browser to localhost, it all goes
perfectly until i see the debug log "waiting http request line"
printed in console, then i get:

=ERROR REPORT==== 11-Apr-2010::13:21:45 ===
** Generic server <0.45.0> terminating
** Last message in was {http,#Port<0.611>,
                             {http_request,'GET',{abs_path,"/?id=2"},{1,1}}}
** When Server state == {st,acceptor,<0.42.0>,<0.47.0>,<0.47.0>,6,once,
                            [{mode,binary},
                             {packet,http},
                             {ip,{0,0,0,0}},
                             {active,once},
                             {nodelay,false},
                             {verify,0},
                             {depth,1}],
                            {sslsocket,6,<0.45.0>},
                            #Port<0.611>,50664,open,true,false}
** Reason for termination ==
** {error,{badinfo,{http,#Port<0.611>,
                         {http_request,'GET',{abs_path,"/"},{1,1}}}}}


now:

1. i see that the incoming message has format {http, Sock, Data}.
shouldn't it be {ssl, Sock, Data} as per
http://www.erlang.org/doc/man/ssl.html:

"When a socket is in active mode (the default), data from the socket
is delivered to the owner of the socket in the form of messages:

    * {ssl, Socket, Data}
    * {ssl_closed, Socket}
    * {ssl_error, Socket, Reason}"

i'm using R13B01 so maybe this has changed.

2. why am i receiving a badinfo message ["Call not recognized for
current mode (active or passive) and state of socket"], and what can i
do to solve this?


thank you in advance,

r.


More information about the erlang-questions mailing list