in lib/src/flowcontrol/connection_queues.dart [113:155]
void _trySendMessage() {
var message = _messages.first;
if (message is HeadersMessage) {
_messages.removeFirst();
_frameWriter.writeHeadersFrame(message.streamId, message.headers,
endStream: message.endStream);
} else if (message is PushPromiseMessage) {
_messages.removeFirst();
_frameWriter.writePushPromiseFrame(
message.streamId, message.promisedStreamId, message.headers);
} else if (message is DataMessage) {
_messages.removeFirst();
if (_connectionWindow.peerWindowSize >= message.bytes.length) {
_connectionWindow.decreaseWindow(message.bytes.length);
_frameWriter.writeDataFrame(message.streamId, message.bytes,
endStream: message.endStream);
} else {
// NOTE: We need to fragment the DataMessage.
// TODO: Do not fragment if the number of bytes we can send is too low
var len = _connectionWindow.peerWindowSize;
var head = viewOrSublist(message.bytes, 0, len);
var tail =
viewOrSublist(message.bytes, len, message.bytes.length - len);
_connectionWindow.decreaseWindow(head.length);
_frameWriter.writeDataFrame(message.streamId, head, endStream: false);
var tailMessage =
DataMessage(message.streamId, tail, message.endStream);
_messages.addFirst(tailMessage);
}
} else if (message is ResetStreamMessage) {
_messages.removeFirst();
_frameWriter.writeRstStreamFrame(message.streamId, message.errorCode);
} else if (message is GoawayMessage) {
_messages.removeFirst();
_frameWriter.writeGoawayFrame(
message.lastStreamId, message.errorCode, message.debugData);
} else {
throw StateError('Unexpected message in queue: ${message.runtimeType}');
}
}