12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#!/usr/bin/env python
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2011, Google Inc.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# All rights reserved.
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Redistribution and use in source and binary forms, with or without
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# modification, are permitted provided that the following conditions are
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# met:
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#     * Redistributions of source code must retain the above copyright
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# notice, this list of conditions and the following disclaimer.
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#     * Redistributions in binary form must reproduce the above
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# copyright notice, this list of conditions and the following disclaimer
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# in the documentation and/or other materials provided with the
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distribution.
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#     * Neither the name of Google Inc. nor the names of its
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# contributors may be used to endorse or promote products derived from
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# this software without specific prior written permission.
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis"""Tests for handshake module."""
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport unittest
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport set_sys_path  # Update sys.path to locate mod_pywebsocket module.
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom mod_pywebsocket.handshake import draft75 as handshake
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom test import mock
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_REQUEST = (
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    80,
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '/demo',
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    {
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade': 'WebSocket',
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection': 'Upgrade',
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host': 'example.com',
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin': 'http://example.com',
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'WebSocket-Protocol': 'sample',
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    })
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_RESPONSE_DEFAULT_PORT = (
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'HTTP/1.1 101 Web Socket Protocol Handshake\r\n'
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Upgrade: WebSocket\r\n'
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Connection: Upgrade\r\n'
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Origin: http://example.com\r\n'
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Location: ws://example.com/demo\r\n'
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Protocol: sample\r\n'
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '\r\n')
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_RESPONSE_SECURE = (
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'HTTP/1.1 101 Web Socket Protocol Handshake\r\n'
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Upgrade: WebSocket\r\n'
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Connection: Upgrade\r\n'
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Origin: http://example.com\r\n'
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Location: wss://example.com/demo\r\n'
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Protocol: sample\r\n'
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '\r\n')
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_REQUEST_NONDEFAULT_PORT = (
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    8081,
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '/demo',
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    {
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade': 'WebSocket',
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection': 'Upgrade',
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host': 'example.com:8081',
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin': 'http://example.com',
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'WebSocket-Protocol': 'sample',
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    })
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_RESPONSE_NONDEFAULT_PORT = (
852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'HTTP/1.1 101 Web Socket Protocol Handshake\r\n'
862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Upgrade: WebSocket\r\n'
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Connection: Upgrade\r\n'
882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Origin: http://example.com\r\n'
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Location: ws://example.com:8081/demo\r\n'
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Protocol: sample\r\n'
912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '\r\n')
922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_RESPONSE_SECURE_NONDEF = (
942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'HTTP/1.1 101 Web Socket Protocol Handshake\r\n'
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Upgrade: WebSocket\r\n'
962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Connection: Upgrade\r\n'
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Origin: http://example.com\r\n'
982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Location: wss://example.com:8081/demo\r\n'
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Protocol: sample\r\n'
1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '\r\n')
1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_REQUEST_NO_PROTOCOL = (
1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    80,
1042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '/demo',
1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    {
1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade': 'WebSocket',
1072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection': 'Upgrade',
1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host': 'example.com',
1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin': 'http://example.com',
1102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    })
1112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_RESPONSE_NO_PROTOCOL = (
1132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'HTTP/1.1 101 Web Socket Protocol Handshake\r\n'
1142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Upgrade: WebSocket\r\n'
1152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'Connection: Upgrade\r\n'
1162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Origin: http://example.com\r\n'
1172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    'WebSocket-Location: ws://example.com/demo\r\n'
1182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '\r\n')
1192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_GOOD_REQUEST_WITH_OPTIONAL_HEADERS = (
1212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    80,
1222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    '/demo',
1232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    {
1242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade': 'WebSocket',
1252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection': 'Upgrade',
1262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host': 'example.com',
1272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin': 'http://example.com',
1282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'WebSocket-Protocol': 'sample',
1292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'AKey': 'AValue',
1302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'EmptyValue': '',
1312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    })
1322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_BAD_REQUESTS = (
1342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # HTTP request
1352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        80,
1362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
1372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
1382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'www.google.com',
1392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'User-Agent': 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5;'
1402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                          ' en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3'
1412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                          ' GTB6 GTBA',
1422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,'
1432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                      '*/*;q=0.8',
1442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Accept-Language': 'en-us,en;q=0.5',
1452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Accept-Encoding': 'gzip,deflate',
1462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
1472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Keep-Alive': '300',
1482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'keep-alive',
1492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }),
1502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Missing Upgrade
1512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        80,
1522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
1532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
1542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'Upgrade',
1552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'example.com',
1562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Origin': 'http://example.com',
1572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'WebSocket-Protocol': 'sample',
1582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }),
1592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Wrong Upgrade
1602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        80,
1612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
1622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
1632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Upgrade': 'NonWebSocket',
1642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'Upgrade',
1652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'example.com',
1662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Origin': 'http://example.com',
1672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'WebSocket-Protocol': 'sample',
1682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }),
1692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Empty WebSocket-Protocol
1702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        80,
1712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
1722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
1732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Upgrade': 'WebSocket',
1742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'Upgrade',
1752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'example.com',
1762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Origin': 'http://example.com',
1772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'WebSocket-Protocol': '',
1782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }),
1792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Wrong port number format
1802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        80,
1812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
1822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
1832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Upgrade': 'WebSocket',
1842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'Upgrade',
1852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'example.com:0x50',
1862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Origin': 'http://example.com',
1872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'WebSocket-Protocol': 'sample',
1882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }),
1892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Header/connection port mismatch
1902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        8080,
1912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
1922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
1932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Upgrade': 'WebSocket',
1942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'Upgrade',
1952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'example.com',
1962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Origin': 'http://example.com',
1972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'WebSocket-Protocol': 'sample',
1982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }),
1992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Illegal WebSocket-Protocol
2002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        80,
2012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '/demo',
2022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        {
2032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Upgrade': 'WebSocket',
2042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Connection': 'Upgrade',
2052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Host': 'example.com',
2062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'Origin': 'http://example.com',
2072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            'WebSocket-Protocol': 'illegal\x09protocol',
2082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }))
2092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_STRICTLY_GOOD_REQUESTS = (
2112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (
2122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # WebSocket-Protocol
2202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'WebSocket-Protocol: sample\r\n',
2262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # WebSocket-Protocol and Cookie
2292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'WebSocket-Protocol: sample\r\n',
2352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie: xyz\r\n'
2362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Cookie
2392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie: abc/xyz\r\n'
2452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie2: $Version=1\r\n'
2462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie: abc\r\n'
2472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (
2502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET / HTTP/1.1\r\n',
2512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis)
2582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis_NOT_STRICTLY_GOOD_REQUESTS = (
2602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Extra space after GET
2612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET  /demo HTTP/1.1\r\n',
2622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Resource name doesn't stat with '/'
2692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET demo HTTP/1.1\r\n',
2702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # No space after :
2772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade:WebSocket\r\n',
2792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Lower case Upgrade header
2852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'upgrade: WebSocket\r\n',
2872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
2922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Connection comes before Upgrade
2932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
2942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
2952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
2962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
2972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
2982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
2992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Origin comes before Host
3012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
3062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Host continued to the next line
3092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example\r\n',
3132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        ' .com\r\n',
3142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ( # Cookie comes before WebSocket-Protocol
3182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
3222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie: xyz\r\n'
3242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'WebSocket-Protocol: sample\r\n',
3252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Unknown header
3282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
3322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Content-Type: text/html\r\n'
3342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Cookie with continuation lines
3372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
3412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie: xyz\r\n',
3432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        ' abc\r\n',
3442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        ' defg\r\n',
3452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Wrong-case cookie
3482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
3522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'cookie: abc/xyz\r\n'
3542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    (  # Cookie, no space after colon
3572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'GET /demo HTTP/1.1\r\n',
3582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Upgrade: WebSocket\r\n',
3592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Connection: Upgrade\r\n',
3602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Host: example.com\r\n',
3612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Origin: http://example.com\r\n',
3622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        'Cookie:abc/xyz\r\n'
3632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        '\r\n',
3642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    ),
3652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis)
3662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3682da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef _create_request(request_def):
3692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    conn = mock.MockConn('')
3702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    conn.local_addr = ('0.0.0.0', request_def[0])
3712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return mock.MockRequest(
3722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            uri=request_def[1],
3732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            headers_in=request_def[2],
3742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            connection=conn)
3752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3772da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef _create_get_memorized_lines(lines):
3782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """Creates a function that returns the given string."""
3792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def get_memorized_lines():
3812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        return lines
3822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return get_memorized_lines
3832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3852da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef _create_requests_with_lines(request_lines_set):
3862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    requests = []
3872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    for lines in request_lines_set:
3882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST)
3892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request.connection.get_memorized_lines = _create_get_memorized_lines(
3902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                lines)
3912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        requests.append(request)
3922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return requests
3932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3942da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3952da489cd246702bee5938545b18a6f710ed214bcJamie Gennisclass HandshakerTest(unittest.TestCase):
3962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    """A unittest for draft75 module."""
3972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
3982da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_good_request_default_port(self):
3992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST)
4002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker = handshake.Handshaker(request,
4012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                          mock.MockDispatcher())
4022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker.do_handshake()
4032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual(_GOOD_RESPONSE_DEFAULT_PORT,
4042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.connection.written_data())
4052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('/demo', request.ws_resource)
4062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('http://example.com', request.ws_origin)
4072da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('ws://example.com/demo', request.ws_location)
4082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('sample', request.ws_protocol)
4092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_good_request_secure_default_port(self):
4112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST)
4122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request.connection.local_addr = ('0.0.0.0', 443)
4132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request.is_https_ = True
4142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker = handshake.Handshaker(request,
4152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                          mock.MockDispatcher())
4162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker.do_handshake()
4172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual(_GOOD_RESPONSE_SECURE,
4182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.connection.written_data())
4192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('sample', request.ws_protocol)
4202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_good_request_nondefault_port(self):
4222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST_NONDEFAULT_PORT)
4232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker = handshake.Handshaker(request,
4242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                          mock.MockDispatcher())
4252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker.do_handshake()
4262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual(_GOOD_RESPONSE_NONDEFAULT_PORT,
4272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.connection.written_data())
4282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('sample', request.ws_protocol)
4292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_good_request_secure_non_default_port(self):
4312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST_NONDEFAULT_PORT)
4322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request.is_https_ = True
4332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker = handshake.Handshaker(request,
4342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                          mock.MockDispatcher())
4352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker.do_handshake()
4362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual(_GOOD_RESPONSE_SECURE_NONDEF,
4372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.connection.written_data())
4382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('sample', request.ws_protocol)
4392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_good_request_default_no_protocol(self):
4412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST_NO_PROTOCOL)
4422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker = handshake.Handshaker(request,
4432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                          mock.MockDispatcher())
4442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker.do_handshake()
4452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual(_GOOD_RESPONSE_NO_PROTOCOL,
4462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.connection.written_data())
4472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual(None, request.ws_protocol)
4482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_good_request_optional_headers(self):
4502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request = _create_request(_GOOD_REQUEST_WITH_OPTIONAL_HEADERS)
4512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker = handshake.Handshaker(request,
4522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                          mock.MockDispatcher())
4532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        handshaker.do_handshake()
4542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('AValue',
4552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.headers_in['AKey'])
4562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        self.assertEqual('',
4572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                         request.headers_in['EmptyValue'])
4582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_bad_requests(self):
4602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for request in map(_create_request, _BAD_REQUESTS):
4612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            handshaker = handshake.Handshaker(request,
4622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                              mock.MockDispatcher())
4632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            self.assertRaises(
4642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                handshake.HandshakeException, handshaker.do_handshake)
4652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_strictly_good_requests(self):
4672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for request in _create_requests_with_lines(_STRICTLY_GOOD_REQUESTS):
4682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            strict_handshaker = handshake.Handshaker(request,
4692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                                     mock.MockDispatcher(),
4702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                                     True)
4712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            strict_handshaker.do_handshake()
4722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    def test_not_strictly_good_requests(self):
4742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for request in _create_requests_with_lines(
4752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            _NOT_STRICTLY_GOOD_REQUESTS):
4762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            strict_handshaker = handshake.Handshaker(request,
4772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                                     mock.MockDispatcher(),
4782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                                                     True)
4792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            self.assertRaises(handshake.HandshakeException,
4802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                              strict_handshaker.do_handshake)
4812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4832da489cd246702bee5938545b18a6f710ed214bcJamie Gennisif __name__ == '__main__':
4842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    unittest.main()
4852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4862da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
4872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# vi:sts=4 sw=4 et
488