WICKET-4312
Do not strip the jsessionid from the url for resources

Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ec00704c
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ec00704c
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ec00704c

Branch: refs/heads/master
Commit: ec00704cca20fe1d4c1f32e4ab859a2b173d297d
Parents: 95ed055
Author: martin-g <[email protected]>
Authored: Thu Dec 22 16:09:13 2011 +0200
Committer: martin-g <[email protected]>
Committed: Thu Dec 22 16:09:13 2011 +0200

----------------------------------------------------------------------
 .../src/main/java/org/apache/wicket/Component.java |    5 +-
 .../wicket/ajax/res/js/wicket-ajax-jquery.js       |   44 +++-
 .../resource/header/JavaScriptHeaderItem.java      |    4 +-
 .../markup/html/internal/HeaderResponseTest.java   |   16 +
 wicket-core/src/test/js/all.html                   |  220 +++++++-------
 wicket-core/src/test/js/head.js                    |   19 ++-
 6 files changed, 191 insertions(+), 117 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/main/java/org/apache/wicket/Component.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/Component.java 
b/wicket-core/src/main/java/org/apache/wicket/Component.java
index ebadba2..2f575f4 100644
--- a/wicket-core/src/main/java/org/apache/wicket/Component.java
+++ b/wicket-core/src/main/java/org/apache/wicket/Component.java
@@ -2681,7 +2681,10 @@ public abstract class Component
                                        // Make sure the markup source strategy 
contributes to the header first
                                        // to be backward compatible. 
WICKET-3761
                                        
