Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@sugarlabs.org>2012-05-18 17:56:50 (GMT)
committer Aleksey Lim <alsroot@sugarlabs.org>2012-05-18 17:56:50 (GMT)
commitb93ee3dfc8a2031206dc9ba48659a15121b701a7 (patch)
treeb0325257429d071e9d1ccc474ae06f54356267e0
parent3e56cdafe39ab1daaeb22e3b5e18c96a9aeb5c5f (diff)
Switch to active_document's sockets.py
-rw-r--r--restful_document/sockets.py129
-rw-r--r--restful_document/subscribe_socket.py9
-rwxr-xr-xtests/units/subscribe_socket.py5
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