[tor-commits] [stem/master] Read directly from socket with RelaySocket

atagar at torproject.org atagar at torproject.org
Sun Jan 21 02:04:03 UTC 2018


commit 4d3f18df7243ac149ab402386f8b7f7695a4e51d
Author: Damian Johnson <atagar at torproject.org>
Date:   Mon Jan 1 11:20:57 2018 -0800

    Read directly from socket with RelaySocket
    
    Ick, struggled with this for a while. The file's read() retrieves data until a
    given amount of data has been reached or the socket closed, whereas recv simply
    reads whatever is available. Struggled for a while to get read() to behave like
    recv() but no luck. Just having the RelaySocket read directly from the socket
    instead...
    
    https://stackoverflow.com/questions/6946629/can-i-get-a-socket-makefile-to-have-the-same-read-semantics-as-a-regular-file
---
 stem/socket.py | 23 ++++++++++-------------
 1 file changed, 10 insertions(+), 13 deletions(-)

diff --git a/stem/socket.py b/stem/socket.py
index 01626068..20fbf6d0 100644
--- a/stem/socket.py
+++ b/stem/socket.py
@@ -238,7 +238,7 @@ class BaseSocket(object):
 
     ::
 
-      my_handler(socket_file, message)
+      my_handler(socket, socket_file, message)
     """
 
     with self._send_lock:
@@ -246,7 +246,7 @@ class BaseSocket(object):
         if not self.is_alive():
           raise stem.SocketClosed()
 
-        handler(self._socket_file, message)
+        handler(self._socket, self._socket_file, message)
       except stem.SocketClosed:
         # if send_message raises a SocketClosed then we should properly shut
         # everything down
@@ -262,7 +262,7 @@ class BaseSocket(object):
 
     ::
 
-      my_handler(socket_file)
+      my_handler(socket, socket_file)
     """
 
     with self._recv_lock:
@@ -270,12 +270,12 @@ class BaseSocket(object):
         # makes a temporary reference to the _socket_file because connect()
         # and close() may set or unset it
 
-        socket_file = self._socket_file
+        my_socket, my_socket_file = self._socket, self._socket_file
 
-        if not socket_file:
+        if not my_socket or not my_socket_file:
           raise stem.SocketClosed()
 
-        return handler(socket_file)
+        return handler(my_socket, my_socket_file)
       except stem.SocketClosed:
         # If recv_message raises a SocketClosed then we should properly shut
         # everything down. However, there's a couple cases where this will
@@ -385,7 +385,7 @@ class RelaySocket(BaseSocket):
       * :class:`stem.SocketClosed` if the socket is known to be shut down
     """
 
-    self._send(message, _write_to_socket)
+    self._send(message, lambda s, sf, msg: _write_to_socket(sf, msg))
 
   def recv(self, max_response_size = MAX_READ_BUFFER_LEN):
     """
@@ -403,10 +403,7 @@ class RelaySocket(BaseSocket):
     # TODO: Not really sure what we'll want here. To start with just copying
     # endosome's behavior.
 
-    def _read(control_file):
-      return control_file.read(max_response_size)
-
-    return self._recv(_read)
+    return self._recv(lambda s, sf: s.recv(max_response_size))
 
   def is_localhost(self):
     return self.address == '127.0.0.1'
@@ -450,7 +447,7 @@ class ControlSocket(BaseSocket):
       * :class:`stem.SocketClosed` if the socket is known to be shut down
     """
 
-    self._send(message, send_message)
+    self._send(message, lambda s, sf, msg: send_message(sf, msg))
 
   def recv(self):
     """
@@ -464,7 +461,7 @@ class ControlSocket(BaseSocket):
       * :class:`stem.SocketClosed` if the socket closes before we receive a complete message
     """
 
-    return self._recv(recv_message)
+    return self._recv(lambda s, sf: recv_message(sf))
 
 
 class ControlPort(ControlSocket):





More information about the tor-commits mailing list