This commit is contained in:
liris
2013-07-01 09:02:49 +09:00
parent 23297a7b2a
commit 8c9466e0ec

View File

@@ -21,6 +21,10 @@ Copyright (C) 2010 Hiroki Ohtani(liris)
import socket import socket
try:
import ssl
except:
pass
from urlparse import urlparse from urlparse import urlparse
import os import os
import array import array
@@ -173,6 +177,7 @@ def create_connection(url, timeout=None, **options):
if you set header as dict value, the custom HTTP headers are added. if you set header as dict value, the custom HTTP headers are added.
""" """
sockopt = options.get("sockopt", ()) sockopt = options.get("sockopt", ())
sslopt = options.get("sslopt", {})
websock = WebSocket(sockopt=sockopt) websock = WebSocket(sockopt=sockopt)
websock.settimeout(timeout != None and timeout or default_timeout) websock.settimeout(timeout != None and timeout or default_timeout)
websock.connect(url, **options) websock.connect(url, **options)
@@ -197,8 +202,8 @@ _HEADERS_TO_CHECK = {
class _SSLSocketWrapper(object): class _SSLSocketWrapper(object):
def __init__(self, sock): def __init__(self, sock, sslopt={}):
self.ssl = socket.ssl(sock) self.ssl = ssl.wrap_socket(sock, **sslopt)
def recv(self, bufsize): def recv(self, bufsize):
return self.ssl.read(bufsize) return self.ssl.read(bufsize)
@@ -355,9 +360,10 @@ class WebSocket(object):
function's docstring for more details function's docstring for more details
sockopt: values for socket.setsockopt. sockopt: values for socket.setsockopt.
sockopt must be tuple and each element is argument of sock.setscokopt. sockopt must be tuple and each element is argument of sock.setscokopt.
sslopt: dict object for ssl socket option.
""" """
def __init__(self, get_mask_key = None, sockopt = ()): def __init__(self, get_mask_key=None, sockopt=(), sslopt={}):
""" """
Initalize WebSocket object. Initalize WebSocket object.
""" """
@@ -365,6 +371,7 @@ class WebSocket(object):
self.io_sock = self.sock = socket.socket() self.io_sock = self.sock = socket.socket()
for opts in sockopt: for opts in sockopt:
self.sock.setsockopt(*opts) self.sock.setsockopt(*opts)
self.sslopt = sslopt
self.get_mask_key = get_mask_key self.get_mask_key = get_mask_key
def fileno(self): def fileno(self):
@@ -420,7 +427,7 @@ class WebSocket(object):
# TODO: we need to support proxy # TODO: we need to support proxy
self.sock.connect((hostname, port)) self.sock.connect((hostname, port))
if is_secure: if is_secure:
self.io_sock = _SSLSocketWrapper(self.sock) self.io_sock = _SSLSocketWrapper(self.sock, self.sslopt)
self._handshake(hostname, port, resource, **options) self._handshake(hostname, port, resource, **options)
def _handshake(self, host, port, resource, **options): def _handshake(self, host, port, resource, **options):
@@ -700,8 +707,7 @@ class WebSocketApp(object):
""" """
def __init__(self, url, header=[], def __init__(self, url, header=[],
on_open=None, on_message=None, on_error=None, on_open=None, on_message=None, on_error=None,
on_close = None, keep_running = True, get_mask_key = None, on_close=None, keep_running=True, get_mask_key=None):
sockopt=()):
""" """
url: websocket url. url: websocket url.
header: custom header for websocket handshake. header: custom header for websocket handshake.
@@ -732,6 +738,7 @@ class WebSocketApp(object):
self.get_mask_key = get_mask_key self.get_mask_key = get_mask_key
self.sock = None self.sock = None
def send(self, data, opcode = ABNF.OPCODE_TEXT): def send(self, data, opcode = ABNF.OPCODE_TEXT):
""" """
send message. send message.
@@ -748,17 +755,18 @@ class WebSocketApp(object):
self.keep_running = False self.keep_running = False
self.sock.close() self.sock.close()
def run_forever(self, sockopt=()): def run_forever(self, sockopt=(), sslopt={}):
""" """
run event loop for WebSocket framework. run event loop for WebSocket framework.
This loop is infinite loop and is alive during websocket is available. This loop is infinite loop and is alive during websocket is available.
sockopt: values for socket.setsockopt. sockopt: values for socket.setsockopt.
sockopt must be tuple and each element is argument of sock.setscokopt. sockopt must be tuple and each element is argument of sock.setscokopt.
sslopt: ssl socket optional dict.
""" """
if self.sock: if self.sock:
raise WebSocketException("socket is already opened") raise WebSocketException("socket is already opened")
try: try:
self.sock = WebSocket(self.get_mask_key, sockopt = sockopt) self.sock = WebSocket(self.get_mask_key, sockopt=sockopt, sslopt=sslopt)
self.sock.connect(self.url, header=self.header) self.sock.connect(self.url, header=self.header)
self._run_with_no_err(self.on_open) self._run_with_no_err(self.on_open)
while self.keep_running: while self.keep_running: