示例#1
0
        public void WriteResponseHeaders(int statusCode, string? reasonPhrase, HttpResponseHeaders responseHeaders, bool autoChunk, bool appCompleted)
        {
            lock (_dataWriterLock)
            {
                // The HPACK header compressor is stateful, if we compress headers for an aborted stream we must send them.
                // Optimize for not compressing or sending them.
                if (_streamCompleted)
                {
                    return;
                }

                // If the responseHeaders will be written as the final HEADERS frame then
                // set END_STREAM on the HEADERS frame. This avoids the need to write an
                // empty DATA frame with END_STREAM.
                //
                // The headers will be the final frame if:
                // 1. There is no content
                // 2. There is no trailing HEADERS frame.
                Http2HeadersFrameFlags http2HeadersFrame;

                if (appCompleted && !_startedWritingDataFrames && (_stream.ResponseTrailers == null || _stream.ResponseTrailers.Count == 0))
                {
                    _streamEnded = true;
                    _stream.DecrementActiveClientStreamCount();
                    http2HeadersFrame = Http2HeadersFrameFlags.END_STREAM;
                }
                else
                {
                    http2HeadersFrame = Http2HeadersFrameFlags.NONE;
                }

                _frameWriter.WriteResponseHeaders(StreamId, statusCode, http2HeadersFrame, responseHeaders);
            }
        }
示例#2
0
        public void WriteResponseHeaders(int statusCode, string ReasonPhrase, HttpResponseHeaders responseHeaders)
        {
            lock (_dataWriterLock)
            {
                // The HPACK header compressor is stateful, if we compress headers for an aborted stream we must send them.
                // Optimize for not compressing or sending them.
                if (_completed)
                {
                    return;
                }

                _frameWriter.WriteResponseHeaders(_streamId, statusCode, responseHeaders);
            }
        }