升级Tomcat版本 apache-tomcat-7.0.77
diff --git a/tomcat-uid/webapps/examples/websocket-deprecated/chat.html b/tomcat-uid/webapps/examples/websocket-deprecated/chat.html
new file mode 100644
index 0000000..9c49d63
--- /dev/null
+++ b/tomcat-uid/webapps/examples/websocket-deprecated/chat.html
@@ -0,0 +1,125 @@
+<!--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+  contributor license agreements.  See the NOTICE file distributed with

+  this work for additional information regarding copyright ownership.

+  The ASF licenses this file to You under the Apache License, Version 2.0

+  (the "License"); you may not use this file except in compliance with

+  the License.  You may obtain a copy of the License at

+

+      http://www.apache.org/licenses/LICENSE-2.0

+

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+-->

+<!DOCTYPE html>

+<html>

+<head>

+    <title>Apache Tomcat WebSocket Examples: Chat</title>

+    <style type="text/css">

+        input#chat {

+            width: 410px

+        }

+

+        #console-container {

+            width: 400px;

+        }

+

+        #console {

+            border: 1px solid #CCCCCC;

+            border-right-color: #999999;

+            border-bottom-color: #999999;

+            height: 170px;

+            overflow-y: scroll;

+            padding: 5px;

+            width: 100%;

+        }

+

+        #console p {

+            padding: 0;

+            margin: 0;

+        }

+    </style>

+    <script type="text/javascript">

+        var Chat = {};

+

+        Chat.socket = null;

+

+        Chat.connect = (function(host) {

+            if ('WebSocket' in window) {

+                Chat.socket = new WebSocket(host);

+            } else if ('MozWebSocket' in window) {

+                Chat.socket = new MozWebSocket(host);

+            } else {

+                Console.log('Error: WebSocket is not supported by this browser.');

+                return;

+            }

+

+            Chat.socket.onopen = function () {

+                Console.log('Info: WebSocket connection opened.');

+                document.getElementById('chat').onkeydown = function(event) {

+                    if (event.keyCode == 13) {

+                        Chat.sendMessage();

+                    }

+                };

+            };

+

+            Chat.socket.onclose = function () {

+                document.getElementById('chat').onkeydown = null;

+                Console.log('Info: WebSocket closed.');

+            };

+

+            Chat.socket.onmessage = function (message) {

+                Console.log(message.data);

+            };

+        });

+

+        Chat.initialize = function() {

+            if (window.location.protocol == 'http:') {

+                Chat.connect('ws://' + window.location.host + '/examples/websocket/tc7/chat');

+            } else {

+                Chat.connect('wss://' + window.location.host + '/examples/websocket/tc7/chat');

+            }

+        };

+

+        Chat.sendMessage = (function() {

+            var message = document.getElementById('chat').value;

+            if (message != '') {

+                Chat.socket.send(message);

+                document.getElementById('chat').value = '';

+            }

+        });

+

+        var Console = {};

+

+        Console.log = (function(message) {

+            var console = document.getElementById('console');

+            var p = document.createElement('p');

+            p.style.wordWrap = 'break-word';

+            p.innerHTML = message;

+            console.appendChild(p);

+            while (console.childNodes.length > 25) {

+                console.removeChild(console.firstChild);

+            }

+            console.scrollTop = console.scrollHeight;

+        });

+

+        Chat.initialize();

+

+    </script>

+</head>

+<body>

+<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable

+    Javascript and reload this page!</h2></noscript>

+<div>

+    <p>

+        <input type="text" placeholder="type and press enter to chat" id="chat">

+    </p>

+    <div id="console-container">

+        <div id="console"></div>

+    </div>

+</div>

+</body>

+</html>
\ No newline at end of file
diff --git a/tomcat-uid/webapps/examples/websocket-deprecated/echo.html b/tomcat-uid/webapps/examples/websocket-deprecated/echo.html
new file mode 100644
index 0000000..51b61a5
--- /dev/null
+++ b/tomcat-uid/webapps/examples/websocket-deprecated/echo.html
@@ -0,0 +1,160 @@
+<!--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+  contributor license agreements.  See the NOTICE file distributed with

+  this work for additional information regarding copyright ownership.

+  The ASF licenses this file to You under the Apache License, Version 2.0

+  (the "License"); you may not use this file except in compliance with

+  the License.  You may obtain a copy of the License at

+

+      http://www.apache.org/licenses/LICENSE-2.0

+

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+-->

+<!DOCTYPE html>

+<html>

+<head>

