diff options
author | liris <liris.pp@gmail.com> | 2015-03-13 12:51:51 +0900 |
---|---|---|
committer | liris <liris.pp@gmail.com> | 2015-03-13 12:51:51 +0900 |
commit | b53de913aa5db6d1679a1671d196025b4bd8149f (patch) | |
tree | ae41d817fb4be9af910dbb87562f4bf12c0b22c6 /websocket | |
parent | bf0baf26fff3484c1eef2f89235c3f30889914bc (diff) | |
download | websocket-client-b53de913aa5db6d1679a1671d196025b4bd8149f.tar.gz |
refactoring.
Diffstat (limited to 'websocket')
-rw-r--r-- | websocket/_core.py | 86 | ||||
-rw-r--r-- | websocket/_socket.py | 107 | ||||
-rw-r--r-- | websocket/tests/test_websocket.py | 1 |
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 |