erlyaws / yaws

Yaws webserver
https://erlyaws.github.io
BSD 3-Clause "New" or "Revised" License
1.28k stars 267 forks source link

Websockets issue #141

Closed sigstop closed 11 years ago

sigstop commented 11 years ago

I just upgraded, and my otherwise working (and very simple) websockets code crashed. Thoughts?

=ERROR REPORT==== 19-Mar-2013::12:54:48 === * Generic server <0.75.0> terminating * Last message in was {tcp,#Port<0.4064>, <<129,142,34,86,19,64,224,213,123,66,70,86,22,40, 71,58,127,47,67,87>>} * When Server state == {state, {arg,#Port<0.4064>, {{127,0,0,1},58289}, {headers,"Upgrade",undefined,"localhost:28080", undefined,undefined,undefined,undefined,undefined, undefined,undefined,undefined,undefined,[], undefined,undefined,undefined,undefined,undefined, undefined,undefined,undefined, [{http_header,0,"Sec-WebSocket-Extensions", undefined,"x-webkit-deflate-frame"}, {http_header,0,"Sec-WebSocket-Version",undefined, "13"}, {http_header,0,"Sec-Websocket-Key",undefined, "nNhJ/tCeYYZBpWCjXMmibA=="}, {http_header,1,'Cache-Control',undefined, "no-cache"}, {http_header,4,'Pragma',undefined,"no-cache"}, {http_header,0,"Origin",undefined, "http://localhost:28080"}, {http_header,6,'Upgrade',undefined,"websocket"}]}, {http_request,'GET',{abs_path,"/eport.yaws"},{1,1}}, undefined,"/eport.yaws",undefined,undefined, "/Users/sbailey/Git/E/www","/", "/Users/sbailey/Git/E/www/eport.yaws",undefined, undefined,<0.61.0>, [{"vdir","/apps/ /Users/sbailey/Git/erland/www"}], undefined,"/",undefined}, [{drop_on_timeout,false}, {keepalive_grace_period,2000}, {keepalive_timeout,30000}, {keepalive,false}, {close_timeout,5000}, {auto_fragment_threshold,1048576}, {auto_fragment_message,false}, {close_if_unmasked,false}, {max_message_size,16777216}, {max_frame_size,16777216}, {callback,basic}, {origin,any}], {ws_state,13,#Port<0.4064>,none}, {cbinfo,econnect,undefined,undefined,undefined, handle_message,undefined,undefined}, {{none,<<>>},[]}, basic,infinity,false,false,undefined,normal} * Reason for termination == \ {function_clause, [{yaws_websockets,handle_callback_result, [<0.76.0>, {state, {arg,#Port<0.4064>, {{127,0,0,1},58289}, {headers,"Upgrade",undefined,"localhost:28080", undefined,undefined,undefined,undefined,undefined, undefined,undefined,undefined,undefined,[],undefined, undefined,undefined,undefined,undefined,undefined, undefined,undefined, [{http_header,0,"Sec-WebSocket-Extensions", undefined,"x-webkit-deflate-frame"}, {http_header,0,"Sec-WebSocket-Version",undefined, "13"}, {http_header,0,"Sec-Websocket-Key",undefined, "nNhJ/tCeYYZBpWCjXMmibA=="}, {http_header,1,'Cache-Control',undefined,"no-cache"}, {http_header,4,'Pragma',undefined,"no-cache"}, {http_header,0,"Origin",undefined, "http://localhost:28080"}, {http_header,6,'Upgrade',undefined,"websocket"}]}, {http_request,'GET',{abs_path,"/eport.yaws"},{1,1}}, undefined,"/eport.yaws",undefined,undefined, "/Users/sbailey/Git/E/www","/", "/Users/sbailey/Git/E/www/eport.yaws",undefined, undefined,<0.61.0>, [{"vdir","/apps/ /Users/sbailey/Git/erland/www"}], undefined,"/",undefined}, [{drop_on_timeout,false}, {keepalive_grace_period,2000}, {keepalive_timeout,30000}, {keepalive,false}, {close_timeout,5000}, {auto_fragment_threshold,1048576}, {auto_fragment_message,false}, {close_if_unmasked,false}, {max_message_size,16777216}, {max_frame_size,16777216}, {callback,basic}, {origin,any}], {ws_state,13,#Port<0.4064>,none}, {cbinfo,econnect,undefined,undefined,undefined, handle_message,undefined,undefined}, {{none,<<>>},[]}, basic,infinity,false,false,undefined,normal}], [{file,"src/yaws_websockets.erl"},{line,832}]}, {yaws_websockets,basic_messages,3, [{file,"src/yaws_websockets.erl"},{line,624}]}, {yaws_websockets,handle_frames,2, [{file,"src/yaws_websockets.erl"},{line,513}]}, {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,607}]}, {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]}

vinoski commented 11 years ago

What version of Erlang are you using, and can you share your code with us, or at least show us what your callback is returning?

sigstop commented 11 years ago

R15B01 (happy to upgrade if you think that will help)

eport.yaws (the entry point for the websockets):

out(A) -> CallbackMod = econnect, Opts = [{origin, any}], {websocket, CallbackMod, Opts}.

econnect.erl (the handler that is called) with this particular function called:

handle_message({text,B})-> <<_H,T/binary>> = B, Term = binary_to_term(T), error_logger:info_msg("Binary Received:~n~p~n",[B]), error_logger:info_msg("Term Received:~n~p~n",[Term]), error_logger:info_msg("My Pid = ~p~n",[self()]), spawn(eclient_stub,handle_message,[Term]);

eclient_stub:handle_message which is called by econnect(handle_message({text,B})->

handle_message(Term) when is_tuple(Term)-> error_logger:info_msg("This Client Pid = ~p~n",[self()]), error_logger:info_msg("Term Received:~n~p~n",[Term]).

Log...as you can see all the code seems to be executed..but this termination message still occurs:

=INFO REPORT==== 19-Mar-2013::16:27:24 === Binary Received: <<194,131,104,2,100,0,5,104,101,108,108,111,97,1>>

=INFO REPORT==== 19-Mar-2013::16:27:24 === Term Received: {hello,1}

=INFO REPORT==== 19-Mar-2013::16:27:24 === My Pid = <0.76.0>

=ERROR REPORT==== 19-Mar-2013::16:27:24 === * Generic server <0.76.0> terminating * Last message in was {tcp,#Port<0.4075>, <<129,142,137,16,17,24,75,147,121,26,237,16,20, 112,236,124,125,119,232,17>>} * When Server state == {state, {arg,#Port<0.4075>, {{127,0,0,1},59303}, {headers,"Upgrade",undefined,"localhost:28080", undefined,undefined,undefined,undefined,undefined, undefined,undefined,undefined,undefined,[], undefined,undefined,undefined,undefined,undefined, undefined,undefined,undefined, [{http_header,0,"Sec-WebSocket-Extensions", undefined,"x-webkit-deflate-frame"}, {http_header,0,"Sec-WebSocket-Version",undefined, "13"}, {http_header,0,"Sec-Websocket-Key",undefined, "d2UqkEN9xQevwR0E0fQ32w=="}, {http_header,1,'Cache-Control',undefined, "no-cache"}, {http_header,4,'Pragma',undefined,"no-cache"}, {http_header,0,"Origin",undefined, "http://localhost:28080"}, {http_header,6,'Upgrade',undefined,"websocket"}]}, {http_request,'GET',{abs_path,"/eport.yaws"},{1,1}}, undefined,"/eport.yaws",undefined,undefined, "/Users/sbailey/Git/E/www","/", "/Users/sbailey/Git/E/www/eport.yaws",undefined, undefined,<0.62.0>, [{"vdir","/apps/ /Users/sbailey/Git/erland/www"}], undefined,"/",undefined}, [{drop_on_timeout,false}, {keepalive_grace_period,2000}, {keepalive_timeout,30000}, {keepalive,false}, {close_timeout,5000}, {auto_fragment_threshold,1048576}, {auto_fragment_message,false}, {close_if_unmasked,false}, {max_message_size,16777216}, {max_frame_size,16777216}, {callback,basic}, {origin,any}], {ws_state,13,#Port<0.4075>,none}, {cbinfo,econnect,undefined,undefined,undefined, handle_message,undefined,undefined}, {{none,<<>>},[]}, basic,infinity,false,false,undefined,normal} * Reason for termination == \ {function_clause, [{yaws_websockets,handle_callback_result, [<0.77.0>, {state, {arg,#Port<0.4075>, {{127,0,0,1},59303}, {headers,"Upgrade",undefined,"localhost:28080", undefined,undefined,undefined,undefined,undefined, undefined,undefined,undefined,undefined,[],undefined, undefined,undefined,undefined,undefined,undefined, undefined,undefined, [{http_header,0,"Sec-WebSocket-Extensions", undefined,"x-webkit-deflate-frame"}, {http_header,0,"Sec-WebSocket-Version",undefined, "13"}, {http_header,0,"Sec-Websocket-Key",undefined, "d2UqkEN9xQevwR0E0fQ32w=="}, {http_header,1,'Cache-Control',undefined,"no-cache"}, {http_header,4,'Pragma',undefined,"no-cache"}, {http_header,0,"Origin",undefined, "http://localhost:28080"}, {http_header,6,'Upgrade',undefined,"websocket"}]}, {http_request,'GET',{abs_path,"/eport.yaws"},{1,1}}, undefined,"/eport.yaws",undefined,undefined, "/Users/sbailey/Git/E/www","/", "/Users/sbailey/Git/E/www/eport.yaws",undefined, undefined,<0.62.0>, [{"vdir","/apps/ /Users/sbailey/Git/erland/www"}], undefined,"/",undefined}, [{drop_on_timeout,false}, {keepalive_grace_period,2000}, {keepalive_timeout,30000}, {keepalive,false}, {close_timeout,5000}, {auto_fragment_threshold,1048576}, {auto_fragment_message,false}, {close_if_unmasked,false}, {max_message_size,16777216}, {max_frame_size,16777216}, {callback,basic}, {origin,any}], {ws_state,13,#Port<0.4075>,none}, {cbinfo,econnect,undefined,undefined,undefined, handle_message,undefined,undefined}, {{none,<<>>},[]}, basic,infinity,false,false,undefined,normal}], [{file,"src/yaws_websockets.erl"},{line,832}]}, {yaws_websockets,basic_messages,3, [{file,"src/yaws_websockets.erl"},{line,624}]}, {yaws_websockets,handle_frames,2, [{file,"src/yaws_websockets.erl"},{line,513}]}, {gen_server,handle_msg,5,[{file,"gen_server.erl"},{line,607}]}, {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]}

=INFO REPORT==== 19-Mar-2013::16:27:24 === This Client Pid = <0.77.0>

=INFO REPORT==== 19-Mar-2013::16:27:24 === Term Received: {hello,1}

vinoski commented 11 years ago

If you look at chapter 14 of yaws.pdf you'll see what the return types of the websocket callback modules must be. If you have a basic callback module, see section 14.2.1, or see 14.2.2 for advanced callback modules. Please make sure your callback module, whichever type it is, is returning an allowed return value.

If you still have problems after verifying the return values, you might consider posting all of your code in a gist so we can see the entire modules, if that's ok with you.

sigstop commented 11 years ago

Yup, you are right. The new updates are more strict. I was missing a 'noreply' return. Thanks!