/// <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; }
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(); } }
public DefaultHttp2FrameWriter(ISensitivityDetector headersSensitivityDetector, bool ignoreMaxHeaderListSize) : this(new DefaultHttp2HeadersEncoder(headersSensitivityDetector, ignoreMaxHeaderListSize)) { }
public DefaultHttp2FrameWriter(ISensitivityDetector headersSensitivityDetector) : this(new DefaultHttp2HeadersEncoder(headersSensitivityDetector)) { }
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); }
/// <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); } }
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)); } }
public DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector, bool ignoreMaxHeaderListSize, int dynamicTableArraySizeHint, int huffCodeThreshold) : this(sensitivityDetector, new HpackEncoder(ignoreMaxHeaderListSize, dynamicTableArraySizeHint, huffCodeThreshold)) { }
public DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector, bool ignoreMaxHeaderListSize) : this(sensitivityDetector, new HpackEncoder(ignoreMaxHeaderListSize)) { }
public DefaultHttp2HeadersEncoder(ISensitivityDetector sensitivityDetector) : this(sensitivityDetector, new HpackEncoder()) { }