Index: client/libs/logdog/stream.py |
diff --git a/client/libs/logdog/stream.py b/client/libs/logdog/stream.py |
index c34f8fabbf9242977c0cb3cec9a64ecd80e8ab2e..3d60a6c6c948807e209f6819c53297ffa7f540ce 100644 |
--- a/client/libs/logdog/stream.py |
+++ b/client/libs/logdog/stream.py |
@@ -18,6 +18,13 @@ _StreamParamsBase = collections.namedtuple('_StreamParamsBase', |
('name', 'type', 'content_type', 'tags', 'tee', 'binary_file_extension')) |
+# Magic number at the beginning of a Butler stream |
+# |
+# See "ProtocolFrameHeaderMagic" in: |
+# <luci-go>/logdog/client/butlerlib/streamproto |
+BUTLER_MAGIC = 'BTLR1\x1e' |
+ |
+ |
class StreamParams(_StreamParamsBase): |
"""Defines the set of parameters to apply to a new stream.""" |
@@ -222,6 +229,7 @@ class StreamClient(object): |
params_json = params.to_json() |
fd = self._connect_raw() |
+ fd.write(BUTLER_MAGIC) |
varint.write_uvarint(fd, len(params_json)) |
fd.write(params_json) |
return fd |
@@ -411,6 +419,19 @@ class _UnixDomainSocketStreamClient(StreamClient): |
"""A StreamClient implementation that uses a UNIX domain socket. |
""" |
+ class SocketFile(object): |
+ """A write-only file-like object that writes to a UNIX socket.""" |
+ |
+ def __init__(self, fd): |
+ self._fd = fd |
+ |
+ def write(self, data): |
+ self._fd.send(data) |
+ |
+ def close(self): |
+ self._fd.close() |
+ |
+ |
def __init__(self, path): |
"""Initializes a new UNIX domain socket stream client. |
@@ -429,6 +450,6 @@ class _UnixDomainSocketStreamClient(StreamClient): |
def _connect_raw(self): |
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) |
sock.connect(self._path) |
- return sock |
+ return self.SocketFile(sock) |
_default_registry.register_protocol('unix', _UnixDomainSocketStreamClient) |