refactoring.
This commit is contained in:
@@ -58,6 +58,7 @@ import logging
|
|||||||
# websocket modules
|
# websocket modules
|
||||||
from ._exceptions import *
|
from ._exceptions import *
|
||||||
from ._abnf import *
|
from ._abnf import *
|
||||||
|
from ._socket import *
|
||||||
from ._utils import *
|
from ._utils import *
|
||||||
from ._url import *
|
from ._url import *
|
||||||
|
|
||||||
@@ -74,21 +75,10 @@ Please see http://tools.ietf.org/html/rfc6455 for protocol.
|
|||||||
VERSION = 13
|
VERSION = 13
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_SOCKET_OPTION = [(socket.SOL_TCP, socket.TCP_NODELAY, 1),]
|
|
||||||
if hasattr(socket, "SO_KEEPALIVE"):
|
|
||||||
DEFAULT_SOCKET_OPTION.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1))
|
|
||||||
if hasattr(socket, "TCP_KEEPIDLE"):
|
|
||||||
DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPIDLE, 30))
|
|
||||||
if hasattr(socket, "TCP_KEEPINTVL"):
|
|
||||||
DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPINTVL, 10))
|
|
||||||
if hasattr(socket, "TCP_KEEPCNT"):
|
|
||||||
DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPCNT, 3))
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
default_timeout = None
|
|
||||||
traceEnabled = False
|
traceEnabled = False
|
||||||
|
|
||||||
|
|
||||||
@@ -113,23 +103,6 @@ def _dump(title, message):
|
|||||||
logger.debug("-----------------------")
|
logger.debug("-----------------------")
|
||||||
|
|
||||||
|
|
||||||
def setdefaulttimeout(timeout):
|
|
||||||
"""
|
|
||||||
Set the global timeout setting to connect.
|
|
||||||
|
|
||||||
timeout: default socket timeout time. This value is second.
|
|
||||||
"""
|
|
||||||
global default_timeout
|
|
||||||
default_timeout = timeout
|
|
||||||
|
|
||||||
|
|
||||||
def getdefaulttimeout():
|
|
||||||
"""
|
|
||||||
Return the global timeout setting(second) to connect.
|
|
||||||
"""
|
|
||||||
return default_timeout
|
|
||||||
|
|
||||||
|
|
||||||
def create_connection(url, timeout=None, **options):
|
def create_connection(url, timeout=None, **options):
|
||||||
"""
|
"""
|
||||||
connect to url and return websocket object.
|
connect to url and return websocket object.
|
||||||
@@ -745,47 +718,19 @@ class WebSocket(object):
|
|||||||
self.connected = False
|
self.connected = False
|
||||||
|
|
||||||
def _send(self, data):
|
def _send(self, data):
|
||||||
if isinstance(data, six.text_type):
|
return send(self.sock, data)
|
||||||
data = data.encode('utf-8')
|
|
||||||
|
|
||||||
if not self.sock:
|
|
||||||
raise WebSocketConnectionClosedException("socket is already closed.")
|
|
||||||
|
|
||||||
try:
|
|
||||||
return self.sock.send(data)
|
|
||||||
except socket.timeout as e:
|
|
||||||
message = extract_err_message(e)
|
|
||||||
raise WebSocketTimeoutException(message)
|
|
||||||
except Exception as e:
|
|
||||||
message = extract_err_message(e)
|
|
||||||
if message and "timed out" in message:
|
|
||||||
raise WebSocketTimeoutException(message)
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
def _recv(self, bufsize):
|
def _recv(self, bufsize):
|
||||||
if not self.sock:
|
|
||||||
raise WebSocketConnectionClosedException("socket is already closed.")
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
bytes = self.sock.recv(bufsize)
|
return recv(self.sock, bufsize)
|
||||||
except socket.timeout as e:
|
except WebSocketConnectionClosedException:
|
||||||
message = extract_err_message(e)
|
|
||||||
raise WebSocketTimeoutException(message)
|
|
||||||
except SSLError as e:
|
|
||||||
message = extract_err_message(e)
|
|
||||||
if message == "The read operation timed out":
|
|
||||||
raise WebSocketTimeoutException(message)
|
|
||||||
else:
|
|
||||||
raise
|
|
||||||
|
|
||||||
if not bytes:
|
|
||||||
if self.sock:
|
if self.sock:
|
||||||
self.sock.close()
|
self.sock.close()
|
||||||
self.sock = None
|
self.sock = None
|
||||||
self.connected = False
|
self.connected = False
|
||||||
raise WebSocketConnectionClosedException("Connection is already closed.")
|
raise
|
||||||
return bytes
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
def _recv_strict(self, bufsize):
|
def _recv_strict(self, bufsize):
|
||||||
shortage = bufsize - sum(len(x) for x in self._recv_buffer)
|
shortage = bufsize - sum(len(x) for x in self._recv_buffer)
|
||||||
@@ -805,13 +750,16 @@ class WebSocket(object):
|
|||||||
|
|
||||||
|
|
||||||
def _recv_line(self):
|
def _recv_line(self):
|
||||||
line = []
|
try:
|
||||||
while True:
|
return recv_line(self.sock)
|
||||||
c = self._recv(1)
|
except WebSocketConnectionClosedException:
|
||||||
line.append(c)
|
if self.sock:
|
||||||
if c == six.b("\n"):
|
self.sock.close()
|
||||||
break
|
self.sock = None
|
||||||
return six.b("").join(line)
|
self.connected = False
|
||||||
|
raise
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
107
websocket/_socket.py
Normal file
107
websocket/_socket.py
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
"""
|
||||||
|
websocket - WebSocket client library for Python
|
||||||
|
|
||||||
|
Copyright (C) 2010 Hiroki Ohtani(liris)
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Lesser General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2.1 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public
|
||||||
|
License along with this library; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||||
|
Boston, MA 02110-1335 USA
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import socket
|
||||||
|
import six
|
||||||
|
|
||||||
|
from ._exceptions import *
|
||||||
|
from ._utils import *
|
||||||
|
|
||||||
|
DEFAULT_SOCKET_OPTION = [(socket.SOL_TCP, socket.TCP_NODELAY, 1),]
|
||||||
|
if hasattr(socket, "SO_KEEPALIVE"):
|
||||||
|
DEFAULT_SOCKET_OPTION.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1))
|
||||||
|
if hasattr(socket, "TCP_KEEPIDLE"):
|
||||||
|
DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPIDLE, 30))
|
||||||
|
if hasattr(socket, "TCP_KEEPINTVL"):
|
||||||
|
DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPINTVL, 10))
|
||||||
|
if hasattr(socket, "TCP_KEEPCNT"):
|
||||||
|
DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPCNT, 3))
|
||||||
|
|
||||||
|
default_timeout = None
|
||||||
|
|
||||||
|
def setdefaulttimeout(timeout):
|
||||||
|
"""
|
||||||
|
Set the global timeout setting to connect.
|
||||||
|
|
||||||
|
timeout: default socket timeout time. This value is second.
|
||||||
|
"""
|
||||||
|
global default_timeout
|
||||||
|
default_timeout = timeout
|
||||||
|
|
||||||
|
|
||||||
|
def getdefaulttimeout():
|
||||||
|
"""
|
||||||
|
Return the global timeout setting(second) to connect.
|
||||||
|
"""
|
||||||
|
return default_timeout
|
||||||
|
|
||||||
|
|
||||||
|
def recv(sock, bufsize):
|
||||||
|
if not sock:
|
||||||
|
raise WebSocketConnectionClosedException("socket is already closed.")
|
||||||
|
|
||||||
|
try:
|
||||||
|
bytes = sock.recv(bufsize)
|
||||||
|
except socket.timeout as e:
|
||||||
|
message = extract_err_message(e)
|
||||||
|
raise WebSocketTimeoutException(message)
|
||||||
|
except SSLError as e:
|
||||||
|
message = extract_err_message(e)
|
||||||
|
if message == "The read operation timed out":
|
||||||
|
raise WebSocketTimeoutException(message)
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
||||||
|
if not bytes:
|
||||||
|
raise WebSocketConnectionClosedException("Connection is already closed.")
|
||||||
|
|
||||||
|
return bytes
|
||||||
|
|
||||||
|
def recv_line(sock):
|
||||||
|
line = []
|
||||||
|
while True:
|
||||||
|
c = recv(sock, 1)
|
||||||
|
line.append(c)
|
||||||
|
if c == six.b("\n"):
|
||||||
|
break
|
||||||
|
return six.b("").join(line)
|
||||||
|
|
||||||
|
|
||||||
|
def send(sock, data):
|
||||||
|
if isinstance(data, six.text_type):
|
||||||
|
data = data.encode('utf-8')
|
||||||
|
|
||||||
|
if not sock:
|
||||||
|
raise WebSocketConnectionClosedException("socket is already closed.")
|
||||||
|
|
||||||
|
try:
|
||||||
|
return sock.send(data)
|
||||||
|
except socket.timeout as e:
|
||||||
|
message = extract_err_message(e)
|
||||||
|
raise WebSocketTimeoutException(message)
|
||||||
|
except Exception as e:
|
||||||
|
message = extract_err_message(e)
|
||||||
|
if message and "timed out" in message:
|
||||||
|
raise WebSocketTimeoutException(message)
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
|
@@ -32,6 +32,7 @@ from websocket._utils import validate_utf8
|
|||||||
|
|
||||||
# Skip test to access the internet.
|
# Skip test to access the internet.
|
||||||
TEST_WITH_INTERNET = False
|
TEST_WITH_INTERNET = False
|
||||||
|
# TEST_WITH_INTERNET = True
|
||||||
|
|
||||||
# Skip Secure WebSocket test.
|
# Skip Secure WebSocket test.
|
||||||
TEST_SECURE_WS = False
|
TEST_SECURE_WS = False
|
||||||
|
Reference in New Issue
Block a user