12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Copyright 2012, Google Inc.
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# All rights reserved.
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# Redistribution and use in source and binary forms, with or without
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# modification, are permitted provided that the following conditions are
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# met:
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#     * Redistributions of source code must retain the above copyright
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# notice, this list of conditions and the following disclaimer.
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#     * Redistributions in binary form must reproduce the above
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# copyright notice, this list of conditions and the following disclaimer
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# in the documentation and/or other materials provided with the
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# distribution.
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#     * Neither the name of Google Inc. nor the names of its
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# contributors may be used to endorse or promote products derived from
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# this software without specific prior written permission.
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis#
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennisimport struct
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom mod_pywebsocket import common
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennisfrom mod_pywebsocket import stream
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef web_socket_do_extra_handshake(request):
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    pass
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef web_socket_transfer_data(request):
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    while True:
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        line = request.ws_stream.receive_message()
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        if line is None:
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            return
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        code, reason = line.split(' ', 1)
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        if code is None or reason is None:
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis            return
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        request.ws_stream.close_connection(int(code), reason)
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # close_connection() initiates closing handshake. It validates code
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # and reason. If you want to send a broken close frame for a test,
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # following code will be useful.
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # > data = struct.pack('!H', int(code)) + reason.encode('UTF-8')
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # > request.connection.write(stream.create_close_frame(data))
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # > # Suppress to re-respond client responding close frame.
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        # > raise Exception("customized server initiated closing handshake")
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennisdef web_socket_passive_closing_handshake(request):
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # Simply echo a close status code
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    code, reason = request.ws_close_code, request.ws_close_reason
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    # pywebsocket sets pseudo code for receiving an empty body close frame.
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    if code == common.STATUS_NO_STATUS_RECEIVED:
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        code = None
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        reason = ''
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    return code, reason
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis# vi:sts=4 sw=4 et
70