diff --git a/src/socketio_transport_polling.erl b/src/socketio_transport_polling.erl index 192b4a8..2f3fa78 100644 --- a/src/socketio_transport_polling.erl +++ b/src/socketio_transport_polling.erl @@ -297,7 +297,7 @@ send_message(Message, Req, Index, ServerModule, Sup) -> send_message_1(Headers, Message, Req, Index, ServerModule) -> Headers0 = [{"Content-Type", "text/javascript; charset=UTF-8"}|Headers], Message0 = unicode:characters_to_list(jsx:format(jsx:term_to_json(list_to_binary(Message), [{strict, false}]))), - Message1 = "io.JSONP["++Index++"]._(" ++ Message0 ++ ");", + Message1 = "io.JSONP["++Index++"]._(\"" ++ escape(tl(Message0)) ++ ");", apply(ServerModule, respond, [Req, 200, Headers0, Message1]). cors_headers(Headers, Sup) -> @@ -325,3 +325,10 @@ reset_duration({TimerRef, Time}) -> erlang:cancel_timer(TimerRef), NewRef = erlang:start_timer(Time, self(), polling), {NewRef, Time}. + +%% THis should deal with only one level of depth -- the rest is assumed to +%% have been escaped correctly by jsx. +escape([$"]) -> [$"]; +escape([$"|Rest]) -> [$\\, $" | escape(Rest)]; +escape([$\\|Rest]) -> [$\\,$\\ | escape(Rest)]; +escape([CodePoint|Rest]) -> [CodePoint | escape(Rest)]. diff --git a/test/socketio_transport_tests.erl b/test/socketio_transport_tests.erl index c0f8685..f628fb3 100644 --- a/test/socketio_transport_tests.erl +++ b/test/socketio_transport_tests.erl @@ -47,7 +47,7 @@ transport_tests(Browser, Transport) -> ets:insert(socketio_tests, {transport, Transport}), error_logger:delete_report_handler(error_logger_tty_h), %% suppress annoying kernel logger application:start(misultin), - application:start(socketio), + application:start(socketio), {ok, Pid} = socketio_listener:start([{http_port, 8989}, {default_http_handler, ?MODULE}]), EventMgr = socketio_listener:event_manager(Pid),