<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[55719] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/55719">55719</a></dd>
<dt>Author</dt> <dd>ukai@chromium.org</dd>
<dt>Date</dt> <dd>2010-03-09 02:40:49 -0800 (Tue, 09 Mar 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>2010-03-03  Fumitoshi Ukai  &lt;ukai@chromium.org&gt;

        Reviewed by Alexey Proskuryakov.

        pywebsocket should support html and cgi in the same directory.
        https://bugs.webkit.org/show_bug.cgi?id=34879

        * websocket/tests/cookies: Removed.
        * websocket/tests/cookies/echo-cookie_wsh.py: Removed.
        * websocket/tests/cookies/httponly-cookie-expected.txt: Removed.
        * websocket/tests/cookies/httponly-cookie.pl: Removed.
        * websocket/tests/echo-cookie_wsh.py: Copied from LayoutTests/websocket/tests/cookies/echo-cookie_wsh.py.
        * websocket/tests/httponly-cookie-expected.txt: Copied from LayoutTests/websocket/tests/cookies/httponly-cookie-expected.txt.
        * websocket/tests/httponly-cookie.pl: Copied from LayoutTests/websocket/tests/cookies/httponly-cookie.pl.
2010-03-03  Fumitoshi Ukai  &lt;ukai@chromium.org&gt;

        Reviewed by Alexey Proskuryakov.

        pywebsocket should support html and cgi in the same directory.
        https://bugs.webkit.org/show_bug.cgi?id=34879

        Import pywebsocket 0.4.9.2
        Specify --server-host 127.0.0.1, so that it only binds listening socket
        to 127.0.0.1 to prevent access from non-localhost.
        Change --cgi-paths from /websocket/tests/cookies to /websocket/tests,
        because pywebsocket 0.4.9.2 supports html and cgi in the same directory
        and only executable (httponly-cookies.pl) will be handled as cgi
        script.

        * Scripts/run-webkit-tests:
        * Scripts/run-webkit-websocketserver:
        * Scripts/webkitpy/layout_tests/port/websocket_server.py:
        * Scripts/webkitpy/thirdparty/pywebsocket/README.webkit:
        * Scripts/webkitpy/thirdparty/pywebsocket/example/echo_client.py:
        * Scripts/webkitpy/thirdparty/pywebsocket/example/handler_map.txt: Added.
        * Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py:
        * Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/util.py:
        * Scripts/webkitpy/thirdparty/pywebsocket/setup.py:
        * Scripts/webkitpy/thirdparty/pywebsocket/test/test_util.py:
        * Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/README: Added.
        * Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/hello.pl: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkWebKitToolsChangeLog">trunk/WebKitTools/ChangeLog</a></li>
<li><a href="#trunkWebKitToolsScriptsrunwebkittests">trunk/WebKitTools/Scripts/run-webkit-tests</a></li>
<li><a href="#trunkWebKitToolsScriptsrunwebkitwebsocketserver">trunk/WebKitTools/Scripts/run-webkit-websocketserver</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpylayout_testsportwebsocket_serverpy">trunk/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsocketREADMEwebkit">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/README.webkit</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsocketexampleecho_clientpy">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/echo_client.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsocketmod_pywebsocketstandalonepy">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsocketmod_pywebsocketutilpy">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/util.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsocketsetuppy">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/setup.py</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsockettesttest_utilpy">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/test_util.py</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestswebsockettestsechocookie_wshpy">trunk/LayoutTests/websocket/tests/echo-cookie_wsh.py</a></li>
<li><a href="#trunkLayoutTestswebsockettestshttponlycookieexpectedtxt">trunk/LayoutTests/websocket/tests/httponly-cookie-expected.txt</a></li>
<li><a href="#trunkLayoutTestswebsockettestshttponlycookiepl">trunk/LayoutTests/websocket/tests/httponly-cookie.pl</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsocketexamplehandler_maptxt">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/handler_map.txt</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsockettesttestdataREADME">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/README</a></li>
<li><a href="#trunkWebKitToolsScriptswebkitpythirdpartypywebsockettesttestdatahellopl">trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/hello.pl</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li>trunk/LayoutTests/websocket/tests/cookies/</li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/LayoutTests/ChangeLog        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2010-03-03  Fumitoshi Ukai  &lt;ukai@chromium.org&gt;
+
+        Reviewed by Alexey Proskuryakov.
+
+        pywebsocket should support html and cgi in the same directory.
+        https://bugs.webkit.org/show_bug.cgi?id=34879
+
+        * websocket/tests/cookies: Removed.
+        * websocket/tests/cookies/echo-cookie_wsh.py: Removed.
+        * websocket/tests/cookies/httponly-cookie-expected.txt: Removed.
+        * websocket/tests/cookies/httponly-cookie.pl: Removed.
+        * websocket/tests/echo-cookie_wsh.py: Copied from LayoutTests/websocket/tests/cookies/echo-cookie_wsh.py.
+        * websocket/tests/httponly-cookie-expected.txt: Copied from LayoutTests/websocket/tests/cookies/httponly-cookie-expected.txt.
+        * websocket/tests/httponly-cookie.pl: Copied from LayoutTests/websocket/tests/cookies/httponly-cookie.pl.
+
</ins><span class="cx"> 2010-03-08  Kent Tamura  &lt;tkent@chromium.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Adam Barth.
</span></span></pre></div>
<a id="trunkLayoutTestswebsockettestsechocookie_wshpyfromrev55360trunkLayoutTestswebsockettestscookiesechocookie_wshpy"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/websocket/tests/echo-cookie_wsh.py (from rev 55360, trunk/LayoutTests/websocket/tests/cookies/echo-cookie_wsh.py) (0 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/websocket/tests/echo-cookie_wsh.py                                (rev 0)
+++ trunk/LayoutTests/websocket/tests/echo-cookie_wsh.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+# Copyright (C) 2010 Google Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+from mod_pywebsocket import msgutil
+
+def web_socket_do_extra_handshake(request):
+    pass
+
+def web_socket_transfer_data(request):
+    msgutil.send_message(request,  request.headers_in['Cookie'])
</ins></span></pre></div>
<a id="trunkLayoutTestswebsockettestshttponlycookieexpectedtxtfromrev55360trunkLayoutTestswebsockettestscookieshttponlycookieexpectedtxt"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/websocket/tests/httponly-cookie-expected.txt (from rev 55360, trunk/LayoutTests/websocket/tests/cookies/httponly-cookie-expected.txt) (0 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/websocket/tests/httponly-cookie-expected.txt                                (rev 0)
+++ trunk/LayoutTests/websocket/tests/httponly-cookie-expected.txt        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+Test WebSocket sends HttpOnly cookies.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+WebSocket open
+WebSocket closed
+PASS cookie is &quot;WK-websocket-test=1; WK-websocket-test-httponly=1&quot;
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestswebsockettestshttponlycookieplfromrev55360trunkLayoutTestswebsockettestscookieshttponlycookiepl"></a>
<div class="copfile"><h4>Copied: trunk/LayoutTests/websocket/tests/httponly-cookie.pl (from rev 55360, trunk/LayoutTests/websocket/tests/cookies/httponly-cookie.pl) (0 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/websocket/tests/httponly-cookie.pl                                (rev 0)
+++ trunk/LayoutTests/websocket/tests/httponly-cookie.pl        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+#!/usr/bin/perl -wT
+use strict;
+
+print &quot;Content-Type: text/html\r\n&quot;;
+print &quot;Set-Cookie: WK-websocket-test=1\r\n&quot;;
+print &quot;Set-Cookie: WK-websocket-test-httponly=1; HttpOnly\r\n&quot;;
+print &quot;\r\n&quot;;
+print &lt;&lt;HTML
+&lt;html&gt;
+&lt;head&gt;
+&lt;script src=&quot;../../fast/js/resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script src=&quot;../../fast/js/resources/js-test-post-function.js&quot;&gt;&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;p&gt;Test WebSocket sends HttpOnly cookies.&lt;/p&gt;
+&lt;p&gt;On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.&lt;/p&gt;
+&lt;div id=&quot;console&quot;&gt;&lt;/div&gt;
+&lt;script&gt;
+if (window.layoutTestController) {
+    layoutTestController.dumpAsText();
+    layoutTestController.waitUntilDone();
+}
+
+var cookie;
+
+function endTest()
+{
+    shouldBe(&quot;cookie&quot;, '&quot;WK-websocket-test=1; WK-websocket-test-httponly=1&quot;');
+    isSuccessfullyParsed();
+    if (window.layoutTestController)
+       layoutTestController.notifyDone();
+}
+
+var ws = new WebSocket(&quot;ws://127.0.0.1:8880/websocket/tests/echo-cookie&quot;);
+ws.onopen = function() {
+    debug(&quot;WebSocket open&quot;);
+};
+ws.onmessage = function(evt) {
+    cookie = evt.data;
+    ws.close();
+};
+ws.onclose = function() {
+    debug(&quot;WebSocket closed&quot;);
+    endTest();
+};
+
+var successfullyParsed = true;
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
+HTML
</ins></span></pre></div>
<a id="trunkWebKitToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/ChangeLog (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/ChangeLog        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/ChangeLog        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2010-03-03  Fumitoshi Ukai  &lt;ukai@chromium.org&gt;
+
+        Reviewed by Alexey Proskuryakov.
+
+        pywebsocket should support html and cgi in the same directory.
+        https://bugs.webkit.org/show_bug.cgi?id=34879
+
+        Import pywebsocket 0.4.9.2
+        Specify --server-host 127.0.0.1, so that it only binds listening socket
+        to 127.0.0.1 to prevent access from non-localhost.
+        Change --cgi-paths from /websocket/tests/cookies to /websocket/tests,
+        because pywebsocket 0.4.9.2 supports html and cgi in the same directory
+        and only executable (httponly-cookies.pl) will be handled as cgi
+        script.
+
+        * Scripts/run-webkit-tests:
+        * Scripts/run-webkit-websocketserver:
+        * Scripts/webkitpy/layout_tests/port/websocket_server.py:
+        * Scripts/webkitpy/thirdparty/pywebsocket/README.webkit:
+        * Scripts/webkitpy/thirdparty/pywebsocket/example/echo_client.py:
+        * Scripts/webkitpy/thirdparty/pywebsocket/example/handler_map.txt: Added.
+        * Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py:
+        * Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/util.py:
+        * Scripts/webkitpy/thirdparty/pywebsocket/setup.py:
+        * Scripts/webkitpy/thirdparty/pywebsocket/test/test_util.py:
+        * Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/README: Added.
+        * Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/hello.pl: Added.
+
</ins><span class="cx"> 2010-03-09  Chris Jerdonek  &lt;cjerdonek@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         Reviewed by Shinichiro Hamaji.
</span></span></pre></div>
<a id="trunkWebKitToolsScriptsrunwebkittests"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/run-webkit-tests (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/run-webkit-tests        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/run-webkit-tests        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -1426,12 +1426,13 @@
</span><span class="cx"> 
</span><span class="cx">     my @args = (
</span><span class="cx">         &quot;WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py&quot;,
</span><del>-        &quot;-p&quot;, &quot;$webSocketPort&quot;,
-        &quot;-d&quot;, &quot;$webSocketHandlerDir&quot;,
-        &quot;-s&quot;, &quot;$webSocketHandlerScanDir&quot;,
-        &quot;-m&quot;, &quot;$webSocketHandlerMapFile&quot;,
-        &quot;-x&quot;, &quot;/websocket/tests/cookies&quot;,
-        &quot;-l&quot;, &quot;$logFile&quot;,
</del><ins>+        &quot;--server-host&quot;, &quot;127.0.0.1&quot;,
+        &quot;--port&quot;, &quot;$webSocketPort&quot;,
+        &quot;--document-root&quot;, &quot;$webSocketHandlerDir&quot;,
+        &quot;--scan-dir&quot;, &quot;$webSocketHandlerScanDir&quot;,
+        &quot;--websock-handlers-map-file&quot;, &quot;$webSocketHandlerMapFile&quot;,
+        &quot;--cgi-paths&quot;, &quot;/websocket/tests&quot;,
+        &quot;--log-file&quot;, &quot;$logFile&quot;,
</ins><span class="cx">         &quot;--strict&quot;,
</span><span class="cx">     );
</span><span class="cx">     # wss is disabled until all platforms support pyOpenSSL.
</span></span></pre></div>
<a id="trunkWebKitToolsScriptsrunwebkitwebsocketserver"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/run-webkit-websocketserver (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/run-webkit-websocketserver        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/run-webkit-websocketserver        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -71,11 +71,12 @@
</span><span class="cx"> 
</span><span class="cx">     my @args = (
</span><span class="cx">         &quot;$srcDir/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py&quot;,
</span><del>-        &quot;-p&quot;, &quot;$webSocketPort&quot;,
-        &quot;-d&quot;, &quot;$webSocketHandlerDir&quot;,
-        &quot;-s&quot;, &quot;$webSocketHandlerScanDir&quot;,
-        &quot;-m&quot;, &quot;$webSocketHandlerMapFile&quot;,
-        &quot;-x&quot;, &quot;/websocket/tests/cookies&quot;,
</del><ins>+        &quot;--server-host&quot;, &quot;127.0.0.1&quot;,
+        &quot;--port&quot;, &quot;$webSocketPort&quot;,
+        &quot;--document-root&quot;, &quot;$webSocketHandlerDir&quot;,
+        &quot;--scan-dir&quot;, &quot;$webSocketHandlerScanDir&quot;,
+        &quot;--websock-handlers-map-file&quot;, &quot;$webSocketHandlerMapFile&quot;,
+        &quot;--cgi-paths&quot;, &quot;/websocket/tests/cookies&quot;,
</ins><span class="cx">     );
</span><span class="cx"> 
</span><span class="cx">     $ENV{&quot;PYTHONPATH&quot;} = $webSocketPythonPath;
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpylayout_testsportwebsocket_serverpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/layout_tests/port/websocket_server.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -158,18 +158,19 @@
</span><span class="cx">             'standalone.py')
</span><span class="cx">         start_cmd = [
</span><span class="cx">             python_interp, pywebsocket_script,
</span><del>-            '-p', str(self._port),
-            '-d', self._layout_tests,
-            '-s', self._web_socket_tests,
-            '-x', '/websocket/tests/cookies',
-            '-l', error_log,
</del><ins>+            '--server-host', '127.0.0.1',
+            '--port', str(self._port),
+            '--document-root', self._layout_tests,
+            '--scan-dir', self._web_socket_tests,
+            '--cgi-paths', '/websocket/tests/cookies',
+            '--log-file', error_log,
</ins><span class="cx">         ]
</span><span class="cx"> 
</span><span class="cx">         handler_map_file = os.path.join(self._web_socket_tests,
</span><span class="cx">                                         'handler_map.txt')
</span><span class="cx">         if os.path.exists(handler_map_file):
</span><span class="cx">             _log.debug('Using handler_map_file: %s' % handler_map_file)
</span><del>-            start_cmd.append('-m')
</del><ins>+            start_cmd.append('--websock-handlers-map-file')
</ins><span class="cx">             start_cmd.append(handler_map_file)
</span><span class="cx">         else:
</span><span class="cx">             _log.warning('No handler_map_file found')
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsocketREADMEwebkit"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/README.webkit (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/README.webkit        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/README.webkit        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -4,10 +4,10 @@
</span><span class="cx"> http://code.google.com/p/pywebsocket/
</span><span class="cx"> 
</span><span class="cx"> This directory currently contains the following version:
</span><del>-FIXME: Fill in the current version here.
</del><ins>+0.4.9.2
</ins><span class="cx"> 
</span><span class="cx"> The following modifications have been made to this local version:
</span><del>-FIXME: Fill in local modifications.
</del><ins>+minor updates in WebSocketRequestHandler.is_cgi
</ins><span class="cx"> 
</span><span class="cx"> More information on these local modifications can be found here:
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsocketexampleecho_clientpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/echo_client.py (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/echo_client.py        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/echo_client.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -163,9 +163,11 @@
</span><span class="cx">     sys.stdout = codecs.getwriter('utf-8')(sys.stdout)
</span><span class="cx"> 
</span><span class="cx">     parser = OptionParser()
</span><del>-    parser.add_option('-s', '--server_host', dest='server_host', type='string',
</del><ins>+    parser.add_option('-s', '--server-host', '--server_host',
+                      dest='server_host', type='string',
</ins><span class="cx">                       default='localhost', help='server host')
</span><del>-    parser.add_option('-p', '--server_port', dest='server_port', type='int',
</del><ins>+    parser.add_option('-p', '--server-port', '--server_port',
+                      dest='server_port', type='int',
</ins><span class="cx">                       default=_UNDEFINED_PORT, help='server port')
</span><span class="cx">     parser.add_option('-o', '--origin', dest='origin', type='string',
</span><span class="cx">                       default='http://localhost/', help='origin')
</span><span class="lines">@@ -179,8 +181,8 @@
</span><span class="cx">                       default=True, help='suppress messages')
</span><span class="cx">     parser.add_option('-t', '--tls', dest='use_tls', action='store_true',
</span><span class="cx">                       default=False, help='use TLS (wss://)')
</span><del>-    parser.add_option('-k', '--socket_timeout', dest='socket_timeout',
-                      type='int', default=_TIMEOUT_SEC,
</del><ins>+    parser.add_option('-k', '--socket-timeout', '--socket_timeout',
+                      dest='socket_timeout', type='int', default=_TIMEOUT_SEC,
</ins><span class="cx">                       help='Timeout(sec) for sockets')
</span><span class="cx"> 
</span><span class="cx">     (options, unused_args) = parser.parse_args()
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsocketexamplehandler_maptxt"></a>
<div class="addfile"><h4>Added: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/handler_map.txt (0 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/handler_map.txt                                (rev 0)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/example/handler_map.txt        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -0,0 +1,11 @@
</span><ins>+# websocket handler map file, used by standalone.py -m option.
+# A line starting with '#' is a comment line.
+# Each line consists of 'alias_resource_path' and 'existing_resource_path'
+# separated by spaces.
+# Aliasing is processed from the top to the bottom of the line, and
+# 'existing_resource_path' must exist before it is aliased.
+# For example,
+#  / /echo
+# means that a request to '/' will be handled by handlers for '/echo'.
+/ /echo
+
</ins></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsocketmod_pywebsocketstandalonepy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/standalone.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -272,10 +272,22 @@
</span><span class="cx">     def is_cgi(self):
</span><span class="cx">         &quot;&quot;&quot;Test whether self.path corresponds to a CGI script.
</span><span class="cx"> 
</span><del>-        Add extra check that self.path doesn't contains ..&quot;&quot;&quot;
</del><ins>+        Add extra check that self.path doesn't contains ..
+        Also check if the file is a executable file or not.
+        If the file is not executable, it is handled as static file or dir
+        rather than a CGI script.
+        &quot;&quot;&quot;
</ins><span class="cx">         if CGIHTTPServer.CGIHTTPRequestHandler.is_cgi(self):
</span><span class="cx">             if '..' in self.path:
</span><span class="cx">                 return False
</span><ins>+            # strip query parameter from request path
+            resource_name = self.path.split('?', 2)[0]
+            # convert resource_name into real path name in filesystem.
+            scriptfile = self.translate_path(resource_name)
+            if not os.path.isfile(scriptfile):
+                return False
+            if not self.is_executable(scriptfile):
+                return False
</ins><span class="cx">             return True
</span><span class="cx">         return False
</span><span class="cx"> 
</span><span class="lines">@@ -321,26 +333,32 @@
</span><span class="cx"> 
</span><span class="cx"> def _main():
</span><span class="cx">     parser = optparse.OptionParser()
</span><ins>+    parser.add_option('-H', '--server-host', '--server_host',
+                      dest='server_host',
+                      default='',
+                      help='server hostname to listen to')
</ins><span class="cx">     parser.add_option('-p', '--port', dest='port', type='int',
</span><span class="cx">                       default=handshake._DEFAULT_WEB_SOCKET_PORT,
</span><span class="cx">                       help='port to listen to')
</span><del>-    parser.add_option('-w', '--websock_handlers', dest='websock_handlers',
</del><ins>+    parser.add_option('-w', '--websock-handlers', '--websock_handlers',
+                      dest='websock_handlers',
</ins><span class="cx">                       default='.',
</span><span class="cx">                       help='Web Socket handlers root directory.')
</span><del>-    parser.add_option('-m', '--websock_handlers_map_file',
</del><ins>+    parser.add_option('-m', '--websock-handlers-map-file',
+                      '--websock_handlers_map_file',
</ins><span class="cx">                       dest='websock_handlers_map_file',
</span><span class="cx">                       default=None,
</span><span class="cx">                       help=('Web Socket handlers map file. '
</span><span class="cx">                             'Each line consists of alias_resource_path and '
</span><span class="cx">                             'existing_resource_path, separated by spaces.'))
</span><del>-    parser.add_option('-s', '--scan_dir', dest='scan_dir',
</del><ins>+    parser.add_option('-s', '--scan-dir', '--scan_dir', dest='scan_dir',
</ins><span class="cx">                       default=None,
</span><span class="cx">                       help=('Web Socket handlers scan directory. '
</span><span class="cx">                             'Must be a directory under websock_handlers.'))
</span><del>-    parser.add_option('-d', '--document_root', dest='document_root',
-                      default='.',
</del><ins>+    parser.add_option('-d', '--document-root', '--document_root',
+                      dest='document_root', default='.',
</ins><span class="cx">                       help='Document root directory.')
</span><del>-    parser.add_option('-x', '--cgi_paths', dest='cgi_paths',
</del><ins>+    parser.add_option('-x', '--cgi-paths', '--cgi_paths', dest='cgi_paths',
</ins><span class="cx">                       default=None,
</span><span class="cx">                       help=('CGI paths relative to document_root.'
</span><span class="cx">                             'Comma-separated. (e.g -x /cgi,/htbin) '
</span><span class="lines">@@ -348,21 +366,22 @@
</span><span class="cx">                             'as CGI programs. Must be executable.'))
</span><span class="cx">     parser.add_option('-t', '--tls', dest='use_tls', action='store_true',
</span><span class="cx">                       default=False, help='use TLS (wss://)')
</span><del>-    parser.add_option('-k', '--private_key', dest='private_key',
</del><ins>+    parser.add_option('-k', '--private-key', '--private_key',
+                      dest='private_key',
</ins><span class="cx">                       default='', help='TLS private key file.')
</span><span class="cx">     parser.add_option('-c', '--certificate', dest='certificate',
</span><span class="cx">                       default='', help='TLS certificate file.')
</span><del>-    parser.add_option('-l', '--log_file', dest='log_file',
</del><ins>+    parser.add_option('-l', '--log-file', '--log_file', dest='log_file',
</ins><span class="cx">                       default='', help='Log file.')
</span><del>-    parser.add_option('--log_level', type='choice', dest='log_level',
-                      default='warn',
</del><ins>+    parser.add_option('--log-level', '--log_level', type='choice',
+                      dest='log_level', default='warn',
</ins><span class="cx">                       choices=['debug', 'info', 'warn', 'error', 'critical'],
</span><span class="cx">                       help='Log level.')
</span><del>-    parser.add_option('--log_max', dest='log_max', type='int',
</del><ins>+    parser.add_option('--log-max', '--log_max', dest='log_max', type='int',
</ins><span class="cx">                       default=_DEFAULT_LOG_MAX_BYTES,
</span><span class="cx">                       help='Log maximum bytes')
</span><del>-    parser.add_option('--log_count', dest='log_count', type='int',
-                      default=_DEFAULT_LOG_BACKUP_COUNT,
</del><ins>+    parser.add_option('--log-count', '--log_count', dest='log_count',
+                      type='int', default=_DEFAULT_LOG_BACKUP_COUNT,
</ins><span class="cx">                       help='Log backup count')
</span><span class="cx">     parser.add_option('--strict', dest='strict', action='store_true',
</span><span class="cx">                       default=False, help='Strictly check handshake request')
</span><span class="lines">@@ -381,6 +400,18 @@
</span><span class="cx">     if options.cgi_paths:
</span><span class="cx">         CGIHTTPServer.CGIHTTPRequestHandler.cgi_directories = \
</span><span class="cx">             options.cgi_paths.split(',')
</span><ins>+        if sys.platform in ('cygwin', 'win32'):
+            cygwin_path = None
+            # For Win32 Python, it is expected that CYGWIN_PATH
+            # is set to a directory of cygwin binaries.
+            # For example, websocket_server.py in Chromium sets CYGWIN_PATH to
+            # full path of third_party/cygwin/bin.
+            if 'CYGWIN_PATH' in os.environ:
+                cygwin_path = os.environ['CYGWIN_PATH']
+            util.wrap_popen3_for_win(cygwin_path)
+            def __check_script(scriptpath):
+                return util.get_script_interp(scriptpath, cygwin_path)
+            CGIHTTPServer.executable = __check_script
</ins><span class="cx"> 
</span><span class="cx">     if options.use_tls:
</span><span class="cx">         if not _HAS_OPEN_SSL:
</span><span class="lines">@@ -407,7 +438,8 @@
</span><span class="cx">         WebSocketRequestHandler.options = options
</span><span class="cx">         WebSocketServer.options = options
</span><span class="cx"> 
</span><del>-        server = WebSocketServer(('', options.port), WebSocketRequestHandler)
</del><ins>+        server = WebSocketServer((options.server_host, options.port),
+                                 WebSocketRequestHandler)
</ins><span class="cx">         server.serve_forever()
</span><span class="cx">     except Exception, e:
</span><span class="cx">         logging.critical(str(e))
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsocketmod_pywebsocketutilpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/util.py (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/util.py        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/mod_pywebsocket/util.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -33,6 +33,8 @@
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="cx"> import StringIO
</span><ins>+import os
+import re
</ins><span class="cx"> import traceback
</span><span class="cx"> 
</span><span class="cx"> 
</span><span class="lines">@@ -56,4 +58,64 @@
</span><span class="cx">     return
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+def __translate_interp(interp, cygwin_path):
+    &quot;&quot;&quot;Translate interp program path for Win32 python to run cygwin program
+    (e.g. perl).  Note that it doesn't support path that contains space,
+    which is typically true for Unix, where #!-script is written.
+    For Win32 python, cygwin_path is a directory of cygwin binaries.
+
+    Args:
+      interp: interp command line
+      cygwin_path: directory name of cygwin binary, or None
+    Returns:
+      translated interp command line.
+    &quot;&quot;&quot;
+    if not cygwin_path:
+        return interp
+    m = re.match(&quot;^[^ ]*/([^ ]+)( .*)?&quot;, interp)
+    if m:
+        cmd = os.path.join(cygwin_path, m.group(1))
+        return cmd + m.group(2)
+    return interp
+
+
+def get_script_interp(script_path, cygwin_path=None):
+    &quot;&quot;&quot;Gets #!-interpreter command line from the script.
+
+    It also fixes command path.  When Cygwin Python is used, e.g. in WebKit,
+    it could run &quot;/usr/bin/perl -wT hello.pl&quot;.
+    When Win32 Python is used, e.g. in Chromium, it couldn't.  So, fix
+    &quot;/usr/bin/perl&quot; to &quot;&lt;cygwin_path&gt;\perl.exe&quot;.
+
+    Args:
+      script_path: pathname of the script
+      cygwin_path: directory name of cygwin binary, or None
+    Returns:
+      #!-interpreter command line, or None if it is not #!-script.
+    &quot;&quot;&quot;
+    fp = open(script_path)
+    line = fp.readline()
+    fp.close()
+    m = re.match(&quot;^#!(.*)&quot;, line)
+    if m:
+        return __translate_interp(m.group(1), cygwin_path)
+    return None
+
+def wrap_popen3_for_win(cygwin_path):
+    &quot;&quot;&quot;Wrap popen3 to support #!-script on Windows.
+
+    Args:
+      cygwin_path:  path for cygwin binary if command path is needed to be
+                    translated.  None if no translation required.
+    &quot;&quot;&quot;
+    __orig_popen3 = os.popen3
+    def __wrap_popen3(cmd, mode='t', bufsize=-1):
+        cmdline = cmd.split(' ')
+        interp = get_script_interp(cmdline[0], cygwin_path)
+        if interp:
+            cmd = interp + &quot; &quot; + cmd
+        return __orig_popen3(cmd, mode, bufsize)
+    os.popen3 = __wrap_popen3
+
+
</ins><span class="cx"> # vi:sts=4 sw=4 et
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsocketsetuppy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/setup.py (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/setup.py        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/setup.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx">       name=_PACKAGE_NAME,
</span><span class="cx">       packages=[_PACKAGE_NAME],
</span><span class="cx">       url='http://code.google.com/p/pywebsocket/',
</span><del>-      version='0.4.8',
</del><ins>+      version='0.4.9.2',
</ins><span class="cx">       )
</span><span class="cx"> 
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsockettesttest_utilpy"></a>
<div class="modfile"><h4>Modified: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/test_util.py (55718 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/test_util.py        2010-03-09 09:36:06 UTC (rev 55718)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/test_util.py        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -33,11 +33,14 @@
</span><span class="cx"> &quot;&quot;&quot;Tests for util module.&quot;&quot;&quot;
</span><span class="cx"> 
</span><span class="cx"> 
</span><ins>+import os
+import sys
</ins><span class="cx"> import unittest
</span><span class="cx"> 
</span><span class="cx"> import config  # This must be imported before mod_pywebsocket.
</span><span class="cx"> from mod_pywebsocket import util
</span><span class="cx"> 
</span><ins>+_TEST_DATA_DIR = os.path.join(os.path.split(__file__)[0], 'testdata')
</ins><span class="cx"> 
</span><span class="cx"> class UtilTest(unittest.TestCase):
</span><span class="cx">     def test_get_stack_trace(self):
</span><span class="lines">@@ -55,7 +58,19 @@
</span><span class="cx">         util.prepend_message_to_exception('Hello ', exc)
</span><span class="cx">         self.assertEqual('Hello World', str(exc))
</span><span class="cx"> 
</span><ins>+    def test_get_script_interp(self):
+        cygwin_path = 'c:\\cygwin\\bin'
+        cygwin_perl = os.path.join(cygwin_path, 'perl')
+        self.assertEqual(None, util.get_script_interp(
+            os.path.join(_TEST_DATA_DIR, 'README')))
+        self.assertEqual(None, util.get_script_interp(
+            os.path.join(_TEST_DATA_DIR, 'README'), cygwin_path))
+        self.assertEqual('/usr/bin/perl -wT', util.get_script_interp(
+            os.path.join(_TEST_DATA_DIR, 'hello.pl')))
+        self.assertEqual(cygwin_perl + ' -wT', util.get_script_interp(
+            os.path.join(_TEST_DATA_DIR, 'hello.pl'), cygwin_path))
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> if __name__ == '__main__':
</span><span class="cx">     unittest.main()
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsockettesttestdataREADME"></a>
<div class="addfile"><h4>Added: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/README (0 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/README                                (rev 0)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/README        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+Test data directory
</ins></span></pre></div>
<a id="trunkWebKitToolsScriptswebkitpythirdpartypywebsockettesttestdatahellopl"></a>
<div class="addfile"><h4>Added: trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/hello.pl (0 => 55719)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/hello.pl                                (rev 0)
+++ trunk/WebKitTools/Scripts/webkitpy/thirdparty/pywebsocket/test/testdata/hello.pl        2010-03-09 10:40:49 UTC (rev 55719)
</span><span class="lines">@@ -0,0 +1,2 @@
</span><ins>+#!/usr/bin/perl -wT
+print &quot;Hello\n&quot;;
</ins></span></pre>
</div>
</div>

</body>
</html>