[ https://issues.apache.org/jira/browse/THRIFT-4187?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16010626#comment-16010626 ]
ASF GitHub Bot commented on THRIFT-4187: ---------------------------------------- Github user markerickson-wf commented on a diff in the pull request: https://github.com/apache/thrift/pull/1269#discussion_r116509027 --- Diff: lib/dart/lib/src/transport/t_framed_transport.dart --- @@ -51,33 +58,112 @@ class TFramedTransport extends TBufferedTransport { if (got > 0) return got; } - _readFrame(); + // IMPORTANT: by the time you've got here, + // an entire frame is available for reading return super.read(buffer, offset, length); } void _readFrame() { - _transport.readAll(headerBytes, 0, headerByteCount); - int size = headerBytes.buffer.asByteData().getUint32(0); + if (_body == null) { + bool gotFullHeader = _readFrameHeader(); + if (!gotFullHeader) { + return; + } + } + + _readFrameBody(); + } + + bool _readFrameHeader() { + var remainingHeaderBytes = headerByteCount - _receivedHeaderBytes; - if (size < 0) { + int got = _transport.read(_headerBytes, _receivedHeaderBytes, remainingHeaderBytes); + if (got < 0) { throw new TTransportError( - TTransportErrorType.UNKNOWN, "Read a negative frame size: $size"); + TTransportErrorType.UNKNOWN, "Socket closed during frame header read"); } - Uint8List buffer = new Uint8List(size); - _transport.readAll(buffer, 0, size); - _setReadBuffer(buffer); + _receivedHeaderBytes += got; + + if (_receivedHeaderBytes == headerByteCount) { + int size = _headerBytes.buffer.asByteData().getUint32(0); + + _receivedHeaderBytes = 0; + + if (size < 0) { + throw new TTransportError( + TTransportErrorType.UNKNOWN, "Read a negative frame size: $size"); + } + + _bodySize = size; + _body = new Uint8List(_bodySize); + _receivedBodyBytes = 0; + + return true; + } else { + _registerForReadableBytes(); --- End diff -- Does this create a synchronous cycle if the header bytes are not available? `_registerForReadableBytes`->`_readFrame`->`readFrameHeader`->`_registerForReadableBytes`->... It seems like this would cause an unresponsive browser? > Dart -> Rust Framed cross tests fail > ------------------------------------ > > Key: THRIFT-4187 > URL: https://issues.apache.org/jira/browse/THRIFT-4187 > Project: Thrift > Issue Type: Bug > Components: Rust - Library > Reporter: Allen George > Assignee: Allen George > Priority: Minor > > For some reason the Dart (client) -> Rust (server) framed-transport cross > tests fail. Initial investigation shows that *somehow* the dart client think > the socket was closed, which means it doesn't read the message from the > underlying transport. -- This message was sent by Atlassian JIRA (v6.3.15#6346)