+    <title>Apache Tomcat WebSocket Examples: Echo</title>

+    <style type="text/css">

+        #connect-container {

+            float: left;

+            width: 400px

+        }

+

+        #connect-container div {

+            padding: 5px;

+        }

+

+        #console-container {

+            float: left;

+            margin-left: 15px;

+            width: 400px;

+        }

+

+        #console {

+            border: 1px solid #CCCCCC;

+            border-right-color: #999999;

+            border-bottom-color: #999999;

+            height: 170px;

+            overflow-y: scroll;

+            padding: 5px;

+            width: 100%;

+        }

+

+        #console p {

+            padding: 0;

+            margin: 0;

+        }

+    </style>

+    <script type="text/javascript">

+        var ws = null;

+

+        function setConnected(connected) {

+            document.getElementById('connect').disabled = connected;

+            document.getElementById('disconnect').disabled = !connected;

+            document.getElementById('echo').disabled = !connected;

+        }

+

+        function connect() {

+            var target = document.getElementById('target').value;

+            if (target == '') {

+                alert('Please select server side connection implementation.');

+                return;

+            }

+            if ('WebSocket' in window) {

+                ws = new WebSocket(target);

+            } else if ('MozWebSocket' in window) {

+                ws = new MozWebSocket(target);

+            } else {

+                alert('WebSocket is not supported by this browser.');

+                return;

+            }

+            ws.onopen = function () {

+                setConnected(true);

+                log('Info: WebSocket connection opened.');

+            };

+            ws.onmessage = function (event) {

+                log('Received: ' + event.data);

+            };

+            ws.onclose = function () {

+                setConnected(false);

+                log('Info: WebSocket connection closed.');

+            };

+        }

+

+        function disconnect() {

+            if (ws != null) {

+                ws.close();

+                ws = null;

+            }

+            setConnected(false);

+        }

+

+        function echo() {

+            if (ws != null) {

+                var message = document.getElementById('message').value;

+                log('Sent: ' + message);

+                ws.send(message);

+            } else {

+                alert('WebSocket connection not established, please connect.');

+            }

+        }

+

+        function updateTarget(target) {

+            if (window.location.protocol == 'http:') {

+                document.getElementById('target').value = 'ws://' + window.location.host + target;

+            } else {

+                document.getElementById('target').value = 'wss://' + window.location.host + target;

+            }

+        }

+

+        function log(message) {

+            var console = document.getElementById('console');

+            var p = document.createElement('p');

+            p.style.wordWrap = 'break-word';

+            p.appendChild(document.createTextNode(message));

+            console.appendChild(p);

+            while (console.childNodes.length > 25) {

+                console.removeChild(console.firstChild);

+            }

+            console.scrollTop = console.scrollHeight;

+        }

+    </script>

+</head>

+<body>

+<noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable

+    Javascript and reload this page!</h2></noscript>

+<div>

+    <div id="connect-container">

+        <div>

+            <span>Connect using:</span>

+            <!-- echo example using streams on the server side -->

+            <input id="radio1" type="radio" name="group1" value="/examples/websocket/tc7/echoStream"

+                   onclick="updateTarget(this.value);"> <label for="radio1">streams</label>

+            <!-- echo example using messages on the server side -->

+            <input id="radio2" type="radio" name="group1" value="/examples/websocket/tc7/echoMessage"

+                   onclick="updateTarget(this.value);"> <label for="radio2">messages</label>

+        </div>

+        <div>

+            <input id="target" type="text" size="40" style="width: 350px"/>

+        </div>

+        <div>

+            <button id="connect" onclick="connect();">Connect</button>

+            <button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>

+        </div>

+        <div>

+            <textarea id="message" style="width: 350px">Here is a message!</textarea>

+        </div>

+        <div>

+            <button id="echo" onclick="echo();" disabled="disabled">Echo message</button>

+        </div>

+    </div>

+    <div id="console-container">

+        <div id="console"></div>

+    </div>

+</div>

+</body>

+</html>
\ No newline at end of file
diff --git a/tomcat-uid/webapps/examples/websocket-deprecated/index.html b/tomcat-uid/webapps/examples/websocket-deprecated/index.html
new file mode 100644
index 0000000..6f076e3
--- /dev/null
+++ b/tomcat-uid/webapps/examples/websocket-deprecated/index.html
@@ -0,0 +1,33 @@
+<!--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+  contributor license agreements.  See the NOTICE file distributed with

+  this work for additional information regarding copyright ownership.

