summaryrefslogtreecommitdiff
path: root/websocket
diff options
context:
space:
mode:
authorliris <liris.pp@gmail.com>2015-03-13 12:51:51 +0900
committerliris <liris.pp@gmail.com>2015-03-13 12:51:51 +0900
commitb53de913aa5db6d1679a1671d196025b4bd8149f (patch)
treeae41d817fb4be9af910dbb87562f4bf12c0b22c6 /websocket
parentbf0baf26fff3484c1eef2f89235c3f30889914bc (diff)
downloadwebsocket-client-b53de913aa5db6d1679a1671d196025b4bd8149f.tar.gz
refactoring.
Diffstat (limited to 'websocket')
-rw-r--r--websocket/_core.py86
-rw-r--r--websocket/_socket.py107
-rw-r--r--websocket/tests/test_websocket.py1
3 files changed, 125 insertions, 69 deletions
diff --git a/websocket/_core.py b/websocket/_core.py
index fc3c906..2d9959e 100644
--- a/websocket/_core.py
+++ b/websocket/_core.py
@@ -58,6 +58,7 @@ import logging
# websocket modules
from ._exceptions import *
from ._abnf import *
+from ._socket import *
from ._utils import *
from ._url import *
@@ -74,21 +75,10 @@ Please see http://tools.ietf.org/html/rfc6455 for protocol.
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()
-
-default_timeout = None
traceEnabled = False
@@ -113,23 +103,6 @@ def _dump(title, message):
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):
"""
connect to url and return websocket object.
@@ -745,47 +718,19 @@ class WebSocket(object):
self.connected = False
def _send(self, data):
- if isinstance(data, six.text_type):
- 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
+ return send(self.sock, data)
def _recv(self, bufsize):
- if not self.sock:
- raise WebSocketConnectionClosedException("socket is already closed.")
-
try:
- bytes = self.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:
+ return recv(self.sock, bufsize)
+ except WebSocketConnectionClosedException:
if self.sock:
self.sock.close()
self.sock = None
self.connected = False
- raise WebSocketConnectionClosedException("Connection is already closed.")
- return bytes
+ raise
+ except:
+ raise
def _recv_strict(self, bufsize):
shortage = bufsize - sum(len(x) for x in self._recv_buffer)
@@ -805,13 +750,16 @@ class WebSocket(object):
def _recv_line(self):
- line = []
- while True:
- c = self._recv(1)
- line.append(c)
- if c == six.b("\n"):
- break
- return six.b("").join(line)
+ try:
+ return recv_line(self.sock)
+ except WebSocketConnectionClosedException:
+ if self.sock:
+ self.sock.close()
+ self.sock = None
+ self.connected = False
+ raise
+ except:
+ raise
diff --git a/websocket/_socket.py b/websocket/_socket.py
new file mode 100644
index 0000000..cfa719f
--- /dev/null
+++ b/websocket/_socket.py
@@ -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
+
diff --git a/websocket/tests/test_websocket.py b/websocket/tests/test_websocket.py
index b814335..45907f4 100644
--- a/websocket/tests/test_websocket.py
+++ b/websocket/tests/test_websocket.py
@@ -32,6 +32,7 @@ from websocket._utils import validate_utf8
# Skip test to access the internet.
TEST_WITH_INTERNET = False
+# TEST_WITH_INTERNET = True
# Skip Secure WebSocket test.
TEST_SECURE_WS = False