in lib/src/streams/stream_handler.dart [367:404]
ServerTransportStream _push(
Http2StreamImpl stream, List<Header> requestHeaders) {
if (stream.state != StreamState.Open &&
stream.state != StreamState.HalfClosedRemote) {
throw StateError('Cannot push based on a stream that is neither open '
'nor half-closed-remote.');
}
if (!_peerSettings.enablePush) {
throw StateError('Client did disable server pushes.');
}
if (!_canCreateNewStream()) {
throw StateError('Maximum number of streams reached.');
}
if (_ranOutOfStreamIds()) {
throw StateError('There are no more stream ids left. Please use a '
'new connection.');
}
var pushStream = newLocalStream();
// NOTE: Since there was no real request from the client, we simulate it
// by adding a synthetic `endStream = true` Data message into the incoming
// queue.
_changeState(pushStream, StreamState.ReservedLocal);
// TODO: We should wait for us to send the headers frame before doing this
// transition.
_changeState(pushStream, StreamState.HalfClosedRemote);
pushStream.incomingQueue
.enqueueMessage(DataMessage(stream.id, const <int>[], true));
_frameWriter.writePushPromiseFrame(
stream.id, pushStream.id, requestHeaders);
return pushStream;
}