in src/main/java/com/twitter/whiskey/net/SpdySession.java [630:668]
private void sendData(SpdyStream stream) {
int streamId = stream.getStreamId();
int sendWindow = Math.min(sessionSendWindow, stream.getSendWindow());
while (stream.hasPendingData()) {
assert(!stream.isClosedLocally());
if (sendWindow == 0) {
// TODO: measure flow control delay here
// stream.markBlocked();
return;
}
// stream.markUnblocked();
ByteBuffer data;
try {
data = stream.readData(sendWindow);
} catch (IOException e) {
sendRstStream(streamId, SPDY_STREAM_INTERNAL_ERROR);
activeStreams.remove(stream);
stream.close(e);
return;
}
int bytesSent = data.remaining();
boolean last = !stream.hasPendingData();
if (bytesSent > 0 || last) {
WriteLogger logger = new WriteLogger(
"sent DATA (%d)\n--> Stream-ID = " + streamId + "\n--> Last = " + last);
socket.write(frameEncoder.encodeDataFrame(streamId, last, data))
.addListener(logger);
sessionSendWindow -= bytesSent;
stream.reduceSendWindow(bytesSent);
}
if (last) stream.closeLocally();
}
}