From f1f8ea9d838d85d9abb28542d92c6b240407bc89 Mon Sep 17 00:00:00 2001 From: jfarcand Date: Wed, 29 Sep 2010 11:26:56 -0400 Subject: [PATCH] Fix for https://atmosphere.dev.java.net/issues/show_bug.cgi?id=60 ("Some data might be lost when junk comments are mixed with streaming data") See issue description --- .../atmosphere/cpr/AtmosphereResourceImpl.java | 3 ++- .../main/webapp/jquery/jquery.atmosphere.js | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereResourceImpl.java b/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereResourceImpl.java index dc5fc1a673..c2a85f6115 100644 --- a/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereResourceImpl.java +++ b/modules/cpr/src/main/java/org/atmosphere/cpr/AtmosphereResourceImpl.java @@ -351,7 +351,7 @@ public static String createCompatibleStringJunk() { StringBuilder s = new StringBuilder(); s.append("\n"); s.append("\n"); } + s.append(""); return s.toString(); } diff --git a/modules/jquery/src/main/webapp/jquery/jquery.atmosphere.js b/modules/jquery/src/main/webapp/jquery/jquery.atmosphere.js index 035a8b854b..eaa4d56e34 100644 --- a/modules/jquery/src/main/webapp/jquery/jquery.atmosphere.js +++ b/modules/jquery/src/main/webapp/jquery/jquery.atmosphere.js @@ -201,11 +201,19 @@ jQuery.atmosphere = function() if (update) { if (request.transport == 'streaming') { response.responseBody = ajaxRequest.responseText.substring(request.lastIndex, ajaxRequest.responseText.length); - request.lastIndex = ajaxRequest.responseText.length; - if (response.responseBody.indexOf(""; + var endOfJunkLenght = "".length; + var junkEnd = response.responseBody.indexOf(endOfJunk) + endOfJunkLenght; + + if (junkEnd != ajaxRequest.responseText.length) { + response.responseBody = response.responseBody.substring(junkEnd); + } else { + junkForWebkit = true; + } } + request.lastIndex = ajaxRequest.responseText.length; } else { response.responseBody = ajaxRequest.responseText; @@ -217,8 +225,6 @@ jQuery.atmosphere = function() response.responseBody = response.responseBody.substring(start, end); } - if (junkForWebkit) return; - try { response.status = ajaxRequest.status; response.headers = ajaxRequest.getAllResponseHeaders(); @@ -232,6 +238,8 @@ jQuery.atmosphere = function() } else { response.state = "messagePublished"; } + + if (junkForWebkit) return; jQuery.atmosphere.invokeCallback(response); } }