fixed #35
This commit is contained in:
24
websocket.py
24
websocket.py
@@ -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:
|
||||||
|
Reference in New Issue
Block a user