Comment #9 on issue 226 by vladimir...@gmail.com: Python API doesn't support reading/writing delimited messages
https://code.google.com/p/protobuf/issues/detail?id=226

Here's a workaround - assuming you want to do this because you are writing protobuf messages to sockets. The delimited write simply writes the message length as a varint32 before writing the message itself:

(apologies for unidiomatic code - bit of a python noob)

from google.protobuf.internal.decoder import _DecodeVarint32
from google.protobuf.internal.encoder import _EncodeVarint

def write_message_delimited(socket, msg):
    hdr = []
    _EncodeVarint(hdr.append, len(msg))
    socket.sendall("".join(hdr))
    socket.sendall(msg.SerializeToString())

def read_message_delimited(socket):
    # int length is at most 4 bytes long
    hdr_bytes = self.socket.recv(4)
    (msg_length, hdr_length) = _DecodeVarint32(hdr_bytes, 0)

    rsp_buffer = io.BytesIO()
    if hdr_length < 4:
          rsp_buffer.write(hdr_bytes[hdr_length:])

    # read the remaining message bytes
    msg_length = msg_length - (4 - hdr_length)
    while msg_length > 0:
        rsp_bytes = self.socket.recv(min(8096, msg_length))
        rsp_buffer.write(rsp_bytes)
        msg_length = msg_length - len(rsp_bytes)

    return MyMessage.ParseFromString(rsp_buffer.getvalue())

--
You received this message because this project is configured to send all issue notifications to this address.
You may adjust your notification preferences at:
https://code.google.com/hosting/settings

--
You received this message because you are subscribed to the Google Groups "Protocol 
Buffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to protobuf+unsubscr...@googlegroups.com.
To post to this group, send email to protobuf@googlegroups.com.
Visit this group at http://groups.google.com/group/protobuf.
For more options, visit https://groups.google.com/d/optout.

Reply via email to