示例#1
0
        /// <summary>
        /// Exposed Used for testing only! Default values used in the initial settings frame are overridden intentionally
        /// for testing but violate the RFC if used outside the scope of testing.
        /// </summary>
        /// <param name="sensitivityDetector"></param>
        /// <param name="hpackEncoder"></param>
        internal DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector, HpackEncoder hpackEncoder)
        {
            if (sensitivityDetector is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.sensitivityDetector);
            }
            if (hpackEncoder is null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.hpackEncoder);
            }

            _sensitivityDetector = sensitivityDetector;
            _hpackEncoder        = hpackEncoder;
        }
示例#2
0
        private static byte[] Encode(HpackEncoder hpackEncoder, List <HpackHeaderField> headers, int maxHeaderTableSize, bool sensitive)
        {
            IHttp2Headers        http2Headers        = ToHttp2Headers(headers);
            ISensitivityDetector sensitivityDetector = sensitive ? AlwaysSensitiveDetector.Instance : NeverSensitiveDetector.Instance;
            var buffer = Unpooled.Buffer();

            try
            {
                if (maxHeaderTableSize != -1)
                {
                    hpackEncoder.SetMaxHeaderTableSize(buffer, maxHeaderTableSize);
                }

                hpackEncoder.EncodeHeaders(3 /* randomly chosen */, buffer, http2Headers, sensitivityDetector);
                byte[] bytes = new byte[buffer.ReadableBytes];
                buffer.ReadBytes(bytes);
                return(bytes);
            }
            finally
            {
                buffer.Release();
            }
        }
示例#3
0
 public DefaultHttp2FrameWriter(ISensitivityDetector headersSensitivityDetector, bool ignoreMaxHeaderListSize)
     : this(new DefaultHttp2HeadersEncoder(headersSensitivityDetector, ignoreMaxHeaderListSize))
 {
 }
示例#4
0
 public DefaultHttp2FrameWriter(ISensitivityDetector headersSensitivityDetector)
     : this(new DefaultHttp2HeadersEncoder(headersSensitivityDetector))
 {
 }
示例#5
0
        void EncodeHeadersEnforceMaxHeaderListSize(int streamId, IByteBuffer output, IHttp2Headers headers, ISensitivityDetector sensitivityDetector)
        {
            long headerSize = 0;

            // To ensure we stay consistent with our peer check the size is valid before we potentially modify HPACK state.
            foreach (HeaderEntry <ICharSequence, ICharSequence> header in headers)
            {
                ICharSequence name  = header.Key;
                ICharSequence value = header.Value;
                // OK to increment now and check for bounds after because this value is limited to unsigned int and will not
                // overflow.
                headerSize += HpackHeaderField.SizeOf(name, value);
                if (headerSize > _maxHeaderListSize)
                {
                    Http2CodecUtil.HeaderListSizeExceeded(streamId, _maxHeaderListSize, false);
                }
            }

            EncodeHeadersIgnoreMaxHeaderListSize(@output, headers, sensitivityDetector);
        }
示例#6
0
 /// <summary>
 /// Encode the header field into the header block.
 /// The given <see cref="ICharSequence"/>s must be immutable!
 /// </summary>
 /// <param name="streamId"></param>
 /// <param name="output"></param>
 /// <param name="headers"></param>
 /// <param name="sensitivityDetector"></param>
 public void EncodeHeaders(int streamId, IByteBuffer output, IHttp2Headers headers, ISensitivityDetector sensitivityDetector)
 {
     if (_ignoreMaxHeaderListSize)
     {
         EncodeHeadersIgnoreMaxHeaderListSize(output, headers, sensitivityDetector);
     }
     else
     {
         EncodeHeadersEnforceMaxHeaderListSize(streamId, output, headers, sensitivityDetector);
     }
 }
示例#7
0
 void EncodeHeadersIgnoreMaxHeaderListSize(IByteBuffer output, IHttp2Headers headers, ISensitivityDetector sensitivityDetector)
 {
     foreach (HeaderEntry <ICharSequence, ICharSequence> header in headers)
     {
         ICharSequence name  = header.Key;
         ICharSequence value = header.Value;
         EncodeHeader(output, name, value, sensitivityDetector.IsSensitive(name, value), HpackHeaderField.SizeOf(name, value));
     }
 }
示例#8
0
 public DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector, bool ignoreMaxHeaderListSize,
                                   int dynamicTableArraySizeHint, int huffCodeThreshold)
     : this(sensitivityDetector, new HpackEncoder(ignoreMaxHeaderListSize, dynamicTableArraySizeHint, huffCodeThreshold))
 {
 }
示例#9
0
 public DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector, bool ignoreMaxHeaderListSize)
     : this(sensitivityDetector, new HpackEncoder(ignoreMaxHeaderListSize))
 {
 }
示例#10
0
 public DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector)
     : this(sensitivityDetector, new HpackEncoder())
 {
 }