diff options
author | Aleksey Lim <alsroot@sugarlabs.org> | 2012-05-18 17:56:50 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@sugarlabs.org> | 2012-05-18 17:56:50 (GMT) |
commit | b93ee3dfc8a2031206dc9ba48659a15121b701a7 (patch) | |
tree | b0325257429d071e9d1ccc474ae06f54356267e0 | |
parent | 3e56cdafe39ab1daaeb22e3b5e18c96a9aeb5c5f (diff) |
Switch to active_document's sockets.py
-rw-r--r-- | restful_document/sockets.py | 129 | ||||
-rw-r--r-- | restful_document/subscribe_socket.py | 9 | ||||
-rwxr-xr-x | tests/units/subscribe_socket.py | 5 |
3 files changed, 6 insertions, 137 deletions
diff --git a/restful_document/sockets.py b/restful_document/sockets.py deleted file mode 100644 index d479d5e..0000000 --- a/restful_document/sockets.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (C) 2012, Aleksey Lim -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program 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 General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see <http://www.gnu.org/licenses/>. - -"""Utilities to work with sockets. - -$Repo: git://git.sugarlabs.org/alsroot/codelets.git$ -$File: src/socket.py$ -$Data: 2012-05-15$ - -""" - -import json -import errno -import struct -from gettext import gettext as _ - -from . import util -enforce = util.enforce - - -BUFFER_SIZE = 1024 * 10 - - -class SocketFile(object): - - def __init__(self, socket): - self._socket = socket - self._message_buffer = bytearray('\0' * BUFFER_SIZE) - self._read_size = None - - @property - def socket(self): - return self._socket - - def write_message(self, message): - try: - message_str = json.dumps(message) - except Exception, error: - raise RuntimeError(_('Cannot encode %r message: %s') % \ - (message, error)) - self.write(message_str) - - def read_message(self): - message_str = self.read() - if not message_str: - return None - try: - message = json.loads(message_str) - except Exception, error: - raise RuntimeError(_('Cannot decode "%s" message: %s') % \ - (message_str, error)) - return message - - def write(self, data): - if data is None: - data = '' - size_str = struct.pack('i', len(data)) - self._socket.send(size_str) - self._socket.send(data) - - def read(self, size=None): - - def read_size(): - size_str = self._recv(struct.calcsize('i')) - if not size_str: - return 0 - return struct.unpack('i', size_str)[0] - - if size is None: - chunks = [] - size = read_size() - while size: - chunk = self._recv(min(size, BUFFER_SIZE)) - if not chunk: - break - chunks.append(chunk) - size -= len(chunk) - return ''.join(chunks) - else: - if self._read_size is None: - self._read_size = read_size() - if self._read_size: - chunk = self._recv(min(self._read_size, BUFFER_SIZE, size)) - else: - chunk = '' - if not chunk: - self._read_size = None - else: - self._read_size -= len(chunk) - return chunk - - def close(self): - if self._socket is not None: - self._socket.close() - self._socket = None - - def _recv(self, size): - while True: - try: - chunk = self._socket.recv(size) - except OSError, error: - if error.errno == errno.EINTR: - continue - raise - return chunk - - def __repr__(self): - return repr(self._socket) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_value, traceback): - self.close() - - def __getattr__(self, name): - return getattr(self._socket, name) diff --git a/restful_document/subscribe_socket.py b/restful_document/subscribe_socket.py index bd1e578..8bc6f70 100644 --- a/restful_document/subscribe_socket.py +++ b/restful_document/subscribe_socket.py @@ -19,8 +19,7 @@ import logging from gettext import gettext as _ from restful_document import env -from restful_document.sockets import SocketFile, BUFFER_SIZE -from active_document import coroutine, util, enforce +from active_document import sockets, coroutine, util, enforce _logger = logging.getLogger('restful_document.subscribe_socket') @@ -71,7 +70,7 @@ class SubscribeSocket(object): _logger.debug('Got request from %r, making a handshake', host) try: - handshake = SocketFile(conn).read_message() + handshake = sockets.SocketFile(conn).read_message() ticket = handshake.get('ticket') enforce(ticket and ticket in self._tickets, _('Unknown request')) self._tickets.remove(ticket) @@ -83,7 +82,7 @@ class SubscribeSocket(object): _logger.debug('Accepted %r subscriber', host) self._subscribers.add(conn) try: - data = conn.recv(BUFFER_SIZE) + data = conn.recv(sockets.BUFFER_SIZE) enforce(not data, _('Subscriber misused connection ' \ 'by sending %s bytes, discard it'), len(data)) except Exception: @@ -105,4 +104,4 @@ class SubscribeSocket(object): return for conn in self._subscribers: - SocketFile(conn).write_message(event) + sockets.SocketFile(conn).write_message(event) diff --git a/tests/units/subscribe_socket.py b/tests/units/subscribe_socket.py index 5f4ec25..2396196 100755 --- a/tests/units/subscribe_socket.py +++ b/tests/units/subscribe_socket.py @@ -9,9 +9,8 @@ from tests import Resource import active_document as ad -from active_document import coroutine +from active_document import sockets, coroutine from restful_document import env -from restful_document.sockets import SocketFile class SubscribeSocketTest(tests.Test): @@ -19,7 +18,7 @@ class SubscribeSocketTest(tests.Test): def subscribe(self, host, port, ticket): conn = coroutine.socket() conn.connect((host, port)) - result = SocketFile(conn) + result = sockets.SocketFile(conn) result.write_message({'ticket': ticket}) gevent.sleep(1) return result |