+  The ASF licenses this file to You under the Apache License, Version 2.0

+  (the "License"); you may not use this file except in compliance with

+  the License.  You may obtain a copy of the License at

+

+      http://www.apache.org/licenses/LICENSE-2.0

+

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+-->

+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

+<html>

+<head>

+    <meta http-equiv=Content-Type content="text/html">

+    <title>Apache Tomcat Deprecated WebSocket Examples</title>

+</head>

+<body>

+<h3>Apache Tomcat Deprecated WebSocket Examples</h3>

+<ul>

+    <li><a href="echo.html">Echo example</a></li>

+    <li><a href="chat.html">Chat example</a></li>

+    <li><a href="snake.html">Multiplayer snake example</a></li>

+</ul>

+<p>This API has been deprecated. The examples are also available using the JSR

+   356 <a href="../websocket/index.xhtml">Java WebSocket 1.1 API</a>.</p> 

+</body>

+</html>
\ No newline at end of file
diff --git a/tomcat-uid/webapps/examples/websocket-deprecated/snake.html b/tomcat-uid/webapps/examples/websocket-deprecated/snake.html
new file mode 100644
index 0000000..d52149e
--- /dev/null
+++ b/tomcat-uid/webapps/examples/websocket-deprecated/snake.html
@@ -0,0 +1,258 @@
+<!--

+  Licensed to the Apache Software Foundation (ASF) under one or more

+  contributor license agreements.  See the NOTICE file distributed with

+  this work for additional information regarding copyright ownership.

+  The ASF licenses this file to You under the Apache License, Version 2.0

+  (the "License"); you may not use this file except in compliance with

+  the License.  You may obtain a copy of the License at

+

+      http://www.apache.org/licenses/LICENSE-2.0

+

+  Unless required by applicable law or agreed to in writing, software

+  distributed under the License is distributed on an "AS IS" BASIS,

+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

+  See the License for the specific language governing permissions and

+  limitations under the License.

+-->

+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">

+<head>

+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>

+    <title>Apache Tomcat WebSocket Examples: Multiplayer Snake</title>

+    <style type="text/css">

+        #playground {

+            width: 640px;

+            height: 480px;

+            background-color: #000;

+        }

+

+        #console-container {

+            float: left;

+            margin-left: 15px;

+            width: 300px;

+        }

+

+        #console {

+            border: 1px solid #CCCCCC;

+            border-right-color: #999999;

+            border-bottom-color: #999999;

+            height: 480px;

+            overflow-y: scroll;

+            padding-left: 5px;

+            padding-right: 5px;

+            width: 100%;

+        }

+

+        #console p {

+            padding: 0;

+            margin: 0;

+        }

+    </style>

+</head>

+<body>

+    <noscript><h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websockets rely on Javascript being enabled. Please enable

+    Javascript and reload this page!</h2></noscript>

+    <div style="float: left">

+        <canvas id="playground" width="640" height="480"></canvas>

+    </div>

+    <div id="console-container">

+        <div id="console"></div>

+    </div>

+    <script type="text/javascript">

+

+        var Game = {};

+

+        Game.fps = 30;

+        Game.socket = null;

+        Game.nextFrame = null;

+        Game.interval = null;

+        Game.direction = 'none';

+        Game.gridSize = 10;

+

+        function Snake() {

+            this.snakeBody = [];

+            this.color = null;

+        }

+

+        Snake.prototype.draw = function(context) {

+            for (var id in this.snakeBody) {

+                context.fillStyle = this.color;

+                context.fillRect(this.snakeBody[id].x, this.snakeBody[id].y, Game.gridSize, Game.gridSize);

+            }

+        };

+

+        Game.initialize = function() {

+            this.entities = [];

+            canvas = document.getElementById('playground');

+            if (!canvas.getContext) {

+                Console.log('Error: 2d canvas not supported by this browser.');

+                return;

+            }

+            this.context = canvas.getContext('2d');

+            window.addEventListener('keydown', function (e) {

+                var code = e.keyCode;

+                if (code > 36 && code < 41) {

+                    switch (code) {

+                        case 37:

+                            if (Game.direction != 'east') Game.setDirection('west');

+                            break;

+                        case 38:

+                            if (Game.direction != 'south') Game.setDirection('north');

+                            break;

+                        case 39:

+                            if (Game.direction != 'west') Game.setDirection('east');

+                            break;

+                        case 40:

+                            if (Game.direction != 'north') Game.setDirection('south');

+                            break;

+                    }

+                }

+            }, false);

+            if (window.location.protocol == 'http:') {

+                Game.connect('ws://' + window.location.host + '/examples/websocket/tc7/snake');

+            } else {

+                Game.connect('wss://' + window.location.host + '/examples/websocket/tc7/snake');

+            }

+        };