getMarkupSourcingStrategy().renderHead(this, container);
-                                       
response.render(StringHeaderItem.forString(markupHeaderResponse.getBuffer()));
+                                       CharSequence headerContribution = 
markupHeaderResponse.getBuffer();
+                                       if (Strings.isEmpty(headerContribution) 
== false) {
+                                               
response.render(StringHeaderItem.forString(headerContribution));
+                                       }
                                } 
                                finally
                                {

http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
index 1679fd1..dde8df6 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
+++ 
b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js
@@ -1759,7 +1759,7 @@
                        // is an element in head that is of same type as 
myElement, and whose src
                        // attribute is same as myElement.src.
                        containsElement: function (element, mandatoryAttribute) 
{
-                               var attr = 
element.getAttribute(mandatoryAttribute);
+                               var attr = 
Wicket.Head._stripJSessionId(element.getAttribute(mandatoryAttribute));
                                if (isUndef(attr) || attr === "") {
                                        return false;
                                }
@@ -1780,8 +1780,9 @@
                                        // this is necessary for filtering 
script references
                                        if (node.tagName.toLowerCase() === 
element.tagName.toLowerCase()) {
 
-                                               var loadedUrl = 
node.getAttribute(mandatoryAttribute);
-                                               var loadedUrl_ = 
node.getAttribute(mandatoryAttribute+"_");
+                                               var loadedUrl = 
Wicket.Head._stripJSessionId(node.getAttribute(mandatoryAttribute));
+                                               var loadedUrl_ = 
Wicket.Head._stripJSessionId(
+                                                       
node.getAttribute(mandatoryAttribute+"_"));
                                                if (loadedUrl === attr || 
loadedUrl_ === attr) {
                                                    return true;
                                                }
@@ -1790,6 +1791,43 @@
                                return false;
                        },
 
+                       /**
+                        * Removes the optional ';jsessionid=...' from the 
passed url
+                        *
+                        * @param {String} url the url to strip the jsessionid 
from
+                        * @return {String} the url without the jsessionid and 
its value
+                        */
+                       // WICKET-3596, WICKET-4312
+                       _stripJSessionId: function (url) {
+                               if (url == null)
+                               {
+                                       return null;
+                               }
+
+                               // http://.../abc;jsessionid=...?param=...
+                               var ixSemiColon = url.indexOf(";");
+                               if (ixSemiColon == -1)
+                               {
+                                       return url;
+                               }
+
+                               var ixQuestionMark = url.indexOf("?");
+                               if (ixQuestionMark == -1)
+                               {
+                                       // no query paramaters; cut off at ";"
+                                       // http://.../abc;jsession=...
+                                       return url.substring(0, ixSemiColon);
+                               }
+
+                               if (ixQuestionMark <= ixSemiColon)
+                               {
+                                       // ? is before ; - no jsessionid in the 
url
+                                       return url;
+                               }
+
+                               return url.substring(0, ixSemiColon) + 
url.substring(ixQuestionMark);
+                       },
+
                        // Adds a javascript element to page header.
                        // The fakeSrc attribute is used to filter out 
duplicate javascript references.
                        // External javascripts are loaded using 
xmlhttprequest. Then a javascript element is created and the

http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java
 
b/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java
index ec2a542..7777303 100644
--- 
a/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java
+++ 
b/wicket-core/src/main/java/org/apache/wicket/resource/header/JavaScriptHeaderItem.java
@@ -207,7 +207,7 @@ public abstract class JavaScriptHeaderItem extends 
HeaderItem
                {
                        throw new IllegalArgumentException("url cannot be empty 
or null");
                }
-               String urlWoSessionId = Strings.stripJSessionId(url);
-               JavaScriptUtils.writeJavaScriptUrl(response, urlWoSessionId, 
id, defer, charset);
+
+               JavaScriptUtils.writeJavaScriptUrl(response, url, id, defer, 
charset);
        }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
index 1a9cdbe..89b95af 100644
--- 
a/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
+++ 
b/wicket-core/src/test/java/org/apache/wicket/markup/html/internal/HeaderResponseTest.java
@@ -36,6 +36,7 @@ import org.apache.wicket.request.resource.ResourceReference;
 import org.apache.wicket.resource.header.CssHeaderItem;
 import org.apache.wicket.resource.header.JavaScriptHeaderItem;
 import org.apache.wicket.response.StringResponse;
+import org.apache.wicket.util.tester.WicketTester;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -192,4 +193,19 @@ public class HeaderResponseTest
                Assert.assertEquals(expected, actual);
        }
 
+       /**
+        * https://issues.apache.org/jira/browse/WICKET-4312
+        */
+       @Test
+       public void preserveJSessionId() {
+               WicketTester tester = new WicketTester();
+               try {
+                       
headerResponse.render(JavaScriptHeaderItem.forUrl("js-resource.js;jsessionid=1h402r54r4xuep32znicouftm",
 "some-id", false, null));
+                       String expected = "<script type=\"text/javascript\" 
id=\"some-id\" 
src=\"js-resource.js;jsessionid=1h402r54r4xuep32znicouftm\"></script>\n";
+                       String actual = headerResponse.getResponse().toString();
+                       Assert.assertEquals(expected, actual);
+               } finally {
+                       tester.destroy();
+               }
+       }
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/test/js/all.html
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/js/all.html b/wicket-core/src/test/js/all.html
index a536b0a..8008554 100644
--- a/wicket-core/src/test/js/all.html
+++ b/wicket-core/src/test/js/all.html
@@ -18,152 +18,152 @@
 <!DOCTYPE html>
 <html>
 <head>
-       <title id="titleId">All tests</title>
-       <link rel="stylesheet" href="qunit/qunit.css" type="text/css" 
media="screen" />
-       <script 
src="../../main/java/org/apache/wicket/ajax/res/js/jquery/jquery.js"></script>
-       <script 
src="../../main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js"></script>
-       <script 
src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js"></script>
-       <script 
src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js"></script>
-       <script type="text/javascript" src="qunit/qunit.js"></script>
-
-       <!-- the module under test -->
-       <script type="text/javascript" src="ajax.js"></script>
-       <script type="text/javascript" src="dom.js"></script>
-       <script type="text/javascript" src="event.js"></script>
-       <script type="text/javascript" src="form.js"></script>
-       <script type="text/javascript" src="head.js"></script>
-       <script type="text/javascript" src="channels.js"></script>
+    <title id="titleId">All tests</title>
+    <link rel="stylesheet" href="qunit/qunit.css" type="text/css" 
media="screen" />
+    <script 
src="../../main/java/org/apache/wicket/resource/jquery/jquery.js"></script>
+    <script 
src="../../main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js"></script>
+    <script 
src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js"></script>
+    <script 
src="../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js"></script>
+    <script type="text/javascript" src="qunit/qunit.js"></script>
+
+    <!-- the module under test -->
+    <script type="text/javascript" src="ajax.js"></script>
+    <script type="text/javascript" src="dom.js"></script>
+    <script type="text/javascript" src="event.js"></script>
+    <script type="text/javascript" src="form.js"></script>
+    <script type="text/javascript" src="head.js"></script>
+    <script type="text/javascript" src="channels.js"></script>
 </head>
 <body>
-       <h1 id="qunit-header">Wicket Ajax tests</h1>
-       <h2 id="qunit-banner"></h2>
-       <div id="qunit-testrunner-toolbar"></div>
-       <h2 id="qunit-userAgent"></h2>
-       <ol id="qunit-tests"></ol>
-       <div id="qunit-fixture">
+    <h1 id="qunit-header">Wicket Ajax tests</h1>
+    <h2 id="qunit-banner"></h2>
+    <div id="qunit-testrunner-toolbar"></div>
+    <h2 id="qunit-userAgent"></h2>
+    <ol id="qunit-tests"></ol>
+    <div id="qunit-fixture">
 
-               test markup, will be hidden
+        test markup, will be hidden
 
-               <!--
-                       AJAX
-               -->
-               <textarea id="evaluationId"><ajax-response><evaluate>ok(true, 
'Evaluation must be executed!');</evaluate></ajax-response></textarea>
+        <!--
+            AJAX
+        -->
+        <textarea id="evaluationId"><ajax-response><evaluate>ok(true, 
'Evaluation must be executed!');</evaluate></ajax-response></textarea>
 
-               <textarea 
id="priorityEvaluationId"><ajax-response><priority-evaluate>ok(true, 'Priority 
Evaluation must be executed!');</priority-evaluate></ajax-response></textarea>
+        <textarea 
id="priorityEvaluationId"><ajax-response><priority-evaluate>ok(true, 'Priority 
Evaluation must be executed!');</priority-evaluate></ajax-response></textarea>
 
-               <!--
-                       Executes the second part of 'something|functionBody' by 
passing 'notify' function as parameter
-               -->
-               <textarea 
id="evaluationIdentifierAndCodeId"><ajax-response><evaluate>ignored|start(); 
ok(true, 'Evaluation with identifier must be executed!'); 
arguments[0]();</evaluate></ajax-response></textarea>
+        <!--
+            Executes the second part of 'something|functionBody' by passing 
'notify' function as parameter
+        -->
+        <textarea 
id="evaluationIdentifierAndCodeId"><ajax-response><evaluate>ignored|start(); 
ok(true, 'Evaluation with identifier must be executed!'); 
arguments[0]();</evaluate></ajax-response></textarea>
 
-               <div id="componentToReplace">old body</div>
+        <div id="componentToReplace">old body</div>
 
-               <textarea id="componentId"><ajax-response><component 
id="componentToReplace"><![CDATA[<span id="componentToReplace">new 
body</span>]]></component></ajax-response></textarea>
+        <textarea id="componentId"><ajax-response><component 
id="componentToReplace"><![CDATA[<span id="componentToReplace">new 
body</span>]]></component></ajax-response></textarea>
 
 
-               <textarea 
id="componentDoesNotExistsId"><ajax-response><component 
id="componentToReplaceDoesNotExist"><![CDATA[<span 
id="componentToReplaceDoesNotExist">new 
body</span>]]></component></ajax-response></textarea>
+        <textarea id="componentDoesNotExistsId"><ajax-response><component 
id="componentToReplaceDoesNotExist"><![CDATA[<span 
id="componentToReplaceDoesNotExist">new 
body</span>]]></component></ajax-response></textarea>
 
 
-               <textarea id="complexComponentId"><ajax-response><component 
id="componentToReplace"><![CDATA[
+        <textarea id="complexComponentId"><ajax-response><component 
id="componentToReplace"><![CDATA[
 
-                       <table id="componentToReplace">
-                               <thead>
-                                       <tr>
-                                               <th><div><script>start(); 
ok(true, 'script in thead > td has to be executed')</script></div>
-                                               </th>
-                                               <th>header 2</th>
-                                       </tr>
-                               </thead>
-                               <tbody>
-                                       <tr>
-                                               <td>data 1
+            <table id="componentToReplace">
+                <thead>
+                    <tr>
+                        <th><div><script>start(); ok(true, 'script in thead > 
td has to be executed')</script></div>
+                        </th>
+                        <th>header 2</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr>
+                        <td>data 1
 <script>start(); ok(true, 'script in tbody > td has to be executed')</script>
-                                               </td>
-                                               <td>data 2</td>
-                                       </tr>
-                               </tbody>
-                               <tfoot>
-                                       <tr>
-                                               <td>footer 1</td>
-                                               <td>footer 2
-                                                       <script>start(); 
ok(true, 'script in tfoot > td has to be executed')</script>
-                                               </td>
-                                       </tr>
-                               </tfoot>
-                       </table>
+                        </td>
+                        <td>data 2</td>
+                    </tr>
+                </tbody>
+                <tfoot>
+                    <tr>
+                        <td>footer 1</td>
+                        <td>footer 2
+                            <script>start(); ok(true, 'script in tfoot > td 
has to be executed')</script>
+                        </td>
+                    </tr>
+                </tfoot>
+            </table>
 
-               ]]></component></ajax-response></textarea>
+        ]]></component></ajax-response></textarea>
 
-               <textarea id="componentToReplaceTitle">
-               <ajax-response><component id="titleId"><![CDATA[<title 
id="titleId">new title</title>]]></component></ajax-response>
-               </textarea>
+        <textarea id="componentToReplaceTitle">
+        <ajax-response><component id="titleId"><![CDATA[<title 
id="titleId">new title</title>]]></component></ajax-response>
+        </textarea>
 
-               <!--
-                       DOM
-               -->
-                               <span id="testElement"></span>
+        <!--
+            DOM
+        -->
+                <span id="testElement"></span>
 
-               <div id="complexElement">
-                       <a href="some/url">Link</a>
-               </div>
+        <div id="complexElement">
+            <a href="some/url">Link</a>
+        </div>
 
-               <iframe id="testInDocIFrame"></iframe>
+        <iframe id="testInDocIFrame"></iframe>
 
-               <span id="toBeReplacedByTable"></span>
-               <span id="toBeReplacedByScript"></span>
-               <span id="toBeReplacedByDivWithChildren"></span>
+        <span id="toBeReplacedByTable"></span>
+        <span id="toBeReplacedByScript"></span>
+        <span id="toBeReplacedByDivWithChildren"></span>
 
-               <!--
-                       Event
-               -->             
-               <span id="specifiedId" class="getIdClass1"></span>
-               <span class="getIdClass2"></span>
+        <!--
+            Event
+        -->
+        <span id="specifiedId" class="getIdClass1"></span>
+        <span class="getIdClass2"></span>
 
-               <!--
-                       Form
-               -->
-                               <form id="testForm" action="actionUrl">
+        <!--
+            Form
+        -->
+                <form id="testForm" action="actionUrl">
 
-                       <input type="text" id="textInputId" name="textInput" 
value="textValue"/>
+            <input type="text" id="textInputId" name="textInput" 
value="textValue"/>
 
-                       <input type="text" id="textInputUTFId" 
name="textUTFInput" value="нещо на български"/>
+            <input type="text" id="textInputUTFId" name="textUTFInput" 
value="нещо на български"/>
 
-                       <input type="checkbox" name="checkBoxInput1" 
checked="checked" value="cbValue1"/>
-                       <input type="checkbox" name="checkBoxInput2" 
value="cbValue2"/>
-                       <input type="checkbox" name="checkBoxInput3" 
checked="checked" value="cbValue3"/>
+            <input type="checkbox" name="checkBoxInput1" checked="checked" 
value="cbValue1"/>
+            <input type="checkbox" name="checkBoxInput2" value="cbValue2"/>
+            <input type="checkbox" name="checkBoxInput3" checked="checked" 
value="cbValue3"/>
 
-                       <input type="radio" name="radioInput" checked="checked" 
value="radioValue1"/>
-                       <input type="radio" name="radioInput" 
value="radioValue2"/>
+            <input type="radio" name="radioInput" checked="checked" 
value="radioValue1"/>
+            <input type="radio" name="radioInput" value="radioValue2"/>
 
-                       <input type="email" id="emailInputId" name="emailInput" 
value="[email protected]"/>
+            <input type="email" id="emailInputId" name="emailInput" 
value="[email protected]"/>
 
-                       <input type="url" id="urlInputId" name="urlInput" 
value="http://example.com"/>
+            <input type="url" id="urlInputId" name="urlInput" 
value="http://example.com"/>
 
-                       <input type="search" id="searchInputId" 
name="searchInput" value="wicket"/>
+            <input type="search" id="searchInputId" name="searchInput" 
value="wicket"/>
 
-                       <input type="range" id="rangeInputId" name="rangeInput" 
min="0" max="100" value="67"/>
+            <input type="range" id="rangeInputId" name="rangeInput" min="0" 
max="100" value="67"/>
 
-                       <input type="number" id="numberInputId" 
name="numberInput" min="0" max="100" value="16"/>
+            <input type="number" id="numberInputId" name="numberInput" min="0" 
max="100" value="16"/>
 
-                       <input type="color" id="colorInputId" name="colorInput" 
value="123456"/>
+            <input type="color" id="colorInputId" name="colorInput" 
value="123456"/>
 
-                       <select id="multipleSelectId" name="multipleSelect" 
multiple="multiple">
-                               <option value="0" 
selected="selected">zero</option>
-                               <option value="1">one</option>
-                               <option value="2" 
selected="selected">two</option>
-                       </select>
+            <select id="multipleSelectId" name="multipleSelect" 
multiple="multiple">
+                <option value="0" selected="selected">zero</option>
+                <option value="1">one</option>
+                <option value="2" selected="selected">two</option>
+            </select>
 
-                       <select id="selectId" name="select">
-                               <option value="0" 
selected="selected">zero</option>
-                               <option value="1">one</option>
-                               <option value="2">two</option>
-                       </select>
+            <select id="selectId" name="select">
+                <option value="0" selected="selected">zero</option>
+                <option value="1">one</option>
+                <option value="2">two</option>
+            </select>
 
-                       <textarea name="textArea">some text</textarea>
+            <textarea name="textArea">some text</textarea>
 
-               </form>
+        </form>
 
-       
-       </div>
+
+    </div>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/ec00704c/wicket-core/src/test/js/head.js
----------------------------------------------------------------------
diff --git a/wicket-core/src/test/js/head.js b/wicket-core/src/test/js/head.js
index ccb8496..3b1794b 100644
--- a/wicket-core/src/test/js/head.js
+++ b/wicket-core/src/test/js/head.js
@@ -88,7 +88,7 @@ jQuery(document).ready(function() {
                scriptElement.src = 
"../../main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js";
                ok(Wicket.Head.containsElement(scriptElement, 'src'), 'There 
should be an element for wicket-ajax-debug.js');
        });
-       
+
        test('Wicket.Head.containsElement - check existence of data/test.js 
with "src_"', function() {
                var $script = jQuery('<script>', {
                        type: 'text/javascript',
@@ -103,6 +103,23 @@ jQuery(document).ready(function() {
                ok(Wicket.Head.containsElement(script, 'src'), 'There should be 
an element for wicket-ajax-debug.js');
        });
 
+       test('Wicket.Head.containsElement - check existence of data/test.js 
with jsessionid in the url', function() {
+               var
+                       script1 = jQuery('<script>', {
+                               type: 'text/javascript',
+                               src: 'data/test.js;jsessionid=1'
+                       })[0],
+                       script2 = jQuery('<script>', {
+                               type: 'text/javascript',
+                               src: 'data/test.js;jsessionid=2' // different 
jsessionid
+                       })[0];
+
+               // add just jsessionid=1
+               Wicket.Head.addElement(script1);
+
+               ok(Wicket.Head.containsElement(script2, 'src'), 'The jsessionid 
part of the URL must be ignored.');
+       });
+
        module('addJavascript');
        
        test('Wicket.Head.addJavascript - add script with text content', 
function() {

Reply via email to