+

+        Game.setDirection  = function(direction) {

+            Game.direction = direction;

+            Game.socket.send(direction);

+            Console.log('Sent: Direction ' + direction);

+        };

+

+        Game.startGameLoop = function() {

+            if (window.webkitRequestAnimationFrame) {

+                Game.nextFrame = function () {

+                    webkitRequestAnimationFrame(Game.run);

+                };

+            } else if (window.mozRequestAnimationFrame) {

+                Game.nextFrame = function () {

+                    mozRequestAnimationFrame(Game.run);

+                };

+            } else {

+                Game.interval = setInterval(Game.run, 1000 / Game.fps);

+            }

+            if (Game.nextFrame != null) {

+                Game.nextFrame();

+            }

+        };

+

+        Game.stopGameLoop = function () {

+            Game.nextFrame = null;

+            if (Game.interval != null) {

+                clearInterval(Game.interval);

+            }

+        };

+

+        Game.draw = function() {

+            this.context.clearRect(0, 0, 640, 480);

+            for (var id in this.entities) {

+                this.entities[id].draw(this.context);

+            }

+        };

+

+        Game.addSnake = function(id, color) {

+            Game.entities[id] = new Snake();

+            Game.entities[id].color = color;

+        };

+

+        Game.updateSnake = function(id, snakeBody) {

+            if (typeof Game.entities[id] != "undefined") {

+                Game.entities[id].snakeBody = snakeBody;

+            }

+        };

+

+        Game.removeSnake = function(id) {

+            Game.entities[id] = null;

+            // Force GC.

+            delete Game.entities[id];

+        };

+

+        Game.run = (function() {

+            var skipTicks = 1000 / Game.fps, nextGameTick = (new Date).getTime();

+

+            return function() {

+                while ((new Date).getTime() > nextGameTick) {

+                    nextGameTick += skipTicks;

+                }

+                Game.draw();

+                if (Game.nextFrame != null) {

+                    Game.nextFrame();

+                }

+            };

+        })();

+

+        Game.connect = (function(host) {

+            if ('WebSocket' in window) {

+                Game.socket = new WebSocket(host);

+            } else if ('MozWebSocket' in window) {

+                Game.socket = new MozWebSocket(host);

+            } else {

+                Console.log('Error: WebSocket is not supported by this browser.');

+                return;

+            }

+

+            Game.socket.onopen = function () {

+                // Socket open.. start the game loop.

+                Console.log('Info: WebSocket connection opened.');

+                Console.log('Info: Press an arrow key to begin.');

+                Game.startGameLoop();

+                setInterval(function() {

+                    // Prevent server read timeout.

+                    Game.socket.send('ping');

+                }, 5000);

+            };

+

+            Game.socket.onclose = function () {

+                Console.log('Info: WebSocket closed.');

+                Game.stopGameLoop();

+            };

+

+            Game.socket.onmessage = function (message) {

+                // _Potential_ security hole, consider using json lib to parse data in production.

+                var packet = eval('(' + message.data + ')');

+                switch (packet.type) {

+                    case 'update':

+                        for (var i = 0; i < packet.data.length; i++) {

+                            Game.updateSnake(packet.data[i].id, packet.data[i].body);

+                        }

+                        break;

+                    case 'join':

+                        for (var j = 0; j < packet.data.length; j++) {

+                            Game.addSnake(packet.data[j].id, packet.data[j].color);

+                        }

+                        break;

+                    case 'leave':

+                        Game.removeSnake(packet.id);

+                        break;

+                    case 'dead':

+                        Console.log('Info: Your snake is dead, bad luck!');

+                        Game.direction = 'none';

+                        break;

+                    case 'kill':

+                        Console.log('Info: Head shot!');

+                        break;

+                }

+            };

+        });

+

+        var Console = {};

+

+        Console.log = (function(message) {

+            var console = document.getElementById('console');

+            var p = document.createElement('p');

+            p.style.wordWrap = 'break-word';

+            p.innerHTML = message;

+            console.appendChild(p);

+            while (console.childNodes.length > 25) {

+                console.removeChild(console.firstChild);

+            }

+            console.scrollTop = console.scrollHeight;

+        });

+

+        Game.initialize();

+    </script>

+</body>

+</html>