diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html index 0761bafa6..66f46544c 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html @@ -750,7 +750,7 @@

Methods Edit this page - View Source + View Source

CanBufferBody(RequestResponseBase)

@@ -802,7 +802,7 @@
Returns
Edit this page - View Source + View Source

Dispose(bool)

@@ -836,7 +836,7 @@
Overrides
Edit this page - View Source + View Source

DrainClientBodyAsync(CancellationToken)

@@ -895,7 +895,7 @@
Edit this page - View Source + View Source

DrainServerBodyAsync(CancellationToken)

@@ -951,7 +951,7 @@
Edit this page - View Source + View Source

GenericResponse(byte[], HttpStatusCode, IDictionary<string, HttpHeader>, bool)

@@ -1004,7 +1004,7 @@
Parameters
Edit this page - View Source + View Source

GenericResponse(byte[], HttpStatusCode, IEnumerable<HttpHeader>?, bool)

@@ -1057,7 +1057,7 @@
Parameters
Edit this page - View Source + View Source

GenericResponse(string, HttpStatusCode, IDictionary<string, HttpHeader>?, bool)

@@ -1111,7 +1111,7 @@
Parameters
Edit this page - View Source + View Source

GenericResponse(string, HttpStatusCode, IEnumerable<HttpHeader>?, bool)

@@ -1165,7 +1165,7 @@
Parameters
Edit this page - View Source + View Source

GetRequestBody(CancellationToken)

@@ -1215,7 +1215,7 @@
Returns
Edit this page - View Source + View Source

GetRequestBodyAsString(CancellationToken)

@@ -1265,7 +1265,7 @@
Returns
Edit this page - View Source + View Source

GetResponseBody(CancellationToken)

@@ -1315,7 +1315,7 @@
Returns
Edit this page - View Source + View Source

GetResponseBodyAsString(CancellationToken)

@@ -1365,7 +1365,7 @@
Returns
Edit this page - View Source + View Source

Ok(byte[], IDictionary<string, HttpHeader>?, bool)

@@ -1412,7 +1412,7 @@
Parameters
Edit this page - View Source + View Source

Ok(byte[], IEnumerable<HttpHeader>?, bool)

@@ -1459,7 +1459,7 @@
Parameters
Edit this page - View Source + View Source

Ok(string, IDictionary<string, HttpHeader>?, bool)

@@ -1506,7 +1506,7 @@
Parameters
Edit this page - View Source + View Source

Ok(string, IEnumerable<HttpHeader>?, bool)

@@ -1553,7 +1553,7 @@
Parameters
Edit this page - View Source + View Source

Redirect(string, bool)

@@ -1593,7 +1593,7 @@
Parameters
Edit this page - View Source + View Source

Respond(Response, bool)

@@ -1640,7 +1640,7 @@
Edit this page - View Source + View Source

RespondStreaming(Response, Func<Stream, CancellationToken, Task>, bool)

@@ -1696,7 +1696,7 @@
Edit this page - View Source + View Source

RespondStreaming(StreamingProxyResult, bool)

@@ -1737,7 +1737,7 @@
Parameters
Edit this page - View Source + View Source

SetRequestBody(byte[])

@@ -1771,7 +1771,7 @@
Parameters
Edit this page - View Source + View Source

SetRequestBodyString(string)

@@ -1805,7 +1805,7 @@
Parameters
Edit this page - View Source + View Source

SetResponseBody(byte[])

@@ -1839,7 +1839,7 @@
Parameters
Edit this page - View Source + View Source

SetResponseBodyString(string)

@@ -1873,7 +1873,7 @@
Parameters
Edit this page - View Source + View Source

TerminateServerConnection()

diff --git a/docs/api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html b/docs/api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html new file mode 100644 index 000000000..920e45c16 --- /dev/null +++ b/docs/api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html @@ -0,0 +1,376 @@ + + + + + + + + Class HeaderLimitsExceededException | Titanium Web Proxy + + + + + + + + + + + + + + + +
+
+ +
+
+
+ + + + + +
+
+
+
+ +
+
+
+
+
+ +
+
+
    +
  • +
+
+
+
+
+ +
+
Search Results for
+
+

+
+
    +
    +
    +
    + +
    + Show / Hide Table of Contents +
    +
    +
    +
    +
    +
    +
    + + + +

    Class HeaderLimitsExceededException

    +

    An HTTP/1 header block exceeded MaxHeaderCount or MaxHeaderAggregateBytes +while HeaderLimits was Enforce. Not an IOException, +so it is not treated as a client disconnect.

    +
    +
    +
    +
    Inheritance
    +
    object
    +
    Exception
    +
    HeaderLimitsExceededException
    +
    +
    +
    Implements
    +
    ISerializable
    +
    +
    +
    Inherited Members
    +
    + Exception.GetBaseException() +
    +
    + Exception.GetType() +
    +
    + Exception.ToString() +
    +
    + Exception.Data +
    +
    + Exception.HelpLink +
    +
    + Exception.HResult +
    +
    + Exception.InnerException +
    +
    + Exception.Message +
    +
    + Exception.Source +
    +
    + Exception.StackTrace +
    +
    + Exception.TargetSite +
    +
    + object.Equals(object) +
    +
    + object.Equals(object, object) +
    +
    + object.GetHashCode() +
    +
    + object.ReferenceEquals(object, object) +
    +
    +
    Namespace: Titanium.Web.Proxy.Http
    +
    Assembly: Titanium.Web.Proxy.dll
    +
    Syntax
    +
    +
    public sealed class HeaderLimitsExceededException : Exception, ISerializable
    +
    +

    Constructors +

    + + | + Edit this page + + + View Source + + +

    HeaderLimitsExceededException(bool, long, long, bool)

    +

    Creates an exception for one header-block breach.

    +
    +
    +
    Declaration
    +
    +
    public HeaderLimitsExceededException(bool isCount, long observed, long limit, bool isRequest)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescription
    boolisCount
    longobserved
    longlimit
    boolisRequest
    +

    Properties +

    + + | + Edit this page + + + View Source + + +

    IsCount

    +

    True when the breach is the header count. False when it is the byte total.

    +
    +
    +
    Declaration
    +
    +
    public bool IsCount { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    bool
    + + | + Edit this page + + + View Source + + +

    IsRequest

    +

    True when the breach was on request headers.

    +
    +
    +
    Declaration
    +
    +
    public bool IsRequest { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    bool
    + + | + Edit this page + + + View Source + + +

    Limit

    +

    The configured limit that was crossed.

    +
    +
    +
    Declaration
    +
    +
    public long Limit { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    long
    + + | + Edit this page + + + View Source + + +

    Observed

    +

    The count or byte total that crossed the limit.

    +
    +
    +
    Declaration
    +
    +
    public long Observed { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    long
    +

    Implements

    +
    + ISerializable +
    + +
    +
    + +
    +
    +
    +
      +
    • + Edit this page +
    • +
    • + View Source +
    • +
    +
    +
    +
    In this article
    +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    + + Back to top + + + Generated by DocFX +
    +
    +
    +
    + + + + + + diff --git a/docs/api/Titanium.Web.Proxy.Http.html b/docs/api/Titanium.Web.Proxy.Http.html index b39df4e74..053f55b5f 100644 --- a/docs/api/Titanium.Web.Proxy.Http.html +++ b/docs/api/Titanium.Web.Proxy.Http.html @@ -93,6 +93,11 @@

    ConnectR

    HeaderCollection

    The http header collection.

    +
    +

    HeaderLimitsExceededException

    +

    An HTTP/1 header block exceeded MaxHeaderCount or MaxHeaderAggregateBytes +while HeaderLimits was Enforce. Not an IOException, +so it is not treated as a client disconnect.

    HttpWebClient

    Used to communicate with the server over HTTP(S)

    diff --git a/docs/api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html b/docs/api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html index 66f3c2701..335e05cdc 100644 --- a/docs/api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html +++ b/docs/api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html @@ -418,6 +418,55 @@
    Returns
    + + | + Edit this page + + + View Source + + +

    WithAllowAmbiguousFraming(bool)

    +

    Returns a snapshot identical to this one with AllowAmbiguousFraming set explicitly. +A partial config overlay uses this so an omitted flag does not clear a value set by the profile.

    +
    +
    +
    Declaration
    +
    +
    public ProxyPolicyModes WithAllowAmbiguousFraming(bool enabled)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + +
    TypeNameDescription
    boolenabled
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyPolicyModes
    | Edit this page diff --git a/docs/api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html b/docs/api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html index fe7974958..d2bd86435 100644 --- a/docs/api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html +++ b/docs/api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html @@ -134,6 +134,68 @@
    Syntax
    public sealed class ProxyResourceLimits
    +

    Fields +

    + + | + Edit this page + + + View Source + +

    MaxDeferredOutboundBytesCeiling

    +

    Upper bound for MaxDeferredOutboundBytesPerStream.

    +
    +
    +
    Declaration
    +
    +
    public const int MaxDeferredOutboundBytesCeiling = 67108864
    +
    +
    Field Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    + + | + Edit this page + + + View Source + +

    MaxHttp3FramePayloadCeiling

    +

    Upper bound for MaxHttp3FramePayloadBytes.

    +
    +
    +
    Declaration
    +
    +
    public const long MaxHttp3FramePayloadCeiling = 67108864
    +
    +
    Field Value
    + + + + + + + + + + + + + +
    TypeDescription
    long

    Properties

    @@ -175,7 +237,7 @@
    Property Value
    Edit this page
    - View Source + View Source

    Default

    @@ -217,6 +279,68 @@
    Property Value
    + + | + Edit this page + + + View Source + + +

    Http2WindowUpdateTimeoutSeconds

    +

    Seconds to wait for an HTTP/2 WINDOW_UPDATE before failing the stream. Default 60.

    +
    +
    +
    Declaration
    +
    +
    public int Http2WindowUpdateTimeoutSeconds { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    + + | + Edit this page + + + View Source + + +

    MaxAuthChallengeRounds

    +

    Maximum Windows/proxy authentication challenge rounds per request. Default 3.

    +
    +
    +
    Declaration
    +
    +
    public int MaxAuthChallengeRounds { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    | Edit this page @@ -457,6 +581,38 @@
    Property Value
    + + | + Edit this page + + + View Source + + +

    MaxDeferredOutboundBytesPerStream

    +

    Bytes of HTTP/2 DATA that may be parked per stream waiting for send-window credit. +Worst-case memory is concurrent streams times this value. Default 4 MiB + 16 KiB. Ceiling 64 MiB.

    +
    +
    +
    Declaration
    +
    +
    public int MaxDeferredOutboundBytesPerStream { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    | Edit this page @@ -582,6 +738,99 @@
    Property Value
    + + | + Edit this page + + + View Source + + +

    MaxHttp2CompressedHeaderBlockBytes

    +

    Maximum compressed HTTP/2 header block (HEADERS + CONTINUATION) in bytes. Default 256 KiB.

    +
    +
    +
    Declaration
    +
    +
    public int MaxHttp2CompressedHeaderBlockBytes { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    + + | + Edit this page + + + View Source + + +

    MaxHttp3FramePayloadBytes

    +

    Maximum HTTP/3 frame payload accepted before H3_EXCESSIVE_LOAD. Default 4 MiB. Ceiling 64 MiB.

    +
    +
    +
    Declaration
    +
    +
    public long MaxHttp3FramePayloadBytes { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    long
    + + | + Edit this page + + + View Source + + +

    MaxInterimResponses

    +

    Maximum interim (1xx) responses accepted from one origin before the stream fails. Default 20.

    +
    +
    +
    Declaration
    +
    +
    public int MaxInterimResponses { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    | Edit this page @@ -717,68 +966,192 @@
    Property Value
    -

    Methods -

    | - Edit this page + Edit this page - View Source + View Source - -

    Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?)

    -

    Validates and constructs a ProxyResourceLimits snapshot. Every non-nullable -bound must be strictly positive; every nullable bound, if supplied, must also be strictly -positive (use null to disable rather than a sentinel number).

    + +

    MaxTrailerHeaderBlockBytes

    +

    Maximum trailer header block size in bytes. Default 16 KiB.

    Declaration
    -
    public static ProxyResourceLimits Create(long maxHeaderLineBytes, int maxHeaderCount, long maxHeaderAggregateBytes, long? maxEncodedBodyBytes, long? maxDecodedBodyBytes, double? maxDecompressionRatio, int? maxConcurrentClients, int maxConcurrentStreamsPerConnection, int? maxPeerInitiatedIncompleteStreamResets, int maxOpenHeaderBlockFrames, TimeSpan maxOpenHeaderBlockDuration, bool connectionPoolingEnabled, int maxCachedConnectionsPerHost, int? maxCertificateCacheEntries)
    +
    public int MaxTrailerHeaderBlockBytes { get; }
    -
    Parameters
    +
    Property Value
    - - - - - - - - - - - - - - - - - + +
    TypeName Description
    longmaxHeaderLineBytes
    intmaxHeaderCount
    longmaxHeaderAggregateBytes
    long?maxEncodedBodyBytes
    + + | + Edit this page + + + View Source + + +

    MaxTrailerHeaderCount

    +

    Maximum trailer header fields on one chunked message. Default 100.

    +
    +
    +
    Declaration
    +
    +
    public int MaxTrailerHeaderCount { get; }
    +
    +
    Property Value
    + + - - - + + + + - - + - - + +
    long?maxDecodedBodyBytesTypeDescription
    double?maxDecompressionRatioint
    int?
    + + | + Edit this page + + + View Source + + +

    MaxUpstreamProxyAuthenticationAttempts

    +

    Maximum CONNECT authentication attempts against an upstream proxy. Default 5.

    +
    +
    +
    Declaration
    +
    +
    public int MaxUpstreamProxyAuthenticationAttempts { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    + + | + Edit this page + + + View Source + + +

    MaxWinAuthTokenBytes

    +

    Maximum SSPI token buffer in bytes. Default 12288.

    +
    +
    +
    Declaration
    +
    +
    public int MaxWinAuthTokenBytes { get; }
    +
    +
    Property Value
    + + + + + + + + + + + + + +
    TypeDescription
    int
    +

    Methods +

    + + | + Edit this page + + + View Source + + +

    Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?)

    +

    Validates and constructs a ProxyResourceLimits snapshot. Every non-nullable +bound must be strictly positive; every nullable bound, if supplied, must also be strictly +positive (use null to disable rather than a sentinel number).

    +
    +
    +
    Declaration
    +
    +
    public static ProxyResourceLimits Create(long maxHeaderLineBytes, int maxHeaderCount, long maxHeaderAggregateBytes, long? maxEncodedBodyBytes, long? maxDecodedBodyBytes, double? maxDecompressionRatio, int? maxConcurrentClients, int maxConcurrentStreamsPerConnection, int? maxPeerInitiatedIncompleteStreamResets, int maxOpenHeaderBlockFrames, TimeSpan maxOpenHeaderBlockDuration, bool connectionPoolingEnabled, int maxCachedConnectionsPerHost, int? maxCertificateCacheEntries)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -850,12 +1223,70 @@
    Exceptions
    TypeNameDescription
    longmaxHeaderLineBytes
    intmaxHeaderCount
    longmaxHeaderAggregateBytes
    long?maxEncodedBodyBytes
    long?maxDecodedBodyBytes
    double?maxDecompressionRatio
    int? maxConcurrentClients
    + + | + Edit this page + + + View Source + + +

    WithAuthenticationBounds(int, int, int)

    +

    Returns a copy with authentication bounds replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithAuthenticationBounds(int maxAuthChallengeRounds, int maxUpstreamProxyAuthenticationAttempts, int maxWinAuthTokenBytes)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescription
    intmaxAuthChallengeRounds
    intmaxUpstreamProxyAuthenticationAttempts
    intmaxWinAuthTokenBytes
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    | Edit this page - View Source + View Source

    WithCertificateCacheBounds(int?, int?)

    @@ -925,12 +1356,60 @@
    Exceptions
    + + | + Edit this page + + + View Source + + +

    WithHttp2WindowUpdateTimeoutSeconds(int)

    +

    Returns a copy with Http2WindowUpdateTimeoutSeconds replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithHttp2WindowUpdateTimeoutSeconds(int http2WindowUpdateTimeoutSeconds)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + +
    TypeNameDescription
    inthttp2WindowUpdateTimeoutSeconds
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    | Edit this page - View Source + View Source

    WithMaxConcurrentStreamsPerConnection(int)

    @@ -973,12 +1452,204 @@
    Returns
    + + | + Edit this page + + + View Source + + +

    WithMaxDeferredOutboundBytesPerStream(int)

    +

    Returns a copy with MaxDeferredOutboundBytesPerStream replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithMaxDeferredOutboundBytesPerStream(int maxDeferredOutboundBytesPerStream)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + +
    TypeNameDescription
    intmaxDeferredOutboundBytesPerStream
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    + + | + Edit this page + + + View Source + + +

    WithMaxHttp2CompressedHeaderBlockBytes(int)

    +

    Returns a copy with MaxHttp2CompressedHeaderBlockBytes replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithMaxHttp2CompressedHeaderBlockBytes(int maxHttp2CompressedHeaderBlockBytes)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + +
    TypeNameDescription
    intmaxHttp2CompressedHeaderBlockBytes
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    + + | + Edit this page + + + View Source + + +

    WithMaxHttp3FramePayloadBytes(long)

    +

    Returns a copy with MaxHttp3FramePayloadBytes replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithMaxHttp3FramePayloadBytes(long maxHttp3FramePayloadBytes)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + +
    TypeNameDescription
    longmaxHttp3FramePayloadBytes
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    + + | + Edit this page + + + View Source + + +

    WithMaxInterimResponses(int)

    +

    Returns a copy with MaxInterimResponses replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithMaxInterimResponses(int maxInterimResponses)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + +
    TypeNameDescription
    intmaxInterimResponses
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    | Edit this page - View Source + View Source

    WithMaxOriginHttp2ConnectionsPerAuthority(int)

    @@ -1021,6 +1692,59 @@
    Returns
    + + | + Edit this page + + + View Source + + +

    WithTrailerHeaderBounds(int, int)

    +

    Returns a copy with trailer header bounds replaced.

    +
    +
    +
    Declaration
    +
    +
    public ProxyResourceLimits WithTrailerHeaderBounds(int maxTrailerHeaderCount, int maxTrailerHeaderBlockBytes)
    +
    +
    Parameters
    + + + + + + + + + + + + + + + + + + + + +
    TypeNameDescription
    intmaxTrailerHeaderCount
    intmaxTrailerHeaderBlockBytes
    +
    Returns
    + + + + + + + + + + + + + +
    TypeDescription
    ProxyResourceLimits
    diff --git a/docs/api/Titanium.Web.Proxy.ProxyServer.html b/docs/api/Titanium.Web.Proxy.ProxyServer.html index 757fd157c..7923eeb58 100644 --- a/docs/api/Titanium.Web.Proxy.ProxyServer.html +++ b/docs/api/Titanium.Web.Proxy.ProxyServer.html @@ -259,7 +259,7 @@

    Fields Edit this page - View Source + View Source

    DefaultViaHeaderPseudonym

    Default Via header pseudonym (RFC 9110 §7.6.3). Used by ViaHeaderPseudonym @@ -292,7 +292,7 @@

    Properties Edit this page - View Source + View Source

    AdmittedClientConnectionCount

    @@ -326,7 +326,7 @@
    Property Value
    Edit this page - View Source + View Source

    BlockLoopbackDestinations

    @@ -375,7 +375,7 @@
    Property Value
    Edit this page - View Source + View Source

    BlockPrivateNetworkDestinations

    @@ -427,7 +427,7 @@
    Property Value
    Edit this page - View Source + View Source

    BufferPool

    @@ -461,7 +461,7 @@
    Property Value
    Edit this page - View Source + View Source

    CertificateManager

    @@ -492,7 +492,7 @@
    Property Value
    Edit this page - View Source + View Source

    CheckCertificateRevocation

    @@ -524,7 +524,7 @@
    Property Value
    Edit this page - View Source + View Source

    ClientConnectionCount

    @@ -556,7 +556,7 @@
    Property Value
    Edit this page - View Source + View Source

    ClientHeaderTimeoutSeconds

    @@ -596,7 +596,7 @@
    Property Value
    Edit this page - View Source + View Source

    CompatibilityMode100Continue

    @@ -634,7 +634,7 @@
    Property Value
    Edit this page - View Source + View Source

    ConnectTimeOutSeconds

    @@ -666,7 +666,7 @@
    Property Value
    Edit this page - View Source + View Source

    ConnectionTimeOutSeconds

    @@ -699,7 +699,7 @@
    Property Value
    Edit this page - View Source + View Source

    CustomUpStreamProxyFailureFunc

    @@ -826,7 +826,7 @@
    Property Value
    Edit this page - View Source + View Source

    DnsServerEndPoint

    @@ -866,7 +866,7 @@
    Property Value
    Edit this page - View Source + View Source

    Enable100ContinueBehaviour

    @@ -899,7 +899,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableConnectionPool

    @@ -1020,7 +1020,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableHttp3

    @@ -1076,7 +1076,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableHttpInterception

    @@ -1109,7 +1109,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableHttpsSvcbDnsDiscovery

    @@ -1151,7 +1151,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableIpv6UnreachableSoftSkip

    @@ -1186,7 +1186,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableQpackDynamicTable

    @@ -1221,7 +1221,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableRequestTimingCapture

    @@ -1268,7 +1268,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableRfc8441

    @@ -1314,7 +1314,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableTcpKeepAlive

    @@ -1346,7 +1346,7 @@
    Property Value
    Edit this page - View Source + View Source

    EnableTcpServerConnectionPrefetch

    @@ -1417,7 +1417,7 @@
    Property Value
    Edit this page - View Source + View Source

    EndpointAdmissionRejectionCount

    @@ -1481,7 +1481,7 @@
    Property Value
    Edit this page - View Source + View Source

    GetCustomUpStreamProxyFunc

    @@ -1513,7 +1513,7 @@
    Property Value
    Edit this page - View Source + View Source

    GlobalAdmissionRejectionCount

    @@ -1545,7 +1545,7 @@
    Property Value
    Edit this page - View Source + View Source

    Http3ClientConnectionCount

    @@ -1576,7 +1576,7 @@
    Property Value
    Edit this page - View Source + View Source

    Http3ServerConnectionCount

    @@ -1608,7 +1608,7 @@
    Property Value
    Edit this page - View Source + View Source

    HttpResponseCacheFiller

    @@ -1641,7 +1641,7 @@
    Property Value
    Edit this page - View Source + View Source

    IdleReadTimeoutSeconds

    @@ -1674,7 +1674,7 @@
    Property Value
    Edit this page - View Source + View Source

    IdleWriteTimeoutSeconds

    @@ -1707,7 +1707,7 @@
    Property Value
    Edit this page - View Source + View Source

    IgnoreServerCertificateErrors

    @@ -1741,7 +1741,7 @@
    Property Value
    Edit this page - View Source + View Source

    ListenerBackLog

    @@ -1772,7 +1772,7 @@
    Property Value
    Edit this page - View Source + View Source

    Logger

    @@ -1804,7 +1804,7 @@
    Property Value
    Edit this page - View Source + View Source

    Logging

    @@ -1845,7 +1845,7 @@
    Property Value
    Edit this page - View Source + View Source

    MaxBufferedBodyBytes

    @@ -1882,7 +1882,7 @@
    Property Value
    Edit this page - View Source + View Source

    MaxCachedConnections

    @@ -1936,7 +1936,7 @@
    Exceptions
    Edit this page - View Source + View Source

    MaxConcurrentClientConnections

    @@ -1976,7 +1976,7 @@
    Property Value
    Edit this page - View Source + View Source

    MaxConcurrentHttp11HttpsOriginCreates

    @@ -2027,7 +2027,7 @@
    Exceptions
    Edit this page - View Source + View Source

    MaxDecodedHeaderListBytes

    @@ -2062,7 +2062,7 @@
    Property Value
    Edit this page - View Source + View Source

    MaxWebSocketFramePayloadBytes

    @@ -2133,7 +2133,7 @@
    Property Value
    Edit this page - View Source + View Source

    NoDelay

    @@ -2165,7 +2165,7 @@
    Property Value
    Edit this page - View Source + View Source

    OriginHttpVersionPolicy

    @@ -2204,7 +2204,7 @@
    Property Value
    Edit this page - View Source + View Source

    PolicyModes

    @@ -2250,7 +2250,7 @@
    Property Value
    Edit this page - View Source + View Source

    Profile

    @@ -2296,7 +2296,7 @@
    Property Value
    Edit this page - View Source + View Source

    ProxyAuthenticationRealm

    @@ -2327,7 +2327,7 @@
    Property Value
    Edit this page - View Source + View Source

    ProxyAuthenticationSchemes

    @@ -2360,7 +2360,7 @@
    Property Value
    Edit this page - View Source + View Source

    ProxyBasicAuthenticateFunc

    @@ -2393,7 +2393,7 @@
    Property Value
    Edit this page - View Source + View Source

    ProxyEndPoints

    @@ -2455,7 +2455,7 @@
    Property Value
    Edit this page - View Source + View Source

    ProxySchemeAuthenticateFunc

    @@ -2489,7 +2489,7 @@
    Property Value
    Edit this page - View Source + View Source

    RequestTimeoutSeconds

    @@ -2523,7 +2523,7 @@
    Property Value
    Edit this page - View Source + View Source

    ResourceLimits

    @@ -2564,7 +2564,7 @@
    Property Value
    Edit this page - View Source + View Source

    ResponseHeaderContributor

    @@ -2596,7 +2596,7 @@
    Property Value
    Edit this page - View Source + View Source

    ResponseHeaderTimeoutSeconds

    @@ -2636,7 +2636,7 @@
    Property Value
    Edit this page - View Source + View Source

    ReuseSocket

    @@ -2669,7 +2669,7 @@
    Property Value
    Edit this page - View Source + View Source

    ReverseProxy

    @@ -2701,7 +2701,7 @@
    Property Value
    Edit this page - View Source + View Source

    ServerConnectionCount

    @@ -2733,7 +2733,7 @@
    Property Value
    Edit this page - View Source + View Source

    ShouldInterceptHttp

    @@ -2767,7 +2767,7 @@
    Property Value
    Edit this page - View Source + View Source

    SupportedServerSslProtocols

    @@ -2808,7 +2808,7 @@
    Property Value
    Edit this page - View Source + View Source

    SupportedSslProtocols

    @@ -2846,7 +2846,7 @@
    Property Value
    Edit this page - View Source + View Source

    TcpTimeWaitSeconds

    @@ -2882,7 +2882,7 @@
    Property Value
    Edit this page - View Source + View Source

    ThreadPoolWorkerThread

    @@ -2915,7 +2915,7 @@
    Property Value
    Edit this page - View Source + View Source

    UpStreamEndPoint

    @@ -2950,7 +2950,7 @@
    Property Value
    Edit this page - View Source + View Source

    UpStreamEndPointIPv4

    @@ -2982,7 +2982,7 @@
    Property Value
    Edit this page - View Source + View Source

    UpStreamEndPointIPv6

    @@ -3014,7 +3014,7 @@
    Property Value
    Edit this page - View Source + View Source

    UpStreamHttpProxy

    @@ -3045,7 +3045,7 @@
    Property Value
    Edit this page - View Source + View Source

    UpStreamHttpsProxy

    @@ -3107,7 +3107,7 @@
    Property Value
    Edit this page - View Source + View Source

    ViaHeaderPseudonym

    @@ -3211,7 +3211,7 @@
    Parameters
    Edit this page - View Source + View Source

    ApplyLoggingConfiguration()

    @@ -3329,7 +3329,7 @@
    Parameters
    Edit this page - View Source + View Source

    Dispose()

    @@ -3345,7 +3345,7 @@
    Declaration
    Edit this page - View Source + View Source

    Dispose(bool)

    @@ -3791,7 +3791,7 @@
    Parameters
    Edit this page - View Source + View Source

    SetHttp3Enabled(bool)

    @@ -3935,7 +3935,7 @@
    Parameters
    Edit this page - View Source + View Source

    Stop()

    @@ -3954,7 +3954,7 @@
    Declaration
    Edit this page - View Source + View Source

    StopAsync(TimeSpan?)

    @@ -4084,7 +4084,7 @@
    Returns
    Edit this page - View Source + View Source

    TryEnableHttp3IfSupported()

    @@ -4210,7 +4210,7 @@

    Events Edit this page - View Source + View Source

    AfterResponse

    Intercept after response event from server.

    @@ -4240,7 +4240,7 @@
    Event Type
    Edit this page - View Source + View Source

    BeforeRequest

    Intercept request event to server.

    @@ -4270,7 +4270,7 @@
    Event Type
    Edit this page - View Source + View Source

    BeforeResponse

    Intercept response event from server.

    @@ -4300,7 +4300,7 @@
    Event Type
    Edit this page - View Source + View Source

    BeforeUpStreamConnectRequest

    Intercept connect request sent to upstream proxy.

    @@ -4330,7 +4330,7 @@
    Event Type
    Edit this page - View Source + View Source

    ClientCertificateSelectionCallback

    Event to override client certificate selection during mutual SSL authentication.

    @@ -4360,7 +4360,7 @@
    Event Type
    Edit this page - View Source + View Source

    ClientConnectionCountChanged

    Event occurs when client connection count changed.

    @@ -4421,7 +4421,7 @@
    Event Type
    Edit this page - View Source + View Source

    Http3ClientConnectionCountChanged

    Event occurs when inbound HTTP/3 client connection count changed.

    @@ -4451,7 +4451,7 @@
    Event Type
    Edit this page - View Source + View Source

    Http3ServerConnectionCountChanged

    Event occurs when upstream HTTP/3 server connection count changed.

    @@ -4481,7 +4481,7 @@
    Event Type
    Edit this page - View Source + View Source

    OnClientConnectionCreate

    Customize TcpClient used for client connection upon create.

    @@ -4511,7 +4511,7 @@
    Event Type
    Edit this page - View Source + View Source

    OnRequestBodyWrite

    Intercept request body send event to server. @@ -4543,7 +4543,7 @@

    Event Type
    Edit this page - View Source + View Source

    OnResponseBodyWrite

    Intercept response body send event to client. @@ -4575,7 +4575,7 @@

    Event Type
    Edit this page - View Source + View Source

    OnServerConnectionCreate

    Customize TcpClient used for server connection upon create.

    @@ -4605,7 +4605,7 @@
    Event Type
    Edit this page - View Source + View Source

    ServerCertificateValidationCallback

    Event to override the default verification logic of remote SSL certificate received during authentication.

    @@ -4635,7 +4635,7 @@
    Event Type
    Edit this page - View Source + View Source

    ServerConnectionCountChanged

    Event occurs when server connection count changed.

    diff --git a/docs/api/toc.html b/docs/api/toc.html index 0abf3c616..79a07af42 100644 --- a/docs/api/toc.html +++ b/docs/api/toc.html @@ -234,6 +234,9 @@
  • HeaderCollection.Enumerator
  • +
  • + HeaderLimitsExceededException +
  • HttpWebClient
  • diff --git a/docs/api/toc.json b/docs/api/toc.json index d50245d4b..0cfbe2781 100644 --- a/docs/api/toc.json +++ b/docs/api/toc.json @@ -1,2 +1,2 @@ -{"items":[{"name":"Titanium.Web.Proxy","href":"Titanium.Web.Proxy.html","topicHref":"Titanium.Web.Proxy.html","topicUid":"Titanium.Web.Proxy","type":"Namespace","items":[{"name":"ClientProcessId","href":"Titanium.Web.Proxy.ClientProcessId.html","topicHref":"Titanium.Web.Proxy.ClientProcessId.html","topicUid":"Titanium.Web.Proxy.ClientProcessId","type":"Class"},{"name":"MitmExclusionDefaults","href":"Titanium.Web.Proxy.MitmExclusionDefaults.html","topicHref":"Titanium.Web.Proxy.MitmExclusionDefaults.html","topicUid":"Titanium.Web.Proxy.MitmExclusionDefaults","type":"Class"},{"name":"MitmExclusionMode","href":"Titanium.Web.Proxy.MitmExclusionMode.html","topicHref":"Titanium.Web.Proxy.MitmExclusionMode.html","topicUid":"Titanium.Web.Proxy.MitmExclusionMode","type":"Enum"},{"name":"ProxyLimits","href":"Titanium.Web.Proxy.ProxyLimits.html","topicHref":"Titanium.Web.Proxy.ProxyLimits.html","topicUid":"Titanium.Web.Proxy.ProxyLimits","type":"Class"},{"name":"ProxyServer","href":"Titanium.Web.Proxy.ProxyServer.html","topicHref":"Titanium.Web.Proxy.ProxyServer.html","topicUid":"Titanium.Web.Proxy.ProxyServer","type":"Class"},{"name":"SystemProxyBypassRuleMode","href":"Titanium.Web.Proxy.SystemProxyBypassRuleMode.html","topicHref":"Titanium.Web.Proxy.SystemProxyBypassRuleMode.html","topicUid":"Titanium.Web.Proxy.SystemProxyBypassRuleMode","type":"Enum"},{"name":"SystemProxyChangeResult","href":"Titanium.Web.Proxy.SystemProxyChangeResult.html","topicHref":"Titanium.Web.Proxy.SystemProxyChangeResult.html","topicUid":"Titanium.Web.Proxy.SystemProxyChangeResult","type":"Struct"},{"name":"SystemProxyLoopbackPlacement","href":"Titanium.Web.Proxy.SystemProxyLoopbackPlacement.html","topicHref":"Titanium.Web.Proxy.SystemProxyLoopbackPlacement.html","topicUid":"Titanium.Web.Proxy.SystemProxyLoopbackPlacement","type":"Enum"},{"name":"SystemProxySettings","href":"Titanium.Web.Proxy.SystemProxySettings.html","topicHref":"Titanium.Web.Proxy.SystemProxySettings.html","topicUid":"Titanium.Web.Proxy.SystemProxySettings","type":"Class"},{"name":"WebSocketDecoder","href":"Titanium.Web.Proxy.WebSocketDecoder.html","topicHref":"Titanium.Web.Proxy.WebSocketDecoder.html","topicUid":"Titanium.Web.Proxy.WebSocketDecoder","type":"Class"},{"name":"WebSocketFrame","href":"Titanium.Web.Proxy.WebSocketFrame.html","topicHref":"Titanium.Web.Proxy.WebSocketFrame.html","topicUid":"Titanium.Web.Proxy.WebSocketFrame","type":"Class"},{"name":"WebSocketFrameEncoder","href":"Titanium.Web.Proxy.WebSocketFrameEncoder.html","topicHref":"Titanium.Web.Proxy.WebSocketFrameEncoder.html","topicUid":"Titanium.Web.Proxy.WebSocketFrameEncoder","type":"Class"},{"name":"WebSocketFrameWriter","href":"Titanium.Web.Proxy.WebSocketFrameWriter.html","topicHref":"Titanium.Web.Proxy.WebSocketFrameWriter.html","topicUid":"Titanium.Web.Proxy.WebSocketFrameWriter","type":"Class"},{"name":"WebSocketProtocolException","href":"Titanium.Web.Proxy.WebSocketProtocolException.html","topicHref":"Titanium.Web.Proxy.WebSocketProtocolException.html","topicUid":"Titanium.Web.Proxy.WebSocketProtocolException","type":"Class"},{"name":"WebsocketOpCode","href":"Titanium.Web.Proxy.WebsocketOpCode.html","topicHref":"Titanium.Web.Proxy.WebsocketOpCode.html","topicUid":"Titanium.Web.Proxy.WebsocketOpCode","type":"Enum"}]},{"name":"Titanium.Web.Proxy.Caching","href":"Titanium.Web.Proxy.Caching.html","topicHref":"Titanium.Web.Proxy.Caching.html","topicUid":"Titanium.Web.Proxy.Caching","type":"Namespace","items":[{"name":"HttpResponseCacheMiddleware","href":"Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.html","topicHref":"Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.html","topicUid":"Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware","type":"Class"},{"name":"MemoryHttpResponseCache","href":"Titanium.Web.Proxy.Caching.MemoryHttpResponseCache.html","topicHref":"Titanium.Web.Proxy.Caching.MemoryHttpResponseCache.html","topicUid":"Titanium.Web.Proxy.Caching.MemoryHttpResponseCache","type":"Class"}]},{"name":"Titanium.Web.Proxy.Clusters","href":"Titanium.Web.Proxy.Clusters.html","topicHref":"Titanium.Web.Proxy.Clusters.html","topicUid":"Titanium.Web.Proxy.Clusters","type":"Namespace","items":[{"name":"ClusterManager","href":"Titanium.Web.Proxy.Clusters.ClusterManager.html","topicHref":"Titanium.Web.Proxy.Clusters.ClusterManager.html","topicUid":"Titanium.Web.Proxy.Clusters.ClusterManager","type":"Class"},{"name":"DestinationHealthTracker","href":"Titanium.Web.Proxy.Clusters.DestinationHealthTracker.html","topicHref":"Titanium.Web.Proxy.Clusters.DestinationHealthTracker.html","topicUid":"Titanium.Web.Proxy.Clusters.DestinationHealthTracker","type":"Class"},{"name":"LoadBalancer","href":"Titanium.Web.Proxy.Clusters.LoadBalancer.html","topicHref":"Titanium.Web.Proxy.Clusters.LoadBalancer.html","topicUid":"Titanium.Web.Proxy.Clusters.LoadBalancer","type":"Class"}]},{"name":"Titanium.Web.Proxy.Diagnostics","href":"Titanium.Web.Proxy.Diagnostics.html","topicHref":"Titanium.Web.Proxy.Diagnostics.html","topicUid":"Titanium.Web.Proxy.Diagnostics","type":"Namespace","items":[{"name":"ClientTlsTiming","href":"Titanium.Web.Proxy.Diagnostics.ClientTlsTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.ClientTlsTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.ClientTlsTiming","type":"Class"},{"name":"HttpRequestTiming","href":"Titanium.Web.Proxy.Diagnostics.HttpRequestTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.HttpRequestTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.HttpRequestTiming","type":"Class"},{"name":"TunnelConnectTiming","href":"Titanium.Web.Proxy.Diagnostics.TunnelConnectTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.TunnelConnectTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.TunnelConnectTiming","type":"Class"},{"name":"UpstreamConnectionTiming","href":"Titanium.Web.Proxy.Diagnostics.UpstreamConnectionTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.UpstreamConnectionTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.UpstreamConnectionTiming","type":"Class"}]},{"name":"Titanium.Web.Proxy.EventArguments","href":"Titanium.Web.Proxy.EventArguments.html","topicHref":"Titanium.Web.Proxy.EventArguments.html","topicUid":"Titanium.Web.Proxy.EventArguments","type":"Namespace","items":[{"name":"AsyncEventHandler","href":"Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html","topicHref":"Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html","topicUid":"Titanium.Web.Proxy.EventArguments.AsyncEventHandler`1","type":"Delegate"},{"name":"BeforeBodyWriteEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeBodyWriteEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeBodyWriteEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeBodyWriteEventArgs","type":"Class"},{"name":"BeforeHttpAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeHttpAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeHttpAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeHttpAuthenticateEventArgs","type":"Class"},{"name":"BeforeQuicAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeQuicAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeQuicAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeQuicAuthenticateEventArgs","type":"Class"},{"name":"BeforeSslAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs","type":"Class"},{"name":"CertificateSelectionEventArgs","href":"Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs","type":"Class"},{"name":"CertificateValidationEventArgs","href":"Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs","type":"Class"},{"name":"MultipartRequestPartSentEventArgs","href":"Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs","type":"Class"},{"name":"ProxyEventArgsBase","href":"Titanium.Web.Proxy.EventArguments.ProxyEventArgsBase.html","topicHref":"Titanium.Web.Proxy.EventArguments.ProxyEventArgsBase.html","topicUid":"Titanium.Web.Proxy.EventArguments.ProxyEventArgsBase","type":"Class"},{"name":"SessionEventArgs","href":"Titanium.Web.Proxy.EventArguments.SessionEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.SessionEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.SessionEventArgs","type":"Class"},{"name":"SessionEventArgsBase","href":"Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html","topicHref":"Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html","topicUid":"Titanium.Web.Proxy.EventArguments.SessionEventArgsBase","type":"Class"},{"name":"SocksAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.SocksAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.SocksAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.SocksAuthenticateEventArgs","type":"Class"},{"name":"TunnelConnectFailureEventArgs","href":"Titanium.Web.Proxy.EventArguments.TunnelConnectFailureEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.TunnelConnectFailureEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.TunnelConnectFailureEventArgs","type":"Class"},{"name":"TunnelConnectSessionEventArgs","href":"Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs","type":"Class"},{"name":"WebSocketFrameDirection","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameDirection.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameDirection.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameDirection","type":"Enum"},{"name":"WebSocketFrameElidedEventArgs","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameElidedEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameElidedEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameElidedEventArgs","type":"Class"},{"name":"WebSocketFrameInterceptAction","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptAction.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptAction.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptAction","type":"Enum"},{"name":"WebSocketFrameInterceptEventArgs","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptEventArgs","type":"Class"}]},{"name":"Titanium.Web.Proxy.Exceptions","href":"Titanium.Web.Proxy.Exceptions.html","topicHref":"Titanium.Web.Proxy.Exceptions.html","topicUid":"Titanium.Web.Proxy.Exceptions","type":"Namespace","items":[{"name":"BodyNotFoundException","href":"Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html","topicHref":"Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html","topicUid":"Titanium.Web.Proxy.Exceptions.BodyNotFoundException","type":"Class"},{"name":"OutboundDestinationBlockedException","href":"Titanium.Web.Proxy.Exceptions.OutboundDestinationBlockedException.html","topicHref":"Titanium.Web.Proxy.Exceptions.OutboundDestinationBlockedException.html","topicUid":"Titanium.Web.Proxy.Exceptions.OutboundDestinationBlockedException","type":"Class"},{"name":"ProxyAuthorizationException","href":"Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException","type":"Class"},{"name":"ProxyConnectException","href":"Titanium.Web.Proxy.Exceptions.ProxyConnectException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyConnectException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyConnectException","type":"Class"},{"name":"ProxyException","href":"Titanium.Web.Proxy.Exceptions.ProxyException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyException","type":"Class"},{"name":"ProxyHttpException","href":"Titanium.Web.Proxy.Exceptions.ProxyHttpException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyHttpException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyHttpException","type":"Class"},{"name":"ProxyTimeoutException","href":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutException","type":"Class"},{"name":"ProxyTimeoutKind","href":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutKind.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutKind.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutKind","type":"Enum"},{"name":"UpstreamProxyConnectException","href":"Titanium.Web.Proxy.Exceptions.UpstreamProxyConnectException.html","topicHref":"Titanium.Web.Proxy.Exceptions.UpstreamProxyConnectException.html","topicUid":"Titanium.Web.Proxy.Exceptions.UpstreamProxyConnectException","type":"Class"}]},{"name":"Titanium.Web.Proxy.Helpers","href":"Titanium.Web.Proxy.Helpers.html","topicHref":"Titanium.Web.Proxy.Helpers.html","topicUid":"Titanium.Web.Proxy.Helpers","type":"Namespace","items":[{"name":"UnixProxyBypassMapper","href":"Titanium.Web.Proxy.Helpers.UnixProxyBypassMapper.html","topicHref":"Titanium.Web.Proxy.Helpers.UnixProxyBypassMapper.html","topicUid":"Titanium.Web.Proxy.Helpers.UnixProxyBypassMapper","type":"Class"}]},{"name":"Titanium.Web.Proxy.Http","href":"Titanium.Web.Proxy.Http.html","topicHref":"Titanium.Web.Proxy.Http.html","topicUid":"Titanium.Web.Proxy.Http","type":"Namespace","items":[{"name":"ConnectRequest","href":"Titanium.Web.Proxy.Http.ConnectRequest.html","topicHref":"Titanium.Web.Proxy.Http.ConnectRequest.html","topicUid":"Titanium.Web.Proxy.Http.ConnectRequest","type":"Class"},{"name":"ConnectResponse","href":"Titanium.Web.Proxy.Http.ConnectResponse.html","topicHref":"Titanium.Web.Proxy.Http.ConnectResponse.html","topicUid":"Titanium.Web.Proxy.Http.ConnectResponse","type":"Class"},{"name":"HeaderCollection","href":"Titanium.Web.Proxy.Http.HeaderCollection.html","topicHref":"Titanium.Web.Proxy.Http.HeaderCollection.html","topicUid":"Titanium.Web.Proxy.Http.HeaderCollection","type":"Class"},{"name":"HeaderCollection.Enumerator","href":"Titanium.Web.Proxy.Http.HeaderCollection.Enumerator.html","topicHref":"Titanium.Web.Proxy.Http.HeaderCollection.Enumerator.html","topicUid":"Titanium.Web.Proxy.Http.HeaderCollection.Enumerator","type":"Struct"},{"name":"HttpWebClient","href":"Titanium.Web.Proxy.Http.HttpWebClient.html","topicHref":"Titanium.Web.Proxy.Http.HttpWebClient.html","topicUid":"Titanium.Web.Proxy.Http.HttpWebClient","type":"Class"},{"name":"KnownHeader","href":"Titanium.Web.Proxy.Http.KnownHeader.html","topicHref":"Titanium.Web.Proxy.Http.KnownHeader.html","topicUid":"Titanium.Web.Proxy.Http.KnownHeader","type":"Class"},{"name":"KnownHeaders","href":"Titanium.Web.Proxy.Http.KnownHeaders.html","topicHref":"Titanium.Web.Proxy.Http.KnownHeaders.html","topicUid":"Titanium.Web.Proxy.Http.KnownHeaders","type":"Class"},{"name":"ProxyResults","href":"Titanium.Web.Proxy.Http.ProxyResults.html","topicHref":"Titanium.Web.Proxy.Http.ProxyResults.html","topicUid":"Titanium.Web.Proxy.Http.ProxyResults","type":"Class"},{"name":"Request","href":"Titanium.Web.Proxy.Http.Request.html","topicHref":"Titanium.Web.Proxy.Http.Request.html","topicUid":"Titanium.Web.Proxy.Http.Request","type":"Class"},{"name":"RequestResponseBase","href":"Titanium.Web.Proxy.Http.RequestResponseBase.html","topicHref":"Titanium.Web.Proxy.Http.RequestResponseBase.html","topicUid":"Titanium.Web.Proxy.Http.RequestResponseBase","type":"Class"},{"name":"Response","href":"Titanium.Web.Proxy.Http.Response.html","topicHref":"Titanium.Web.Proxy.Http.Response.html","topicUid":"Titanium.Web.Proxy.Http.Response","type":"Class"},{"name":"StreamingProxyResult","href":"Titanium.Web.Proxy.Http.StreamingProxyResult.html","topicHref":"Titanium.Web.Proxy.Http.StreamingProxyResult.html","topicUid":"Titanium.Web.Proxy.Http.StreamingProxyResult","type":"Struct"},{"name":"TunnelType","href":"Titanium.Web.Proxy.Http.TunnelType.html","topicHref":"Titanium.Web.Proxy.Http.TunnelType.html","topicUid":"Titanium.Web.Proxy.Http.TunnelType","type":"Enum"}]},{"name":"Titanium.Web.Proxy.Http.Responses","href":"Titanium.Web.Proxy.Http.Responses.html","topicHref":"Titanium.Web.Proxy.Http.Responses.html","topicUid":"Titanium.Web.Proxy.Http.Responses","type":"Namespace","items":[{"name":"GenericResponse","href":"Titanium.Web.Proxy.Http.Responses.GenericResponse.html","topicHref":"Titanium.Web.Proxy.Http.Responses.GenericResponse.html","topicUid":"Titanium.Web.Proxy.Http.Responses.GenericResponse","type":"Class"},{"name":"OkResponse","href":"Titanium.Web.Proxy.Http.Responses.OkResponse.html","topicHref":"Titanium.Web.Proxy.Http.Responses.OkResponse.html","topicUid":"Titanium.Web.Proxy.Http.Responses.OkResponse","type":"Class"},{"name":"RedirectResponse","href":"Titanium.Web.Proxy.Http.Responses.RedirectResponse.html","topicHref":"Titanium.Web.Proxy.Http.Responses.RedirectResponse.html","topicUid":"Titanium.Web.Proxy.Http.Responses.RedirectResponse","type":"Class"}]},{"name":"Titanium.Web.Proxy.Http3","href":"Titanium.Web.Proxy.Http3.html","topicHref":"Titanium.Web.Proxy.Http3.html","topicUid":"Titanium.Web.Proxy.Http3","type":"Namespace","items":[{"name":"Http3NativeBootstrap","href":"Titanium.Web.Proxy.Http3.Http3NativeBootstrap.html","topicHref":"Titanium.Web.Proxy.Http3.Http3NativeBootstrap.html","topicUid":"Titanium.Web.Proxy.Http3.Http3NativeBootstrap","type":"Class"}]},{"name":"Titanium.Web.Proxy.Logging","href":"Titanium.Web.Proxy.Logging.html","topicHref":"Titanium.Web.Proxy.Logging.html","topicUid":"Titanium.Web.Proxy.Logging","type":"Namespace","items":[{"name":"ProxyLoggingOptions","href":"Titanium.Web.Proxy.Logging.ProxyLoggingOptions.html","topicHref":"Titanium.Web.Proxy.Logging.ProxyLoggingOptions.html","topicUid":"Titanium.Web.Proxy.Logging.ProxyLoggingOptions","type":"Class"}]},{"name":"Titanium.Web.Proxy.Middleware","href":"Titanium.Web.Proxy.Middleware.html","topicHref":"Titanium.Web.Proxy.Middleware.html","topicUid":"Titanium.Web.Proxy.Middleware","type":"Namespace","items":[{"name":"ProxyMiddlewarePipeline","href":"Titanium.Web.Proxy.Middleware.ProxyMiddlewarePipeline.html","topicHref":"Titanium.Web.Proxy.Middleware.ProxyMiddlewarePipeline.html","topicUid":"Titanium.Web.Proxy.Middleware.ProxyMiddlewarePipeline","type":"Class"}]},{"name":"Titanium.Web.Proxy.Models","href":"Titanium.Web.Proxy.Models.html","topicHref":"Titanium.Web.Proxy.Models.html","topicUid":"Titanium.Web.Proxy.Models","type":"Namespace","items":[{"name":"DecryptFailureBypassEntry","href":"Titanium.Web.Proxy.Models.DecryptFailureBypassEntry.html","topicHref":"Titanium.Web.Proxy.Models.DecryptFailureBypassEntry.html","topicUid":"Titanium.Web.Proxy.Models.DecryptFailureBypassEntry","type":"Class"},{"name":"ExplicitProxyEndPoint","href":"Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.ExplicitProxyEndPoint","type":"Class"},{"name":"ExternalProxy","href":"Titanium.Web.Proxy.Models.ExternalProxy.html","topicHref":"Titanium.Web.Proxy.Models.ExternalProxy.html","topicUid":"Titanium.Web.Proxy.Models.ExternalProxy","type":"Class"},{"name":"ExternalProxyType","href":"Titanium.Web.Proxy.Models.ExternalProxyType.html","topicHref":"Titanium.Web.Proxy.Models.ExternalProxyType.html","topicUid":"Titanium.Web.Proxy.Models.ExternalProxyType","type":"Enum"},{"name":"HttpHeader","href":"Titanium.Web.Proxy.Models.HttpHeader.html","topicHref":"Titanium.Web.Proxy.Models.HttpHeader.html","topicUid":"Titanium.Web.Proxy.Models.HttpHeader","type":"Class"},{"name":"HttpInterceptionContext","href":"Titanium.Web.Proxy.Models.HttpInterceptionContext.html","topicHref":"Titanium.Web.Proxy.Models.HttpInterceptionContext.html","topicUid":"Titanium.Web.Proxy.Models.HttpInterceptionContext","type":"Struct"},{"name":"IExternalProxy","href":"Titanium.Web.Proxy.Models.IExternalProxy.html","topicHref":"Titanium.Web.Proxy.Models.IExternalProxy.html","topicUid":"Titanium.Web.Proxy.Models.IExternalProxy","type":"Interface"},{"name":"OriginHttpVersionPolicy","href":"Titanium.Web.Proxy.Models.OriginHttpVersionPolicy.html","topicHref":"Titanium.Web.Proxy.Models.OriginHttpVersionPolicy.html","topicUid":"Titanium.Web.Proxy.Models.OriginHttpVersionPolicy","type":"Enum"},{"name":"ProxyAuthenticationContext","href":"Titanium.Web.Proxy.Models.ProxyAuthenticationContext.html","topicHref":"Titanium.Web.Proxy.Models.ProxyAuthenticationContext.html","topicUid":"Titanium.Web.Proxy.Models.ProxyAuthenticationContext","type":"Class"},{"name":"ProxyAuthenticationResult","href":"Titanium.Web.Proxy.Models.ProxyAuthenticationResult.html","topicHref":"Titanium.Web.Proxy.Models.ProxyAuthenticationResult.html","topicUid":"Titanium.Web.Proxy.Models.ProxyAuthenticationResult","type":"Enum"},{"name":"ProxyEndPoint","href":"Titanium.Web.Proxy.Models.ProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.ProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.ProxyEndPoint","type":"Class"},{"name":"ProxyProtocolType","href":"Titanium.Web.Proxy.Models.ProxyProtocolType.html","topicHref":"Titanium.Web.Proxy.Models.ProxyProtocolType.html","topicUid":"Titanium.Web.Proxy.Models.ProxyProtocolType","type":"Enum"},{"name":"SocksProxyEndPoint","href":"Titanium.Web.Proxy.Models.SocksProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.SocksProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.SocksProxyEndPoint","type":"Class"},{"name":"TransparentBaseProxyEndPoint","href":"Titanium.Web.Proxy.Models.TransparentBaseProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.TransparentBaseProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.TransparentBaseProxyEndPoint","type":"Class"},{"name":"TransparentProxyEndPoint","href":"Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.TransparentProxyEndPoint","type":"Class"},{"name":"TransparentQuicProxyEndPoint","href":"Titanium.Web.Proxy.Models.TransparentQuicProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.TransparentQuicProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.TransparentQuicProxyEndPoint","type":"Class"},{"name":"UpstreamHttpProtocol","href":"Titanium.Web.Proxy.Models.UpstreamHttpProtocol.html","topicHref":"Titanium.Web.Proxy.Models.UpstreamHttpProtocol.html","topicUid":"Titanium.Web.Proxy.Models.UpstreamHttpProtocol","type":"Enum"},{"name":"WinAuthCredentials","href":"Titanium.Web.Proxy.Models.WinAuthCredentials.html","topicHref":"Titanium.Web.Proxy.Models.WinAuthCredentials.html","topicUid":"Titanium.Web.Proxy.Models.WinAuthCredentials","type":"Class"}]},{"name":"Titanium.Web.Proxy.Network","href":"Titanium.Web.Proxy.Network.html","topicHref":"Titanium.Web.Proxy.Network.html","topicUid":"Titanium.Web.Proxy.Network","type":"Namespace","items":[{"name":"CertificateEngine","href":"Titanium.Web.Proxy.Network.CertificateEngine.html","topicHref":"Titanium.Web.Proxy.Network.CertificateEngine.html","topicUid":"Titanium.Web.Proxy.Network.CertificateEngine","type":"Enum"},{"name":"CertificateKeyAlgorithm","href":"Titanium.Web.Proxy.Network.CertificateKeyAlgorithm.html","topicHref":"Titanium.Web.Proxy.Network.CertificateKeyAlgorithm.html","topicUid":"Titanium.Web.Proxy.Network.CertificateKeyAlgorithm","type":"Enum"},{"name":"CertificateManager","href":"Titanium.Web.Proxy.Network.CertificateManager.html","topicHref":"Titanium.Web.Proxy.Network.CertificateManager.html","topicUid":"Titanium.Web.Proxy.Network.CertificateManager","type":"Class"},{"name":"CertificateOsTrustKind","href":"Titanium.Web.Proxy.Network.CertificateOsTrustKind.html","topicHref":"Titanium.Web.Proxy.Network.CertificateOsTrustKind.html","topicUid":"Titanium.Web.Proxy.Network.CertificateOsTrustKind","type":"Enum"},{"name":"CertificateOsTrustResult","href":"Titanium.Web.Proxy.Network.CertificateOsTrustResult.html","topicHref":"Titanium.Web.Proxy.Network.CertificateOsTrustResult.html","topicUid":"Titanium.Web.Proxy.Network.CertificateOsTrustResult","type":"Class"},{"name":"DefaultCertificateDiskCache","href":"Titanium.Web.Proxy.Network.DefaultCertificateDiskCache.html","topicHref":"Titanium.Web.Proxy.Network.DefaultCertificateDiskCache.html","topicUid":"Titanium.Web.Proxy.Network.DefaultCertificateDiskCache","type":"Class"},{"name":"FirefoxCertificateTrust","href":"Titanium.Web.Proxy.Network.FirefoxCertificateTrust.html","topicHref":"Titanium.Web.Proxy.Network.FirefoxCertificateTrust.html","topicUid":"Titanium.Web.Proxy.Network.FirefoxCertificateTrust","type":"Class"},{"name":"ICertificateCache","href":"Titanium.Web.Proxy.Network.ICertificateCache.html","topicHref":"Titanium.Web.Proxy.Network.ICertificateCache.html","topicUid":"Titanium.Web.Proxy.Network.ICertificateCache","type":"Interface"}]},{"name":"Titanium.Web.Proxy.Network.Quic","href":"Titanium.Web.Proxy.Network.Quic.html","topicHref":"Titanium.Web.Proxy.Network.Quic.html","topicUid":"Titanium.Web.Proxy.Network.Quic","type":"Namespace","items":[{"name":"IOriginalDestinationResolver","href":"Titanium.Web.Proxy.Network.Quic.IOriginalDestinationResolver.html","topicHref":"Titanium.Web.Proxy.Network.Quic.IOriginalDestinationResolver.html","topicUid":"Titanium.Web.Proxy.Network.Quic.IOriginalDestinationResolver","type":"Interface"}]},{"name":"Titanium.Web.Proxy.Options","href":"Titanium.Web.Proxy.Options.html","topicHref":"Titanium.Web.Proxy.Options.html","topicUid":"Titanium.Web.Proxy.Options","type":"Namespace","items":[{"name":"PolicyFamily","href":"Titanium.Web.Proxy.Options.PolicyFamily.html","topicHref":"Titanium.Web.Proxy.Options.PolicyFamily.html","topicUid":"Titanium.Web.Proxy.Options.PolicyFamily","type":"Enum"},{"name":"PolicyMode","href":"Titanium.Web.Proxy.Options.PolicyMode.html","topicHref":"Titanium.Web.Proxy.Options.PolicyMode.html","topicUid":"Titanium.Web.Proxy.Options.PolicyMode","type":"Enum"},{"name":"ProxyPolicyModes","href":"Titanium.Web.Proxy.Options.ProxyPolicyModes.html","topicHref":"Titanium.Web.Proxy.Options.ProxyPolicyModes.html","topicUid":"Titanium.Web.Proxy.Options.ProxyPolicyModes","type":"Class"},{"name":"ProxyProfile","href":"Titanium.Web.Proxy.Options.ProxyProfile.html","topicHref":"Titanium.Web.Proxy.Options.ProxyProfile.html","topicUid":"Titanium.Web.Proxy.Options.ProxyProfile","type":"Enum"},{"name":"ProxyProfileSettings","href":"Titanium.Web.Proxy.Options.ProxyProfileSettings.html","topicHref":"Titanium.Web.Proxy.Options.ProxyProfileSettings.html","topicUid":"Titanium.Web.Proxy.Options.ProxyProfileSettings","type":"Class"},{"name":"ProxyResourceLimits","href":"Titanium.Web.Proxy.Options.ProxyResourceLimits.html","topicHref":"Titanium.Web.Proxy.Options.ProxyResourceLimits.html","topicUid":"Titanium.Web.Proxy.Options.ProxyResourceLimits","type":"Class"},{"name":"ProxyTimeoutOptions","href":"Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html","topicHref":"Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html","topicUid":"Titanium.Web.Proxy.Options.ProxyTimeoutOptions","type":"Class"},{"name":"ResolvedSessionPolicy","href":"Titanium.Web.Proxy.Options.ResolvedSessionPolicy.html","topicHref":"Titanium.Web.Proxy.Options.ResolvedSessionPolicy.html","topicUid":"Titanium.Web.Proxy.Options.ResolvedSessionPolicy","type":"Class"}]},{"name":"Titanium.Web.Proxy.Routing","href":"Titanium.Web.Proxy.Routing.html","topicHref":"Titanium.Web.Proxy.Routing.html","topicUid":"Titanium.Web.Proxy.Routing","type":"Namespace","items":[{"name":"ReverseProxyFastPath","href":"Titanium.Web.Proxy.Routing.ReverseProxyFastPath.html","topicHref":"Titanium.Web.Proxy.Routing.ReverseProxyFastPath.html","topicUid":"Titanium.Web.Proxy.Routing.ReverseProxyFastPath","type":"Class"},{"name":"RouteMatcher","href":"Titanium.Web.Proxy.Routing.RouteMatcher.html","topicHref":"Titanium.Web.Proxy.Routing.RouteMatcher.html","topicUid":"Titanium.Web.Proxy.Routing.RouteMatcher","type":"Class"}]},{"name":"Titanium.Web.Proxy.StreamExtended","href":"Titanium.Web.Proxy.StreamExtended.html","topicHref":"Titanium.Web.Proxy.StreamExtended.html","topicUid":"Titanium.Web.Proxy.StreamExtended","type":"Namespace","items":[{"name":"ClientHelloInfo","href":"Titanium.Web.Proxy.StreamExtended.ClientHelloInfo.html","topicHref":"Titanium.Web.Proxy.StreamExtended.ClientHelloInfo.html","topicUid":"Titanium.Web.Proxy.StreamExtended.ClientHelloInfo","type":"Class"},{"name":"ServerHelloInfo","href":"Titanium.Web.Proxy.StreamExtended.ServerHelloInfo.html","topicHref":"Titanium.Web.Proxy.StreamExtended.ServerHelloInfo.html","topicUid":"Titanium.Web.Proxy.StreamExtended.ServerHelloInfo","type":"Class"}]},{"name":"Titanium.Web.Proxy.StreamExtended.BufferPool","href":"Titanium.Web.Proxy.StreamExtended.BufferPool.html","topicHref":"Titanium.Web.Proxy.StreamExtended.BufferPool.html","topicUid":"Titanium.Web.Proxy.StreamExtended.BufferPool","type":"Namespace","items":[{"name":"IBufferPool","href":"Titanium.Web.Proxy.StreamExtended.BufferPool.IBufferPool.html","topicHref":"Titanium.Web.Proxy.StreamExtended.BufferPool.IBufferPool.html","topicUid":"Titanium.Web.Proxy.StreamExtended.BufferPool.IBufferPool","type":"Interface"}]},{"name":"Titanium.Web.Proxy.StreamExtended.Models","href":"Titanium.Web.Proxy.StreamExtended.Models.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Models.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Models","type":"Namespace","items":[{"name":"SslExtension","href":"Titanium.Web.Proxy.StreamExtended.Models.SslExtension.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Models.SslExtension.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Models.SslExtension","type":"Class"}]},{"name":"Titanium.Web.Proxy.StreamExtended.Network","href":"Titanium.Web.Proxy.StreamExtended.Network.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network","type":"Namespace","items":[{"name":"DataEventArgs","href":"Titanium.Web.Proxy.StreamExtended.Network.DataEventArgs.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.DataEventArgs.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.DataEventArgs","type":"Class"},{"name":"IHttpStreamReader","href":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamReader.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamReader.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamReader","type":"Interface"},{"name":"IHttpStreamWriter","href":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamWriter.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamWriter.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamWriter","type":"Interface"},{"name":"ILineStream","href":"Titanium.Web.Proxy.StreamExtended.Network.ILineStream.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.ILineStream.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.ILineStream","type":"Interface"},{"name":"IPeekStream","href":"Titanium.Web.Proxy.StreamExtended.Network.IPeekStream.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.IPeekStream.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.IPeekStream","type":"Interface"}]},{"name":"Titanium.Web.Proxy.Transforms","href":"Titanium.Web.Proxy.Transforms.html","topicHref":"Titanium.Web.Proxy.Transforms.html","topicUid":"Titanium.Web.Proxy.Transforms","type":"Namespace","items":[{"name":"TransformEngine","href":"Titanium.Web.Proxy.Transforms.TransformEngine.html","topicHref":"Titanium.Web.Proxy.Transforms.TransformEngine.html","topicUid":"Titanium.Web.Proxy.Transforms.TransformEngine","type":"Class"}]}],"memberLayout":"SamePage"} +{"items":[{"name":"Titanium.Web.Proxy","href":"Titanium.Web.Proxy.html","topicHref":"Titanium.Web.Proxy.html","topicUid":"Titanium.Web.Proxy","type":"Namespace","items":[{"name":"ClientProcessId","href":"Titanium.Web.Proxy.ClientProcessId.html","topicHref":"Titanium.Web.Proxy.ClientProcessId.html","topicUid":"Titanium.Web.Proxy.ClientProcessId","type":"Class"},{"name":"MitmExclusionDefaults","href":"Titanium.Web.Proxy.MitmExclusionDefaults.html","topicHref":"Titanium.Web.Proxy.MitmExclusionDefaults.html","topicUid":"Titanium.Web.Proxy.MitmExclusionDefaults","type":"Class"},{"name":"MitmExclusionMode","href":"Titanium.Web.Proxy.MitmExclusionMode.html","topicHref":"Titanium.Web.Proxy.MitmExclusionMode.html","topicUid":"Titanium.Web.Proxy.MitmExclusionMode","type":"Enum"},{"name":"ProxyLimits","href":"Titanium.Web.Proxy.ProxyLimits.html","topicHref":"Titanium.Web.Proxy.ProxyLimits.html","topicUid":"Titanium.Web.Proxy.ProxyLimits","type":"Class"},{"name":"ProxyServer","href":"Titanium.Web.Proxy.ProxyServer.html","topicHref":"Titanium.Web.Proxy.ProxyServer.html","topicUid":"Titanium.Web.Proxy.ProxyServer","type":"Class"},{"name":"SystemProxyBypassRuleMode","href":"Titanium.Web.Proxy.SystemProxyBypassRuleMode.html","topicHref":"Titanium.Web.Proxy.SystemProxyBypassRuleMode.html","topicUid":"Titanium.Web.Proxy.SystemProxyBypassRuleMode","type":"Enum"},{"name":"SystemProxyChangeResult","href":"Titanium.Web.Proxy.SystemProxyChangeResult.html","topicHref":"Titanium.Web.Proxy.SystemProxyChangeResult.html","topicUid":"Titanium.Web.Proxy.SystemProxyChangeResult","type":"Struct"},{"name":"SystemProxyLoopbackPlacement","href":"Titanium.Web.Proxy.SystemProxyLoopbackPlacement.html","topicHref":"Titanium.Web.Proxy.SystemProxyLoopbackPlacement.html","topicUid":"Titanium.Web.Proxy.SystemProxyLoopbackPlacement","type":"Enum"},{"name":"SystemProxySettings","href":"Titanium.Web.Proxy.SystemProxySettings.html","topicHref":"Titanium.Web.Proxy.SystemProxySettings.html","topicUid":"Titanium.Web.Proxy.SystemProxySettings","type":"Class"},{"name":"WebSocketDecoder","href":"Titanium.Web.Proxy.WebSocketDecoder.html","topicHref":"Titanium.Web.Proxy.WebSocketDecoder.html","topicUid":"Titanium.Web.Proxy.WebSocketDecoder","type":"Class"},{"name":"WebSocketFrame","href":"Titanium.Web.Proxy.WebSocketFrame.html","topicHref":"Titanium.Web.Proxy.WebSocketFrame.html","topicUid":"Titanium.Web.Proxy.WebSocketFrame","type":"Class"},{"name":"WebSocketFrameEncoder","href":"Titanium.Web.Proxy.WebSocketFrameEncoder.html","topicHref":"Titanium.Web.Proxy.WebSocketFrameEncoder.html","topicUid":"Titanium.Web.Proxy.WebSocketFrameEncoder","type":"Class"},{"name":"WebSocketFrameWriter","href":"Titanium.Web.Proxy.WebSocketFrameWriter.html","topicHref":"Titanium.Web.Proxy.WebSocketFrameWriter.html","topicUid":"Titanium.Web.Proxy.WebSocketFrameWriter","type":"Class"},{"name":"WebSocketProtocolException","href":"Titanium.Web.Proxy.WebSocketProtocolException.html","topicHref":"Titanium.Web.Proxy.WebSocketProtocolException.html","topicUid":"Titanium.Web.Proxy.WebSocketProtocolException","type":"Class"},{"name":"WebsocketOpCode","href":"Titanium.Web.Proxy.WebsocketOpCode.html","topicHref":"Titanium.Web.Proxy.WebsocketOpCode.html","topicUid":"Titanium.Web.Proxy.WebsocketOpCode","type":"Enum"}]},{"name":"Titanium.Web.Proxy.Caching","href":"Titanium.Web.Proxy.Caching.html","topicHref":"Titanium.Web.Proxy.Caching.html","topicUid":"Titanium.Web.Proxy.Caching","type":"Namespace","items":[{"name":"HttpResponseCacheMiddleware","href":"Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.html","topicHref":"Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware.html","topicUid":"Titanium.Web.Proxy.Caching.HttpResponseCacheMiddleware","type":"Class"},{"name":"MemoryHttpResponseCache","href":"Titanium.Web.Proxy.Caching.MemoryHttpResponseCache.html","topicHref":"Titanium.Web.Proxy.Caching.MemoryHttpResponseCache.html","topicUid":"Titanium.Web.Proxy.Caching.MemoryHttpResponseCache","type":"Class"}]},{"name":"Titanium.Web.Proxy.Clusters","href":"Titanium.Web.Proxy.Clusters.html","topicHref":"Titanium.Web.Proxy.Clusters.html","topicUid":"Titanium.Web.Proxy.Clusters","type":"Namespace","items":[{"name":"ClusterManager","href":"Titanium.Web.Proxy.Clusters.ClusterManager.html","topicHref":"Titanium.Web.Proxy.Clusters.ClusterManager.html","topicUid":"Titanium.Web.Proxy.Clusters.ClusterManager","type":"Class"},{"name":"DestinationHealthTracker","href":"Titanium.Web.Proxy.Clusters.DestinationHealthTracker.html","topicHref":"Titanium.Web.Proxy.Clusters.DestinationHealthTracker.html","topicUid":"Titanium.Web.Proxy.Clusters.DestinationHealthTracker","type":"Class"},{"name":"LoadBalancer","href":"Titanium.Web.Proxy.Clusters.LoadBalancer.html","topicHref":"Titanium.Web.Proxy.Clusters.LoadBalancer.html","topicUid":"Titanium.Web.Proxy.Clusters.LoadBalancer","type":"Class"}]},{"name":"Titanium.Web.Proxy.Diagnostics","href":"Titanium.Web.Proxy.Diagnostics.html","topicHref":"Titanium.Web.Proxy.Diagnostics.html","topicUid":"Titanium.Web.Proxy.Diagnostics","type":"Namespace","items":[{"name":"ClientTlsTiming","href":"Titanium.Web.Proxy.Diagnostics.ClientTlsTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.ClientTlsTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.ClientTlsTiming","type":"Class"},{"name":"HttpRequestTiming","href":"Titanium.Web.Proxy.Diagnostics.HttpRequestTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.HttpRequestTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.HttpRequestTiming","type":"Class"},{"name":"TunnelConnectTiming","href":"Titanium.Web.Proxy.Diagnostics.TunnelConnectTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.TunnelConnectTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.TunnelConnectTiming","type":"Class"},{"name":"UpstreamConnectionTiming","href":"Titanium.Web.Proxy.Diagnostics.UpstreamConnectionTiming.html","topicHref":"Titanium.Web.Proxy.Diagnostics.UpstreamConnectionTiming.html","topicUid":"Titanium.Web.Proxy.Diagnostics.UpstreamConnectionTiming","type":"Class"}]},{"name":"Titanium.Web.Proxy.EventArguments","href":"Titanium.Web.Proxy.EventArguments.html","topicHref":"Titanium.Web.Proxy.EventArguments.html","topicUid":"Titanium.Web.Proxy.EventArguments","type":"Namespace","items":[{"name":"AsyncEventHandler","href":"Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html","topicHref":"Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html","topicUid":"Titanium.Web.Proxy.EventArguments.AsyncEventHandler`1","type":"Delegate"},{"name":"BeforeBodyWriteEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeBodyWriteEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeBodyWriteEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeBodyWriteEventArgs","type":"Class"},{"name":"BeforeHttpAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeHttpAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeHttpAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeHttpAuthenticateEventArgs","type":"Class"},{"name":"BeforeQuicAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeQuicAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeQuicAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeQuicAuthenticateEventArgs","type":"Class"},{"name":"BeforeSslAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs","type":"Class"},{"name":"CertificateSelectionEventArgs","href":"Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs","type":"Class"},{"name":"CertificateValidationEventArgs","href":"Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs","type":"Class"},{"name":"MultipartRequestPartSentEventArgs","href":"Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs","type":"Class"},{"name":"ProxyEventArgsBase","href":"Titanium.Web.Proxy.EventArguments.ProxyEventArgsBase.html","topicHref":"Titanium.Web.Proxy.EventArguments.ProxyEventArgsBase.html","topicUid":"Titanium.Web.Proxy.EventArguments.ProxyEventArgsBase","type":"Class"},{"name":"SessionEventArgs","href":"Titanium.Web.Proxy.EventArguments.SessionEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.SessionEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.SessionEventArgs","type":"Class"},{"name":"SessionEventArgsBase","href":"Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html","topicHref":"Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html","topicUid":"Titanium.Web.Proxy.EventArguments.SessionEventArgsBase","type":"Class"},{"name":"SocksAuthenticateEventArgs","href":"Titanium.Web.Proxy.EventArguments.SocksAuthenticateEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.SocksAuthenticateEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.SocksAuthenticateEventArgs","type":"Class"},{"name":"TunnelConnectFailureEventArgs","href":"Titanium.Web.Proxy.EventArguments.TunnelConnectFailureEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.TunnelConnectFailureEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.TunnelConnectFailureEventArgs","type":"Class"},{"name":"TunnelConnectSessionEventArgs","href":"Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs","type":"Class"},{"name":"WebSocketFrameDirection","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameDirection.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameDirection.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameDirection","type":"Enum"},{"name":"WebSocketFrameElidedEventArgs","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameElidedEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameElidedEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameElidedEventArgs","type":"Class"},{"name":"WebSocketFrameInterceptAction","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptAction.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptAction.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptAction","type":"Enum"},{"name":"WebSocketFrameInterceptEventArgs","href":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptEventArgs.html","topicHref":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptEventArgs.html","topicUid":"Titanium.Web.Proxy.EventArguments.WebSocketFrameInterceptEventArgs","type":"Class"}]},{"name":"Titanium.Web.Proxy.Exceptions","href":"Titanium.Web.Proxy.Exceptions.html","topicHref":"Titanium.Web.Proxy.Exceptions.html","topicUid":"Titanium.Web.Proxy.Exceptions","type":"Namespace","items":[{"name":"BodyNotFoundException","href":"Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html","topicHref":"Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html","topicUid":"Titanium.Web.Proxy.Exceptions.BodyNotFoundException","type":"Class"},{"name":"OutboundDestinationBlockedException","href":"Titanium.Web.Proxy.Exceptions.OutboundDestinationBlockedException.html","topicHref":"Titanium.Web.Proxy.Exceptions.OutboundDestinationBlockedException.html","topicUid":"Titanium.Web.Proxy.Exceptions.OutboundDestinationBlockedException","type":"Class"},{"name":"ProxyAuthorizationException","href":"Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException","type":"Class"},{"name":"ProxyConnectException","href":"Titanium.Web.Proxy.Exceptions.ProxyConnectException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyConnectException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyConnectException","type":"Class"},{"name":"ProxyException","href":"Titanium.Web.Proxy.Exceptions.ProxyException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyException","type":"Class"},{"name":"ProxyHttpException","href":"Titanium.Web.Proxy.Exceptions.ProxyHttpException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyHttpException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyHttpException","type":"Class"},{"name":"ProxyTimeoutException","href":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutException.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutException.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutException","type":"Class"},{"name":"ProxyTimeoutKind","href":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutKind.html","topicHref":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutKind.html","topicUid":"Titanium.Web.Proxy.Exceptions.ProxyTimeoutKind","type":"Enum"},{"name":"UpstreamProxyConnectException","href":"Titanium.Web.Proxy.Exceptions.UpstreamProxyConnectException.html","topicHref":"Titanium.Web.Proxy.Exceptions.UpstreamProxyConnectException.html","topicUid":"Titanium.Web.Proxy.Exceptions.UpstreamProxyConnectException","type":"Class"}]},{"name":"Titanium.Web.Proxy.Helpers","href":"Titanium.Web.Proxy.Helpers.html","topicHref":"Titanium.Web.Proxy.Helpers.html","topicUid":"Titanium.Web.Proxy.Helpers","type":"Namespace","items":[{"name":"UnixProxyBypassMapper","href":"Titanium.Web.Proxy.Helpers.UnixProxyBypassMapper.html","topicHref":"Titanium.Web.Proxy.Helpers.UnixProxyBypassMapper.html","topicUid":"Titanium.Web.Proxy.Helpers.UnixProxyBypassMapper","type":"Class"}]},{"name":"Titanium.Web.Proxy.Http","href":"Titanium.Web.Proxy.Http.html","topicHref":"Titanium.Web.Proxy.Http.html","topicUid":"Titanium.Web.Proxy.Http","type":"Namespace","items":[{"name":"ConnectRequest","href":"Titanium.Web.Proxy.Http.ConnectRequest.html","topicHref":"Titanium.Web.Proxy.Http.ConnectRequest.html","topicUid":"Titanium.Web.Proxy.Http.ConnectRequest","type":"Class"},{"name":"ConnectResponse","href":"Titanium.Web.Proxy.Http.ConnectResponse.html","topicHref":"Titanium.Web.Proxy.Http.ConnectResponse.html","topicUid":"Titanium.Web.Proxy.Http.ConnectResponse","type":"Class"},{"name":"HeaderCollection","href":"Titanium.Web.Proxy.Http.HeaderCollection.html","topicHref":"Titanium.Web.Proxy.Http.HeaderCollection.html","topicUid":"Titanium.Web.Proxy.Http.HeaderCollection","type":"Class"},{"name":"HeaderCollection.Enumerator","href":"Titanium.Web.Proxy.Http.HeaderCollection.Enumerator.html","topicHref":"Titanium.Web.Proxy.Http.HeaderCollection.Enumerator.html","topicUid":"Titanium.Web.Proxy.Http.HeaderCollection.Enumerator","type":"Struct"},{"name":"HeaderLimitsExceededException","href":"Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html","topicHref":"Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html","topicUid":"Titanium.Web.Proxy.Http.HeaderLimitsExceededException","type":"Class"},{"name":"HttpWebClient","href":"Titanium.Web.Proxy.Http.HttpWebClient.html","topicHref":"Titanium.Web.Proxy.Http.HttpWebClient.html","topicUid":"Titanium.Web.Proxy.Http.HttpWebClient","type":"Class"},{"name":"KnownHeader","href":"Titanium.Web.Proxy.Http.KnownHeader.html","topicHref":"Titanium.Web.Proxy.Http.KnownHeader.html","topicUid":"Titanium.Web.Proxy.Http.KnownHeader","type":"Class"},{"name":"KnownHeaders","href":"Titanium.Web.Proxy.Http.KnownHeaders.html","topicHref":"Titanium.Web.Proxy.Http.KnownHeaders.html","topicUid":"Titanium.Web.Proxy.Http.KnownHeaders","type":"Class"},{"name":"ProxyResults","href":"Titanium.Web.Proxy.Http.ProxyResults.html","topicHref":"Titanium.Web.Proxy.Http.ProxyResults.html","topicUid":"Titanium.Web.Proxy.Http.ProxyResults","type":"Class"},{"name":"Request","href":"Titanium.Web.Proxy.Http.Request.html","topicHref":"Titanium.Web.Proxy.Http.Request.html","topicUid":"Titanium.Web.Proxy.Http.Request","type":"Class"},{"name":"RequestResponseBase","href":"Titanium.Web.Proxy.Http.RequestResponseBase.html","topicHref":"Titanium.Web.Proxy.Http.RequestResponseBase.html","topicUid":"Titanium.Web.Proxy.Http.RequestResponseBase","type":"Class"},{"name":"Response","href":"Titanium.Web.Proxy.Http.Response.html","topicHref":"Titanium.Web.Proxy.Http.Response.html","topicUid":"Titanium.Web.Proxy.Http.Response","type":"Class"},{"name":"StreamingProxyResult","href":"Titanium.Web.Proxy.Http.StreamingProxyResult.html","topicHref":"Titanium.Web.Proxy.Http.StreamingProxyResult.html","topicUid":"Titanium.Web.Proxy.Http.StreamingProxyResult","type":"Struct"},{"name":"TunnelType","href":"Titanium.Web.Proxy.Http.TunnelType.html","topicHref":"Titanium.Web.Proxy.Http.TunnelType.html","topicUid":"Titanium.Web.Proxy.Http.TunnelType","type":"Enum"}]},{"name":"Titanium.Web.Proxy.Http.Responses","href":"Titanium.Web.Proxy.Http.Responses.html","topicHref":"Titanium.Web.Proxy.Http.Responses.html","topicUid":"Titanium.Web.Proxy.Http.Responses","type":"Namespace","items":[{"name":"GenericResponse","href":"Titanium.Web.Proxy.Http.Responses.GenericResponse.html","topicHref":"Titanium.Web.Proxy.Http.Responses.GenericResponse.html","topicUid":"Titanium.Web.Proxy.Http.Responses.GenericResponse","type":"Class"},{"name":"OkResponse","href":"Titanium.Web.Proxy.Http.Responses.OkResponse.html","topicHref":"Titanium.Web.Proxy.Http.Responses.OkResponse.html","topicUid":"Titanium.Web.Proxy.Http.Responses.OkResponse","type":"Class"},{"name":"RedirectResponse","href":"Titanium.Web.Proxy.Http.Responses.RedirectResponse.html","topicHref":"Titanium.Web.Proxy.Http.Responses.RedirectResponse.html","topicUid":"Titanium.Web.Proxy.Http.Responses.RedirectResponse","type":"Class"}]},{"name":"Titanium.Web.Proxy.Http3","href":"Titanium.Web.Proxy.Http3.html","topicHref":"Titanium.Web.Proxy.Http3.html","topicUid":"Titanium.Web.Proxy.Http3","type":"Namespace","items":[{"name":"Http3NativeBootstrap","href":"Titanium.Web.Proxy.Http3.Http3NativeBootstrap.html","topicHref":"Titanium.Web.Proxy.Http3.Http3NativeBootstrap.html","topicUid":"Titanium.Web.Proxy.Http3.Http3NativeBootstrap","type":"Class"}]},{"name":"Titanium.Web.Proxy.Logging","href":"Titanium.Web.Proxy.Logging.html","topicHref":"Titanium.Web.Proxy.Logging.html","topicUid":"Titanium.Web.Proxy.Logging","type":"Namespace","items":[{"name":"ProxyLoggingOptions","href":"Titanium.Web.Proxy.Logging.ProxyLoggingOptions.html","topicHref":"Titanium.Web.Proxy.Logging.ProxyLoggingOptions.html","topicUid":"Titanium.Web.Proxy.Logging.ProxyLoggingOptions","type":"Class"}]},{"name":"Titanium.Web.Proxy.Middleware","href":"Titanium.Web.Proxy.Middleware.html","topicHref":"Titanium.Web.Proxy.Middleware.html","topicUid":"Titanium.Web.Proxy.Middleware","type":"Namespace","items":[{"name":"ProxyMiddlewarePipeline","href":"Titanium.Web.Proxy.Middleware.ProxyMiddlewarePipeline.html","topicHref":"Titanium.Web.Proxy.Middleware.ProxyMiddlewarePipeline.html","topicUid":"Titanium.Web.Proxy.Middleware.ProxyMiddlewarePipeline","type":"Class"}]},{"name":"Titanium.Web.Proxy.Models","href":"Titanium.Web.Proxy.Models.html","topicHref":"Titanium.Web.Proxy.Models.html","topicUid":"Titanium.Web.Proxy.Models","type":"Namespace","items":[{"name":"DecryptFailureBypassEntry","href":"Titanium.Web.Proxy.Models.DecryptFailureBypassEntry.html","topicHref":"Titanium.Web.Proxy.Models.DecryptFailureBypassEntry.html","topicUid":"Titanium.Web.Proxy.Models.DecryptFailureBypassEntry","type":"Class"},{"name":"ExplicitProxyEndPoint","href":"Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.ExplicitProxyEndPoint","type":"Class"},{"name":"ExternalProxy","href":"Titanium.Web.Proxy.Models.ExternalProxy.html","topicHref":"Titanium.Web.Proxy.Models.ExternalProxy.html","topicUid":"Titanium.Web.Proxy.Models.ExternalProxy","type":"Class"},{"name":"ExternalProxyType","href":"Titanium.Web.Proxy.Models.ExternalProxyType.html","topicHref":"Titanium.Web.Proxy.Models.ExternalProxyType.html","topicUid":"Titanium.Web.Proxy.Models.ExternalProxyType","type":"Enum"},{"name":"HttpHeader","href":"Titanium.Web.Proxy.Models.HttpHeader.html","topicHref":"Titanium.Web.Proxy.Models.HttpHeader.html","topicUid":"Titanium.Web.Proxy.Models.HttpHeader","type":"Class"},{"name":"HttpInterceptionContext","href":"Titanium.Web.Proxy.Models.HttpInterceptionContext.html","topicHref":"Titanium.Web.Proxy.Models.HttpInterceptionContext.html","topicUid":"Titanium.Web.Proxy.Models.HttpInterceptionContext","type":"Struct"},{"name":"IExternalProxy","href":"Titanium.Web.Proxy.Models.IExternalProxy.html","topicHref":"Titanium.Web.Proxy.Models.IExternalProxy.html","topicUid":"Titanium.Web.Proxy.Models.IExternalProxy","type":"Interface"},{"name":"OriginHttpVersionPolicy","href":"Titanium.Web.Proxy.Models.OriginHttpVersionPolicy.html","topicHref":"Titanium.Web.Proxy.Models.OriginHttpVersionPolicy.html","topicUid":"Titanium.Web.Proxy.Models.OriginHttpVersionPolicy","type":"Enum"},{"name":"ProxyAuthenticationContext","href":"Titanium.Web.Proxy.Models.ProxyAuthenticationContext.html","topicHref":"Titanium.Web.Proxy.Models.ProxyAuthenticationContext.html","topicUid":"Titanium.Web.Proxy.Models.ProxyAuthenticationContext","type":"Class"},{"name":"ProxyAuthenticationResult","href":"Titanium.Web.Proxy.Models.ProxyAuthenticationResult.html","topicHref":"Titanium.Web.Proxy.Models.ProxyAuthenticationResult.html","topicUid":"Titanium.Web.Proxy.Models.ProxyAuthenticationResult","type":"Enum"},{"name":"ProxyEndPoint","href":"Titanium.Web.Proxy.Models.ProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.ProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.ProxyEndPoint","type":"Class"},{"name":"ProxyProtocolType","href":"Titanium.Web.Proxy.Models.ProxyProtocolType.html","topicHref":"Titanium.Web.Proxy.Models.ProxyProtocolType.html","topicUid":"Titanium.Web.Proxy.Models.ProxyProtocolType","type":"Enum"},{"name":"SocksProxyEndPoint","href":"Titanium.Web.Proxy.Models.SocksProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.SocksProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.SocksProxyEndPoint","type":"Class"},{"name":"TransparentBaseProxyEndPoint","href":"Titanium.Web.Proxy.Models.TransparentBaseProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.TransparentBaseProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.TransparentBaseProxyEndPoint","type":"Class"},{"name":"TransparentProxyEndPoint","href":"Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.TransparentProxyEndPoint","type":"Class"},{"name":"TransparentQuicProxyEndPoint","href":"Titanium.Web.Proxy.Models.TransparentQuicProxyEndPoint.html","topicHref":"Titanium.Web.Proxy.Models.TransparentQuicProxyEndPoint.html","topicUid":"Titanium.Web.Proxy.Models.TransparentQuicProxyEndPoint","type":"Class"},{"name":"UpstreamHttpProtocol","href":"Titanium.Web.Proxy.Models.UpstreamHttpProtocol.html","topicHref":"Titanium.Web.Proxy.Models.UpstreamHttpProtocol.html","topicUid":"Titanium.Web.Proxy.Models.UpstreamHttpProtocol","type":"Enum"},{"name":"WinAuthCredentials","href":"Titanium.Web.Proxy.Models.WinAuthCredentials.html","topicHref":"Titanium.Web.Proxy.Models.WinAuthCredentials.html","topicUid":"Titanium.Web.Proxy.Models.WinAuthCredentials","type":"Class"}]},{"name":"Titanium.Web.Proxy.Network","href":"Titanium.Web.Proxy.Network.html","topicHref":"Titanium.Web.Proxy.Network.html","topicUid":"Titanium.Web.Proxy.Network","type":"Namespace","items":[{"name":"CertificateEngine","href":"Titanium.Web.Proxy.Network.CertificateEngine.html","topicHref":"Titanium.Web.Proxy.Network.CertificateEngine.html","topicUid":"Titanium.Web.Proxy.Network.CertificateEngine","type":"Enum"},{"name":"CertificateKeyAlgorithm","href":"Titanium.Web.Proxy.Network.CertificateKeyAlgorithm.html","topicHref":"Titanium.Web.Proxy.Network.CertificateKeyAlgorithm.html","topicUid":"Titanium.Web.Proxy.Network.CertificateKeyAlgorithm","type":"Enum"},{"name":"CertificateManager","href":"Titanium.Web.Proxy.Network.CertificateManager.html","topicHref":"Titanium.Web.Proxy.Network.CertificateManager.html","topicUid":"Titanium.Web.Proxy.Network.CertificateManager","type":"Class"},{"name":"CertificateOsTrustKind","href":"Titanium.Web.Proxy.Network.CertificateOsTrustKind.html","topicHref":"Titanium.Web.Proxy.Network.CertificateOsTrustKind.html","topicUid":"Titanium.Web.Proxy.Network.CertificateOsTrustKind","type":"Enum"},{"name":"CertificateOsTrustResult","href":"Titanium.Web.Proxy.Network.CertificateOsTrustResult.html","topicHref":"Titanium.Web.Proxy.Network.CertificateOsTrustResult.html","topicUid":"Titanium.Web.Proxy.Network.CertificateOsTrustResult","type":"Class"},{"name":"DefaultCertificateDiskCache","href":"Titanium.Web.Proxy.Network.DefaultCertificateDiskCache.html","topicHref":"Titanium.Web.Proxy.Network.DefaultCertificateDiskCache.html","topicUid":"Titanium.Web.Proxy.Network.DefaultCertificateDiskCache","type":"Class"},{"name":"FirefoxCertificateTrust","href":"Titanium.Web.Proxy.Network.FirefoxCertificateTrust.html","topicHref":"Titanium.Web.Proxy.Network.FirefoxCertificateTrust.html","topicUid":"Titanium.Web.Proxy.Network.FirefoxCertificateTrust","type":"Class"},{"name":"ICertificateCache","href":"Titanium.Web.Proxy.Network.ICertificateCache.html","topicHref":"Titanium.Web.Proxy.Network.ICertificateCache.html","topicUid":"Titanium.Web.Proxy.Network.ICertificateCache","type":"Interface"}]},{"name":"Titanium.Web.Proxy.Network.Quic","href":"Titanium.Web.Proxy.Network.Quic.html","topicHref":"Titanium.Web.Proxy.Network.Quic.html","topicUid":"Titanium.Web.Proxy.Network.Quic","type":"Namespace","items":[{"name":"IOriginalDestinationResolver","href":"Titanium.Web.Proxy.Network.Quic.IOriginalDestinationResolver.html","topicHref":"Titanium.Web.Proxy.Network.Quic.IOriginalDestinationResolver.html","topicUid":"Titanium.Web.Proxy.Network.Quic.IOriginalDestinationResolver","type":"Interface"}]},{"name":"Titanium.Web.Proxy.Options","href":"Titanium.Web.Proxy.Options.html","topicHref":"Titanium.Web.Proxy.Options.html","topicUid":"Titanium.Web.Proxy.Options","type":"Namespace","items":[{"name":"PolicyFamily","href":"Titanium.Web.Proxy.Options.PolicyFamily.html","topicHref":"Titanium.Web.Proxy.Options.PolicyFamily.html","topicUid":"Titanium.Web.Proxy.Options.PolicyFamily","type":"Enum"},{"name":"PolicyMode","href":"Titanium.Web.Proxy.Options.PolicyMode.html","topicHref":"Titanium.Web.Proxy.Options.PolicyMode.html","topicUid":"Titanium.Web.Proxy.Options.PolicyMode","type":"Enum"},{"name":"ProxyPolicyModes","href":"Titanium.Web.Proxy.Options.ProxyPolicyModes.html","topicHref":"Titanium.Web.Proxy.Options.ProxyPolicyModes.html","topicUid":"Titanium.Web.Proxy.Options.ProxyPolicyModes","type":"Class"},{"name":"ProxyProfile","href":"Titanium.Web.Proxy.Options.ProxyProfile.html","topicHref":"Titanium.Web.Proxy.Options.ProxyProfile.html","topicUid":"Titanium.Web.Proxy.Options.ProxyProfile","type":"Enum"},{"name":"ProxyProfileSettings","href":"Titanium.Web.Proxy.Options.ProxyProfileSettings.html","topicHref":"Titanium.Web.Proxy.Options.ProxyProfileSettings.html","topicUid":"Titanium.Web.Proxy.Options.ProxyProfileSettings","type":"Class"},{"name":"ProxyResourceLimits","href":"Titanium.Web.Proxy.Options.ProxyResourceLimits.html","topicHref":"Titanium.Web.Proxy.Options.ProxyResourceLimits.html","topicUid":"Titanium.Web.Proxy.Options.ProxyResourceLimits","type":"Class"},{"name":"ProxyTimeoutOptions","href":"Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html","topicHref":"Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html","topicUid":"Titanium.Web.Proxy.Options.ProxyTimeoutOptions","type":"Class"},{"name":"ResolvedSessionPolicy","href":"Titanium.Web.Proxy.Options.ResolvedSessionPolicy.html","topicHref":"Titanium.Web.Proxy.Options.ResolvedSessionPolicy.html","topicUid":"Titanium.Web.Proxy.Options.ResolvedSessionPolicy","type":"Class"}]},{"name":"Titanium.Web.Proxy.Routing","href":"Titanium.Web.Proxy.Routing.html","topicHref":"Titanium.Web.Proxy.Routing.html","topicUid":"Titanium.Web.Proxy.Routing","type":"Namespace","items":[{"name":"ReverseProxyFastPath","href":"Titanium.Web.Proxy.Routing.ReverseProxyFastPath.html","topicHref":"Titanium.Web.Proxy.Routing.ReverseProxyFastPath.html","topicUid":"Titanium.Web.Proxy.Routing.ReverseProxyFastPath","type":"Class"},{"name":"RouteMatcher","href":"Titanium.Web.Proxy.Routing.RouteMatcher.html","topicHref":"Titanium.Web.Proxy.Routing.RouteMatcher.html","topicUid":"Titanium.Web.Proxy.Routing.RouteMatcher","type":"Class"}]},{"name":"Titanium.Web.Proxy.StreamExtended","href":"Titanium.Web.Proxy.StreamExtended.html","topicHref":"Titanium.Web.Proxy.StreamExtended.html","topicUid":"Titanium.Web.Proxy.StreamExtended","type":"Namespace","items":[{"name":"ClientHelloInfo","href":"Titanium.Web.Proxy.StreamExtended.ClientHelloInfo.html","topicHref":"Titanium.Web.Proxy.StreamExtended.ClientHelloInfo.html","topicUid":"Titanium.Web.Proxy.StreamExtended.ClientHelloInfo","type":"Class"},{"name":"ServerHelloInfo","href":"Titanium.Web.Proxy.StreamExtended.ServerHelloInfo.html","topicHref":"Titanium.Web.Proxy.StreamExtended.ServerHelloInfo.html","topicUid":"Titanium.Web.Proxy.StreamExtended.ServerHelloInfo","type":"Class"}]},{"name":"Titanium.Web.Proxy.StreamExtended.BufferPool","href":"Titanium.Web.Proxy.StreamExtended.BufferPool.html","topicHref":"Titanium.Web.Proxy.StreamExtended.BufferPool.html","topicUid":"Titanium.Web.Proxy.StreamExtended.BufferPool","type":"Namespace","items":[{"name":"IBufferPool","href":"Titanium.Web.Proxy.StreamExtended.BufferPool.IBufferPool.html","topicHref":"Titanium.Web.Proxy.StreamExtended.BufferPool.IBufferPool.html","topicUid":"Titanium.Web.Proxy.StreamExtended.BufferPool.IBufferPool","type":"Interface"}]},{"name":"Titanium.Web.Proxy.StreamExtended.Models","href":"Titanium.Web.Proxy.StreamExtended.Models.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Models.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Models","type":"Namespace","items":[{"name":"SslExtension","href":"Titanium.Web.Proxy.StreamExtended.Models.SslExtension.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Models.SslExtension.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Models.SslExtension","type":"Class"}]},{"name":"Titanium.Web.Proxy.StreamExtended.Network","href":"Titanium.Web.Proxy.StreamExtended.Network.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network","type":"Namespace","items":[{"name":"DataEventArgs","href":"Titanium.Web.Proxy.StreamExtended.Network.DataEventArgs.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.DataEventArgs.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.DataEventArgs","type":"Class"},{"name":"IHttpStreamReader","href":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamReader.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamReader.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamReader","type":"Interface"},{"name":"IHttpStreamWriter","href":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamWriter.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamWriter.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.IHttpStreamWriter","type":"Interface"},{"name":"ILineStream","href":"Titanium.Web.Proxy.StreamExtended.Network.ILineStream.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.ILineStream.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.ILineStream","type":"Interface"},{"name":"IPeekStream","href":"Titanium.Web.Proxy.StreamExtended.Network.IPeekStream.html","topicHref":"Titanium.Web.Proxy.StreamExtended.Network.IPeekStream.html","topicUid":"Titanium.Web.Proxy.StreamExtended.Network.IPeekStream","type":"Interface"}]},{"name":"Titanium.Web.Proxy.Transforms","href":"Titanium.Web.Proxy.Transforms.html","topicHref":"Titanium.Web.Proxy.Transforms.html","topicUid":"Titanium.Web.Proxy.Transforms","type":"Namespace","items":[{"name":"TransformEngine","href":"Titanium.Web.Proxy.Transforms.TransformEngine.html","topicHref":"Titanium.Web.Proxy.Transforms.TransformEngine.html","topicUid":"Titanium.Web.Proxy.Transforms.TransformEngine","type":"Class"}]}],"memberLayout":"SamePage"} diff --git a/docs/index.json b/docs/index.json index d78964710..123092119 100644 --- a/docs/index.json +++ b/docs/index.json @@ -244,6 +244,11 @@ "title": "Class HeaderCollection | Titanium Web Proxy", "summary": "Class HeaderCollection The http header collection. Inheritance object HeaderCollection Implements IEnumerable IEnumerable Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.MemberwiseClone() object.ReferenceEquals(object, object) object.ToString() Namespace: Titanium.Web.Proxy.Http Assembly: Titanium.Web.Proxy.dll Syntax [TypeConverter(typeof(ExpandableObjectConverter))] public class HeaderCollection : IEnumerable, IEnumerable Constructors | Edit this page View Source HeaderCollection() Initializes a new instance of the HeaderCollection class. Declaration public HeaderCollection() Properties | Edit this page View Source Headers Unique Request header collection. Declaration public ReadOnlyDictionary Headers { get; } Property Value Type Description ReadOnlyDictionary | Edit this page View Source NonUniqueHeaders Non-unique headers. Values are read-only views over the internal lists so callers cannot Add/Clear storage that still belongs to this collection. Declaration public ReadOnlyDictionary> NonUniqueHeaders { get; } Property Value Type Description ReadOnlyDictionary> Methods | Edit this page View Source AddHeader(string, string) Add a new header with given name and value Declaration public void AddHeader(string name, string value) Parameters Type Name Description string name string value | Edit this page View Source AddHeader(HttpHeader) Adds the given header object to Request Declaration public void AddHeader(HttpHeader newHeader) Parameters Type Name Description HttpHeader newHeader | Edit this page View Source AddHeaders(IEnumerable>?) Adds the given header objects to Request Declaration public void AddHeaders(IEnumerable>? newHeaders) Parameters Type Name Description IEnumerable> newHeaders | Edit this page View Source AddHeaders(IEnumerable>?) Adds the given header objects to Request Declaration public void AddHeaders(IEnumerable>? newHeaders) Parameters Type Name Description IEnumerable> newHeaders | Edit this page View Source AddHeaders(IEnumerable?) Adds the given header objects to Request Declaration public void AddHeaders(IEnumerable? newHeaders) Parameters Type Name Description IEnumerable newHeaders | Edit this page View Source Clear() Removes all the headers. Declaration public void Clear() | Edit this page View Source GetAllHeaders() Returns all headers Declaration public List GetAllHeaders() Returns Type Description List | Edit this page View Source GetEnumerator() Returns an enumerator that iterates through the collection. Declaration public HeaderCollection.Enumerator GetEnumerator() Returns Type Description HeaderCollection.Enumerator An enumerator that can be used to iterate through the collection. Remarks Returns the concrete HeaderCollection.Enumerator struct rather than an interface type, matching the pattern used by List/Dictionary in the BCL: a foreach over a variable statically typed as HeaderCollection binds to this overload directly and allocates nothing, whereas the previous implementation (chaining Concat(IEnumerable, IEnumerable) and SelectMany(IEnumerable, Func>) over the two backing dictionaries) allocated two LINQ iterator objects on every call. This matters here specifically because every outgoing request and response header block is enumerated at least once to serialize it onto the wire, making this one of the hottest paths in the proxy. Code that holds this collection through the IEnumerable interface (e.g. LINQ operators) still gets a correct enumerator via the explicit interface implementation below, at the cost of one boxing allocation - unavoidable through that surface, and unchanged from before this optimization. | Edit this page View Source GetFirstHeader(string) Declaration public HttpHeader? GetFirstHeader(string name) Parameters Type Name Description string name Returns Type Description HttpHeader | Edit this page View Source GetHeaders(string) Returns all headers with given name if exists Returns null if doesn't exist Declaration public List? GetHeaders(string name) Parameters Type Name Description string name Returns Type Description List | Edit this page View Source HeaderExists(string) True if header exists Declaration public bool HeaderExists(string name) Parameters Type Name Description string name Returns Type Description bool | Edit this page View Source RemoveHeader(string) removes all headers with given name Declaration public bool RemoveHeader(string headerName) Parameters Type Name Description string headerName Returns Type Description bool True if header was removed False if no header exists with given name | Edit this page View Source RemoveHeader(KnownHeader) removes all headers with given name Declaration public bool RemoveHeader(KnownHeader headerName) Parameters Type Name Description KnownHeader headerName Returns Type Description bool True if header was removed False if no header exists with given name | Edit this page View Source RemoveHeader(HttpHeader) Removes given header object if it exist Declaration public bool RemoveHeader(HttpHeader header) Parameters Type Name Description HttpHeader header Returns true if header exists and was removed Returns Type Description bool Implements IEnumerable IEnumerable" }, + "api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html": { + "href": "api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html", + "title": "Class HeaderLimitsExceededException | Titanium Web Proxy", + "summary": "Class HeaderLimitsExceededException An HTTP/1 header block exceeded MaxHeaderCount or MaxHeaderAggregateBytes while HeaderLimits was Enforce. Not an IOException, so it is not treated as a client disconnect. Inheritance object Exception HeaderLimitsExceededException Implements ISerializable Inherited Members Exception.GetBaseException() Exception.GetType() Exception.ToString() Exception.Data Exception.HelpLink Exception.HResult Exception.InnerException Exception.Message Exception.Source Exception.StackTrace Exception.TargetSite object.Equals(object) object.Equals(object, object) object.GetHashCode() object.ReferenceEquals(object, object) Namespace: Titanium.Web.Proxy.Http Assembly: Titanium.Web.Proxy.dll Syntax public sealed class HeaderLimitsExceededException : Exception, ISerializable Constructors | Edit this page View Source HeaderLimitsExceededException(bool, long, long, bool) Creates an exception for one header-block breach. Declaration public HeaderLimitsExceededException(bool isCount, long observed, long limit, bool isRequest) Parameters Type Name Description bool isCount long observed long limit bool isRequest Properties | Edit this page View Source IsCount True when the breach is the header count. False when it is the byte total. Declaration public bool IsCount { get; } Property Value Type Description bool | Edit this page View Source IsRequest True when the breach was on request headers. Declaration public bool IsRequest { get; } Property Value Type Description bool | Edit this page View Source Limit The configured limit that was crossed. Declaration public long Limit { get; } Property Value Type Description long | Edit this page View Source Observed The count or byte total that crossed the limit. Declaration public long Observed { get; } Property Value Type Description long Implements ISerializable" + }, "api/Titanium.Web.Proxy.Http.HttpWebClient.html": { "href": "api/Titanium.Web.Proxy.Http.HttpWebClient.html", "title": "Class HttpWebClient | Titanium Web Proxy", @@ -312,7 +317,7 @@ "api/Titanium.Web.Proxy.Http.html": { "href": "api/Titanium.Web.Proxy.Http.html", "title": "Namespace Titanium.Web.Proxy.Http | Titanium Web Proxy", - "summary": "Namespace Titanium.Web.Proxy.Http Classes ConnectRequest The tcp tunnel Connect request. ConnectResponse The tcp tunnel connect response object. HeaderCollection The http header collection. HttpWebClient Used to communicate with the server over HTTP(S) KnownHeader KnownHeaders Well known http headers. ProxyResults Factory methods that build synthetic Response or StreamingProxyResult objects for use with Respond(Response, bool) and RespondStreaming(StreamingProxyResult, bool). Request Http(s) request object RequestResponseBase Abstract base class for similar objects shared by both request and response objects. Response Http(s) response object Structs HeaderCollection.Enumerator Walks first the unique-header dictionary's values, then each list in the non-unique-header dictionary's values in turn - the same effective order as the previous Concat(...SelectMany(...)) implementation - without allocating any LINQ iterator objects. See the remarks on GetEnumerator() for why this is worth a hand-written enumerator instead of the equivalent LINQ expression. StreamingProxyResult Pairs a synthetic response (status and headers) with a delegate that writes the body on the fly. Pass to RespondStreaming(StreamingProxyResult, bool) to stream without buffering the whole body in memory. Enums TunnelType" + "summary": "Namespace Titanium.Web.Proxy.Http Classes ConnectRequest The tcp tunnel Connect request. ConnectResponse The tcp tunnel connect response object. HeaderCollection The http header collection. HeaderLimitsExceededException An HTTP/1 header block exceeded MaxHeaderCount or MaxHeaderAggregateBytes while HeaderLimits was Enforce. Not an IOException, so it is not treated as a client disconnect. HttpWebClient Used to communicate with the server over HTTP(S) KnownHeader KnownHeaders Well known http headers. ProxyResults Factory methods that build synthetic Response or StreamingProxyResult objects for use with Respond(Response, bool) and RespondStreaming(StreamingProxyResult, bool). Request Http(s) request object RequestResponseBase Abstract base class for similar objects shared by both request and response objects. Response Http(s) response object Structs HeaderCollection.Enumerator Walks first the unique-header dictionary's values, then each list in the non-unique-header dictionary's values in turn - the same effective order as the previous Concat(...SelectMany(...)) implementation - without allocating any LINQ iterator objects. See the remarks on GetEnumerator() for why this is worth a hand-written enumerator instead of the equivalent LINQ expression. StreamingProxyResult Pairs a synthetic response (status and headers) with a delegate that writes the body on the fly. Pass to RespondStreaming(StreamingProxyResult, bool) to stream without buffering the whole body in memory. Enums TunnelType" }, "api/Titanium.Web.Proxy.Http3.Http3NativeBootstrap.html": { "href": "api/Titanium.Web.Proxy.Http3.Http3NativeBootstrap.html", @@ -517,7 +522,7 @@ "api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html": { "href": "api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html", "title": "Class ProxyPolicyModes | Titanium Web Proxy", - "summary": "Class ProxyPolicyModes Immutable snapshot of the PolicyMode selected for each PolicyFamily, plus the one deliberately-separate AllowAmbiguousFraming escape hatch. Read live by enforcement call sites through PolicyModes, which the plan's rollout section requires to be a runtime switch: replacing the whole snapshot (see PolicyModes's setter) rather than mutating a field lets an operator drop every family to Observe without redeploying, while every in-flight request that already read the previous snapshot keeps behaving consistently with whichever snapshot it observed. AllowAmbiguousFraming is not a PolicyFamily member and has no corresponding PolicyMode: framing, chunk parsing and Content-Length/Transfer-Encoding resolution have no safe \"detect but let it through\" middle ground, so this is a single named, binary, off-by-default flag that relays malformed framing instead of rejecting it - useful only for security research that needs to observe how a client or origin reacts to smuggling-shaped input through the proxy. No profile sets it: Create(PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode) never accepts it as a parameter, and the only way to turn it on is the explicit WithAllowAmbiguousFramingEnabled() call, so enabling it can never be a side effect of selecting a profile. Inheritance object ProxyPolicyModes Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.ReferenceEquals(object, object) object.ToString() Namespace: Titanium.Web.Proxy.Options Assembly: Titanium.Web.Proxy.dll Syntax public sealed class ProxyPolicyModes Properties | Edit this page View Source AllEnforce Every family enforced - today's shipped behavior, and the starting point every profile builds from. Declaration public static ProxyPolicyModes AllEnforce { get; } Property Value Type Description ProxyPolicyModes | Edit this page View Source AllowAmbiguousFraming Off by default and absent from every profile - see the type-level remarks. Never true unless WithAllowAmbiguousFramingEnabled() was called explicitly. Declaration public bool AllowAmbiguousFraming { get; } Property Value Type Description bool | Edit this page View Source this[PolicyFamily] Returns the mode selected for family. Declaration public PolicyMode this[PolicyFamily family] { get; } Parameters Type Name Description PolicyFamily family Property Value Type Description PolicyMode Methods | Edit this page View Source Create(PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode) Builds a snapshot with an explicit mode for the first seven families. WebSocketFrameBudget starts at Enforce (use With(PolicyFamily, PolicyMode) to change it) so this shipped signature stays binary-compatible. AllowAmbiguousFraming starts false. Declaration public static ProxyPolicyModes Create(PolicyMode bodyBudget, PolicyMode decompressionRatio, PolicyMode headerLimits, PolicyMode admissionControl, PolicyMode http2AbuseBudget, PolicyMode http2RelayValidation = PolicyMode.Disabled, PolicyMode http1ReplaySafety = PolicyMode.Observe) Parameters Type Name Description PolicyMode bodyBudget PolicyMode decompressionRatio PolicyMode headerLimits PolicyMode admissionControl PolicyMode http2AbuseBudget PolicyMode http2RelayValidation PolicyMode http1ReplaySafety Returns Type Description ProxyPolicyModes | Edit this page View Source With(PolicyFamily, PolicyMode) Returns a snapshot identical to this one but with mode for family. Declaration public ProxyPolicyModes With(PolicyFamily family, PolicyMode mode) Parameters Type Name Description PolicyFamily family PolicyMode mode Returns Type Description ProxyPolicyModes | Edit this page View Source WithAllObservedExceptDisabled() Returns a snapshot identical to this one but with every family dropped to Observe, except families already Disabled (which stay disabled - Observe would silently turn a family back on). This is the \"drop to Observe without redeploying\" runtime switch the plan's rollout section requires. Declaration public ProxyPolicyModes WithAllObservedExceptDisabled() Returns Type Description ProxyPolicyModes | Edit this page View Source WithAllowAmbiguousFramingEnabled() The single, explicit, isolated act of relaying ambiguous HTTP/1 framing instead of rejecting it. See the type-level remarks; never call this as a side effect of applying a profile. Declaration public ProxyPolicyModes WithAllowAmbiguousFramingEnabled() Returns Type Description ProxyPolicyModes" + "summary": "Class ProxyPolicyModes Immutable snapshot of the PolicyMode selected for each PolicyFamily, plus the one deliberately-separate AllowAmbiguousFraming escape hatch. Read live by enforcement call sites through PolicyModes, which the plan's rollout section requires to be a runtime switch: replacing the whole snapshot (see PolicyModes's setter) rather than mutating a field lets an operator drop every family to Observe without redeploying, while every in-flight request that already read the previous snapshot keeps behaving consistently with whichever snapshot it observed. AllowAmbiguousFraming is not a PolicyFamily member and has no corresponding PolicyMode: framing, chunk parsing and Content-Length/Transfer-Encoding resolution have no safe \"detect but let it through\" middle ground, so this is a single named, binary, off-by-default flag that relays malformed framing instead of rejecting it - useful only for security research that needs to observe how a client or origin reacts to smuggling-shaped input through the proxy. No profile sets it: Create(PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode) never accepts it as a parameter, and the only way to turn it on is the explicit WithAllowAmbiguousFramingEnabled() call, so enabling it can never be a side effect of selecting a profile. Inheritance object ProxyPolicyModes Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.ReferenceEquals(object, object) object.ToString() Namespace: Titanium.Web.Proxy.Options Assembly: Titanium.Web.Proxy.dll Syntax public sealed class ProxyPolicyModes Properties | Edit this page View Source AllEnforce Every family enforced - today's shipped behavior, and the starting point every profile builds from. Declaration public static ProxyPolicyModes AllEnforce { get; } Property Value Type Description ProxyPolicyModes | Edit this page View Source AllowAmbiguousFraming Off by default and absent from every profile - see the type-level remarks. Never true unless WithAllowAmbiguousFramingEnabled() was called explicitly. Declaration public bool AllowAmbiguousFraming { get; } Property Value Type Description bool | Edit this page View Source this[PolicyFamily] Returns the mode selected for family. Declaration public PolicyMode this[PolicyFamily family] { get; } Parameters Type Name Description PolicyFamily family Property Value Type Description PolicyMode Methods | Edit this page View Source Create(PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode, PolicyMode) Builds a snapshot with an explicit mode for the first seven families. WebSocketFrameBudget starts at Enforce (use With(PolicyFamily, PolicyMode) to change it) so this shipped signature stays binary-compatible. AllowAmbiguousFraming starts false. Declaration public static ProxyPolicyModes Create(PolicyMode bodyBudget, PolicyMode decompressionRatio, PolicyMode headerLimits, PolicyMode admissionControl, PolicyMode http2AbuseBudget, PolicyMode http2RelayValidation = PolicyMode.Disabled, PolicyMode http1ReplaySafety = PolicyMode.Observe) Parameters Type Name Description PolicyMode bodyBudget PolicyMode decompressionRatio PolicyMode headerLimits PolicyMode admissionControl PolicyMode http2AbuseBudget PolicyMode http2RelayValidation PolicyMode http1ReplaySafety Returns Type Description ProxyPolicyModes | Edit this page View Source With(PolicyFamily, PolicyMode) Returns a snapshot identical to this one but with mode for family. Declaration public ProxyPolicyModes With(PolicyFamily family, PolicyMode mode) Parameters Type Name Description PolicyFamily family PolicyMode mode Returns Type Description ProxyPolicyModes | Edit this page View Source WithAllObservedExceptDisabled() Returns a snapshot identical to this one but with every family dropped to Observe, except families already Disabled (which stay disabled - Observe would silently turn a family back on). This is the \"drop to Observe without redeploying\" runtime switch the plan's rollout section requires. Declaration public ProxyPolicyModes WithAllObservedExceptDisabled() Returns Type Description ProxyPolicyModes | Edit this page View Source WithAllowAmbiguousFraming(bool) Returns a snapshot identical to this one with AllowAmbiguousFraming set explicitly. A partial config overlay uses this so an omitted flag does not clear a value set by the profile. Declaration public ProxyPolicyModes WithAllowAmbiguousFraming(bool enabled) Parameters Type Name Description bool enabled Returns Type Description ProxyPolicyModes | Edit this page View Source WithAllowAmbiguousFramingEnabled() The single, explicit, isolated act of relaying ambiguous HTTP/1 framing instead of rejecting it. See the type-level remarks; never call this as a side effect of applying a profile. Declaration public ProxyPolicyModes WithAllowAmbiguousFramingEnabled() Returns Type Description ProxyPolicyModes" }, "api/Titanium.Web.Proxy.Options.ProxyProfile.html": { "href": "api/Titanium.Web.Proxy.Options.ProxyProfile.html", @@ -532,7 +537,7 @@ "api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html": { "href": "api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html", "title": "Class ProxyResourceLimits | Titanium Web Proxy", - "summary": "Class ProxyResourceLimits Immutable, validated snapshot of the resource bounds a peer can make the proxy allocate: header shape, body/decompression budgets, concurrency and abuse-rate ceilings, and pool / certificate-cache sizing. Constructed only through Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?), which validates every field up front, so an invalid limit is a construction-time exception rather than a runtime surprise discovered mid-connection. A limit that can legitimately be turned off is typed as nullable with null meaning \"disabled\" - an explicit state - rather than overloading 0 or a negative number to mean the same thing. Limits that must always be enforced because disabling them would leave the proxy itself exploitable (the concurrent-stream cap, the open-header-block frame bound) are non-nullable and always validated to be strictly positive. This type has no back-reference to ProxyServer and no mutable state after construction: it is meant to be handed down to subsystems by value, not looked up through a service locator or an ambient static, so the dependency graph among consumers stays acyclic per the plan's \"Constraints on the policy layer\" section. Inheritance object ProxyResourceLimits Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.ReferenceEquals(object, object) object.ToString() Namespace: Titanium.Web.Proxy.Options Assembly: Titanium.Web.Proxy.dll Syntax public sealed class ProxyResourceLimits Properties | Edit this page View Source ConnectionPoolingEnabled Whether upstream TCP connection pooling is enabled. Disabling pooling is an explicit choice represented by this flag, not by giving MaxCachedConnectionsPerHost a sentinel value that also has to be validated as \"not zero, not negative, unless it means disabled\". Declaration public bool ConnectionPoolingEnabled { get; } Property Value Type Description bool | Edit this page View Source Default Today's shipped values, carried forward as the Balanced profile's starting point. Header, decompression, CONTINUATION, and reset budgets stay high enough that ordinary browser traffic does not trip them. MaxConcurrentStreamsPerConnection is 1000, matching Chrome's own concurrent-stream setting: 256 reset later requests on a single x.com connection (REFUSED_STREAM) while the same page succeeded with no proxy. The check runs only when a stream is opened, so traffic under the old cap takes the same DATA path. PublicFacing pins the cap back to 256. MaxCertificateCacheEntries is the one deliberate exception to \"unchanged for existing traffic\": measurement showed process memory holding steady at ~100 MB above baseline after closing every browser tab and idling for minutes, tracking the number of distinct MITM'd hosts rather than any live connection or session count. Unbounded in-memory certificate retention is a defect, not a compatibility guarantee, so the shipped default now bounds it at 1024 entries (roughly 10 MB, comfortably above real single-session browsing) rather than leaving it unbounded like every other nullable limit here defaults to. Declaration public static ProxyResourceLimits Default { get; } Property Value Type Description ProxyResourceLimits | Edit this page View Source MaxCachedConnectionsPerHost Maximum pooled connections cached per remote host. Only meaningful when ConnectionPoolingEnabled is true; always validated as strictly positive regardless, so a future caller cannot re-introduce the \"0 spins forever holding the pool lock\" defect by flipping the flag without also fixing this value. Declaration public int MaxCachedConnectionsPerHost { get; } Property Value Type Description int | Edit this page View Source MaxCertificateCacheEntries Maximum number of generated leaf certificates held in the in-memory certificate cache. Each entry holds a full X509Certificate2 with its private key, so unlike most other limits in this type this one defends against unbounded memory growth from ordinary browsing (many distinct MITM'd hosts), not just against an adversarial peer. null disables the bound and is not the shipped default - see Default. Declaration public int? MaxCertificateCacheEntries { get; } Property Value Type Description int? | Edit this page View Source MaxCertificateDiskCacheEntries Maximum number of generated leaf certificate files retained in the on-disk cache (Certificates.CertificateManager.SaveFakeCertificates), pruned independently of MaxCertificateCacheEntries. Disk is far cheaper than the in-memory cache's live X509Certificate2 handles, and a warm disk cache avoids repeating expensive certificate generation across process restarts, so this bound is deliberately independent and typically much larger (or unbounded). null disables the bound. Declaration public int? MaxCertificateDiskCacheEntries { get; } Property Value Type Description int? | Edit this page View Source MaxConcurrentClients Maximum number of concurrently admitted client connections, checked by the admission gate at handler entry/exit rather than the delayed ClientConnectionCount. null disables global admission control. Declaration public int? MaxConcurrentClients { get; } Property Value Type Description int? | Edit this page View Source MaxConcurrentStreamsPerConnection Proxy-owned cap on concurrent HTTP/2 streams per connection. Always enforced: this is the single source of truth consolidating what were previously two independent mechanisms, and is also the value advertised to the origin in the relayed SETTINGS frame so the advertised and enforced values never disagree. Declaration public int MaxConcurrentStreamsPerConnection { get; } Property Value Type Description int | Edit this page View Source MaxDecodedBodyBytes Maximum cumulative decompressed body bytes produced for a single request or response. null disables the budget. Always checked alongside MaxDecompressionRatio, since a ratio alone cannot bound total memory for a small compressed input that expands enormously without also capping the output side. Declaration public long? MaxDecodedBodyBytes { get; } Property Value Type Description long? | Edit this page View Source MaxDecompressionRatio Maximum allowed ratio of decompressed to compressed bytes. null disables the ratio check (relying on MaxDecodedBodyBytes alone). Declaration public double? MaxDecompressionRatio { get; } Property Value Type Description double? | Edit this page View Source MaxEncodedBodyBytes Maximum cumulative compressed/on-wire body bytes read for a single request or response. null disables the budget. Declaration public long? MaxEncodedBodyBytes { get; } Property Value Type Description long? | Edit this page View Source MaxHeaderAggregateBytes Maximum aggregate size of all header fields in one request or response, in bytes. Declaration public long MaxHeaderAggregateBytes { get; } Property Value Type Description long | Edit this page View Source MaxHeaderCount Maximum number of header fields accepted in one request or response. Declaration public int MaxHeaderCount { get; } Property Value Type Description int | Edit this page View Source MaxHeaderLineBytes Maximum length of a single header line (request/status line or one header field), in bytes. Declaration public long MaxHeaderLineBytes { get; } Property Value Type Description long | Edit this page View Source MaxOpenHeaderBlockDuration Maximum wall-clock duration an HTTP/2 header block may stay open (from the initial HEADERS/PUSH_PROMISE frame sent without END_HEADERS through its terminating CONTINUATION), independent of MaxOpenHeaderBlockFrames. Bounds a slow CONTINUATION-trickle variant that stays under the frame-count cap by pacing itself, which a frame-count-only bound cannot catch on its own. Always enforced. Declaration public TimeSpan MaxOpenHeaderBlockDuration { get; } Property Value Type Description TimeSpan | Edit this page View Source MaxOpenHeaderBlockFrames Maximum number of CONTINUATION frames tolerated for a single open HTTP/2 header block, independent of the existing byte cap. Always enforced: zero-length CONTINUATION frames never trip a byte-based check, and only one header block may be open per connection direction, so an unbounded frame count also head-of-line blocks every other stream. Declaration public int MaxOpenHeaderBlockFrames { get; } Property Value Type Description int | Edit this page View Source MaxOriginHttp2ConnectionsPerAuthority Maximum number of concurrent origin HTTP/2 connections the proxy may open for one authority (host+port+scheme) when multiplexing streams from a single client connection (SocketsHttpHandler EnableMultipleHttp2Connections analog). Always at least 1. Declaration public int MaxOriginHttp2ConnectionsPerAuthority { get; } Property Value Type Description int | Edit this page View Source MaxPeerInitiatedIncompleteStreamResets Maximum number of peer-initiated resets of streams that never completed, per connection, before the proxy tears the connection down. Proxy-initiated resets (e.g. in response to a client cancellation) do not count. null disables the reset budget. Declaration public int? MaxPeerInitiatedIncompleteStreamResets { get; } Property Value Type Description int? Methods | Edit this page View Source Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?) Validates and constructs a ProxyResourceLimits snapshot. Every non-nullable bound must be strictly positive; every nullable bound, if supplied, must also be strictly positive (use null to disable rather than a sentinel number). Declaration public static ProxyResourceLimits Create(long maxHeaderLineBytes, int maxHeaderCount, long maxHeaderAggregateBytes, long? maxEncodedBodyBytes, long? maxDecodedBodyBytes, double? maxDecompressionRatio, int? maxConcurrentClients, int maxConcurrentStreamsPerConnection, int? maxPeerInitiatedIncompleteStreamResets, int maxOpenHeaderBlockFrames, TimeSpan maxOpenHeaderBlockDuration, bool connectionPoolingEnabled, int maxCachedConnectionsPerHost, int? maxCertificateCacheEntries) Parameters Type Name Description long maxHeaderLineBytes int maxHeaderCount long maxHeaderAggregateBytes long? maxEncodedBodyBytes long? maxDecodedBodyBytes double? maxDecompressionRatio int? maxConcurrentClients int maxConcurrentStreamsPerConnection int? maxPeerInitiatedIncompleteStreamResets int maxOpenHeaderBlockFrames TimeSpan maxOpenHeaderBlockDuration bool connectionPoolingEnabled int maxCachedConnectionsPerHost int? maxCertificateCacheEntries Returns Type Description ProxyResourceLimits Exceptions Type Condition ArgumentOutOfRangeException A supplied value is zero or negative. | Edit this page View Source WithCertificateCacheBounds(int?, int?) Returns a copy of this instance with MaxCertificateCacheEntries and MaxCertificateDiskCacheEntries replaced, leaving every other limit unchanged. Added instead of extending Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?) - which is public API already shipped with a fixed parameter list - so that adding the independent disk-cache bound could not be a breaking change for existing callers. Declaration public ProxyResourceLimits WithCertificateCacheBounds(int? maxCertificateCacheEntries, int? maxCertificateDiskCacheEntries) Parameters Type Name Description int? maxCertificateCacheEntries See MaxCertificateCacheEntries. null disables the bound. int? maxCertificateDiskCacheEntries See MaxCertificateDiskCacheEntries. null disables the bound. Returns Type Description ProxyResourceLimits Exceptions Type Condition ArgumentOutOfRangeException A supplied value is zero or negative. | Edit this page View Source WithMaxConcurrentStreamsPerConnection(int) Returns a copy with MaxConcurrentStreamsPerConnection replaced. Declaration public ProxyResourceLimits WithMaxConcurrentStreamsPerConnection(int maxConcurrentStreamsPerConnection) Parameters Type Name Description int maxConcurrentStreamsPerConnection Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxOriginHttp2ConnectionsPerAuthority(int) Returns a copy with MaxOriginHttp2ConnectionsPerAuthority replaced. Declaration public ProxyResourceLimits WithMaxOriginHttp2ConnectionsPerAuthority(int maxOriginHttp2ConnectionsPerAuthority) Parameters Type Name Description int maxOriginHttp2ConnectionsPerAuthority Returns Type Description ProxyResourceLimits" + "summary": "Class ProxyResourceLimits Immutable, validated snapshot of the resource bounds a peer can make the proxy allocate: header shape, body/decompression budgets, concurrency and abuse-rate ceilings, and pool / certificate-cache sizing. Constructed only through Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?), which validates every field up front, so an invalid limit is a construction-time exception rather than a runtime surprise discovered mid-connection. A limit that can legitimately be turned off is typed as nullable with null meaning \"disabled\" - an explicit state - rather than overloading 0 or a negative number to mean the same thing. Limits that must always be enforced because disabling them would leave the proxy itself exploitable (the concurrent-stream cap, the open-header-block frame bound) are non-nullable and always validated to be strictly positive. This type has no back-reference to ProxyServer and no mutable state after construction: it is meant to be handed down to subsystems by value, not looked up through a service locator or an ambient static, so the dependency graph among consumers stays acyclic per the plan's \"Constraints on the policy layer\" section. Inheritance object ProxyResourceLimits Inherited Members object.Equals(object) object.Equals(object, object) object.GetHashCode() object.GetType() object.ReferenceEquals(object, object) object.ToString() Namespace: Titanium.Web.Proxy.Options Assembly: Titanium.Web.Proxy.dll Syntax public sealed class ProxyResourceLimits Fields | Edit this page View Source MaxDeferredOutboundBytesCeiling Upper bound for MaxDeferredOutboundBytesPerStream. Declaration public const int MaxDeferredOutboundBytesCeiling = 67108864 Field Value Type Description int | Edit this page View Source MaxHttp3FramePayloadCeiling Upper bound for MaxHttp3FramePayloadBytes. Declaration public const long MaxHttp3FramePayloadCeiling = 67108864 Field Value Type Description long Properties | Edit this page View Source ConnectionPoolingEnabled Whether upstream TCP connection pooling is enabled. Disabling pooling is an explicit choice represented by this flag, not by giving MaxCachedConnectionsPerHost a sentinel value that also has to be validated as \"not zero, not negative, unless it means disabled\". Declaration public bool ConnectionPoolingEnabled { get; } Property Value Type Description bool | Edit this page View Source Default Today's shipped values, carried forward as the Balanced profile's starting point. Header, decompression, CONTINUATION, and reset budgets stay high enough that ordinary browser traffic does not trip them. MaxConcurrentStreamsPerConnection is 1000, matching Chrome's own concurrent-stream setting: 256 reset later requests on a single x.com connection (REFUSED_STREAM) while the same page succeeded with no proxy. The check runs only when a stream is opened, so traffic under the old cap takes the same DATA path. PublicFacing pins the cap back to 256. MaxCertificateCacheEntries is the one deliberate exception to \"unchanged for existing traffic\": measurement showed process memory holding steady at ~100 MB above baseline after closing every browser tab and idling for minutes, tracking the number of distinct MITM'd hosts rather than any live connection or session count. Unbounded in-memory certificate retention is a defect, not a compatibility guarantee, so the shipped default now bounds it at 1024 entries (roughly 10 MB, comfortably above real single-session browsing) rather than leaving it unbounded like every other nullable limit here defaults to. Declaration public static ProxyResourceLimits Default { get; } Property Value Type Description ProxyResourceLimits | Edit this page View Source Http2WindowUpdateTimeoutSeconds Seconds to wait for an HTTP/2 WINDOW_UPDATE before failing the stream. Default 60. Declaration public int Http2WindowUpdateTimeoutSeconds { get; } Property Value Type Description int | Edit this page View Source MaxAuthChallengeRounds Maximum Windows/proxy authentication challenge rounds per request. Default 3. Declaration public int MaxAuthChallengeRounds { get; } Property Value Type Description int | Edit this page View Source MaxCachedConnectionsPerHost Maximum pooled connections cached per remote host. Only meaningful when ConnectionPoolingEnabled is true; always validated as strictly positive regardless, so a future caller cannot re-introduce the \"0 spins forever holding the pool lock\" defect by flipping the flag without also fixing this value. Declaration public int MaxCachedConnectionsPerHost { get; } Property Value Type Description int | Edit this page View Source MaxCertificateCacheEntries Maximum number of generated leaf certificates held in the in-memory certificate cache. Each entry holds a full X509Certificate2 with its private key, so unlike most other limits in this type this one defends against unbounded memory growth from ordinary browsing (many distinct MITM'd hosts), not just against an adversarial peer. null disables the bound and is not the shipped default - see Default. Declaration public int? MaxCertificateCacheEntries { get; } Property Value Type Description int? | Edit this page View Source MaxCertificateDiskCacheEntries Maximum number of generated leaf certificate files retained in the on-disk cache (Certificates.CertificateManager.SaveFakeCertificates), pruned independently of MaxCertificateCacheEntries. Disk is far cheaper than the in-memory cache's live X509Certificate2 handles, and a warm disk cache avoids repeating expensive certificate generation across process restarts, so this bound is deliberately independent and typically much larger (or unbounded). null disables the bound. Declaration public int? MaxCertificateDiskCacheEntries { get; } Property Value Type Description int? | Edit this page View Source MaxConcurrentClients Maximum number of concurrently admitted client connections, checked by the admission gate at handler entry/exit rather than the delayed ClientConnectionCount. null disables global admission control. Declaration public int? MaxConcurrentClients { get; } Property Value Type Description int? | Edit this page View Source MaxConcurrentStreamsPerConnection Proxy-owned cap on concurrent HTTP/2 streams per connection. Always enforced: this is the single source of truth consolidating what were previously two independent mechanisms, and is also the value advertised to the origin in the relayed SETTINGS frame so the advertised and enforced values never disagree. Declaration public int MaxConcurrentStreamsPerConnection { get; } Property Value Type Description int | Edit this page View Source MaxDecodedBodyBytes Maximum cumulative decompressed body bytes produced for a single request or response. null disables the budget. Always checked alongside MaxDecompressionRatio, since a ratio alone cannot bound total memory for a small compressed input that expands enormously without also capping the output side. Declaration public long? MaxDecodedBodyBytes { get; } Property Value Type Description long? | Edit this page View Source MaxDecompressionRatio Maximum allowed ratio of decompressed to compressed bytes. null disables the ratio check (relying on MaxDecodedBodyBytes alone). Declaration public double? MaxDecompressionRatio { get; } Property Value Type Description double? | Edit this page View Source MaxDeferredOutboundBytesPerStream Bytes of HTTP/2 DATA that may be parked per stream waiting for send-window credit. Worst-case memory is concurrent streams times this value. Default 4 MiB + 16 KiB. Ceiling 64 MiB. Declaration public int MaxDeferredOutboundBytesPerStream { get; } Property Value Type Description int | Edit this page View Source MaxEncodedBodyBytes Maximum cumulative compressed/on-wire body bytes read for a single request or response. null disables the budget. Declaration public long? MaxEncodedBodyBytes { get; } Property Value Type Description long? | Edit this page View Source MaxHeaderAggregateBytes Maximum aggregate size of all header fields in one request or response, in bytes. Declaration public long MaxHeaderAggregateBytes { get; } Property Value Type Description long | Edit this page View Source MaxHeaderCount Maximum number of header fields accepted in one request or response. Declaration public int MaxHeaderCount { get; } Property Value Type Description int | Edit this page View Source MaxHeaderLineBytes Maximum length of a single header line (request/status line or one header field), in bytes. Declaration public long MaxHeaderLineBytes { get; } Property Value Type Description long | Edit this page View Source MaxHttp2CompressedHeaderBlockBytes Maximum compressed HTTP/2 header block (HEADERS + CONTINUATION) in bytes. Default 256 KiB. Declaration public int MaxHttp2CompressedHeaderBlockBytes { get; } Property Value Type Description int | Edit this page View Source MaxHttp3FramePayloadBytes Maximum HTTP/3 frame payload accepted before H3_EXCESSIVE_LOAD. Default 4 MiB. Ceiling 64 MiB. Declaration public long MaxHttp3FramePayloadBytes { get; } Property Value Type Description long | Edit this page View Source MaxInterimResponses Maximum interim (1xx) responses accepted from one origin before the stream fails. Default 20. Declaration public int MaxInterimResponses { get; } Property Value Type Description int | Edit this page View Source MaxOpenHeaderBlockDuration Maximum wall-clock duration an HTTP/2 header block may stay open (from the initial HEADERS/PUSH_PROMISE frame sent without END_HEADERS through its terminating CONTINUATION), independent of MaxOpenHeaderBlockFrames. Bounds a slow CONTINUATION-trickle variant that stays under the frame-count cap by pacing itself, which a frame-count-only bound cannot catch on its own. Always enforced. Declaration public TimeSpan MaxOpenHeaderBlockDuration { get; } Property Value Type Description TimeSpan | Edit this page View Source MaxOpenHeaderBlockFrames Maximum number of CONTINUATION frames tolerated for a single open HTTP/2 header block, independent of the existing byte cap. Always enforced: zero-length CONTINUATION frames never trip a byte-based check, and only one header block may be open per connection direction, so an unbounded frame count also head-of-line blocks every other stream. Declaration public int MaxOpenHeaderBlockFrames { get; } Property Value Type Description int | Edit this page View Source MaxOriginHttp2ConnectionsPerAuthority Maximum number of concurrent origin HTTP/2 connections the proxy may open for one authority (host+port+scheme) when multiplexing streams from a single client connection (SocketsHttpHandler EnableMultipleHttp2Connections analog). Always at least 1. Declaration public int MaxOriginHttp2ConnectionsPerAuthority { get; } Property Value Type Description int | Edit this page View Source MaxPeerInitiatedIncompleteStreamResets Maximum number of peer-initiated resets of streams that never completed, per connection, before the proxy tears the connection down. Proxy-initiated resets (e.g. in response to a client cancellation) do not count. null disables the reset budget. Declaration public int? MaxPeerInitiatedIncompleteStreamResets { get; } Property Value Type Description int? | Edit this page View Source MaxTrailerHeaderBlockBytes Maximum trailer header block size in bytes. Default 16 KiB. Declaration public int MaxTrailerHeaderBlockBytes { get; } Property Value Type Description int | Edit this page View Source MaxTrailerHeaderCount Maximum trailer header fields on one chunked message. Default 100. Declaration public int MaxTrailerHeaderCount { get; } Property Value Type Description int | Edit this page View Source MaxUpstreamProxyAuthenticationAttempts Maximum CONNECT authentication attempts against an upstream proxy. Default 5. Declaration public int MaxUpstreamProxyAuthenticationAttempts { get; } Property Value Type Description int | Edit this page View Source MaxWinAuthTokenBytes Maximum SSPI token buffer in bytes. Default 12288. Declaration public int MaxWinAuthTokenBytes { get; } Property Value Type Description int Methods | Edit this page View Source Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?) Validates and constructs a ProxyResourceLimits snapshot. Every non-nullable bound must be strictly positive; every nullable bound, if supplied, must also be strictly positive (use null to disable rather than a sentinel number). Declaration public static ProxyResourceLimits Create(long maxHeaderLineBytes, int maxHeaderCount, long maxHeaderAggregateBytes, long? maxEncodedBodyBytes, long? maxDecodedBodyBytes, double? maxDecompressionRatio, int? maxConcurrentClients, int maxConcurrentStreamsPerConnection, int? maxPeerInitiatedIncompleteStreamResets, int maxOpenHeaderBlockFrames, TimeSpan maxOpenHeaderBlockDuration, bool connectionPoolingEnabled, int maxCachedConnectionsPerHost, int? maxCertificateCacheEntries) Parameters Type Name Description long maxHeaderLineBytes int maxHeaderCount long maxHeaderAggregateBytes long? maxEncodedBodyBytes long? maxDecodedBodyBytes double? maxDecompressionRatio int? maxConcurrentClients int maxConcurrentStreamsPerConnection int? maxPeerInitiatedIncompleteStreamResets int maxOpenHeaderBlockFrames TimeSpan maxOpenHeaderBlockDuration bool connectionPoolingEnabled int maxCachedConnectionsPerHost int? maxCertificateCacheEntries Returns Type Description ProxyResourceLimits Exceptions Type Condition ArgumentOutOfRangeException A supplied value is zero or negative. | Edit this page View Source WithAuthenticationBounds(int, int, int) Returns a copy with authentication bounds replaced. Declaration public ProxyResourceLimits WithAuthenticationBounds(int maxAuthChallengeRounds, int maxUpstreamProxyAuthenticationAttempts, int maxWinAuthTokenBytes) Parameters Type Name Description int maxAuthChallengeRounds int maxUpstreamProxyAuthenticationAttempts int maxWinAuthTokenBytes Returns Type Description ProxyResourceLimits | Edit this page View Source WithCertificateCacheBounds(int?, int?) Returns a copy of this instance with MaxCertificateCacheEntries and MaxCertificateDiskCacheEntries replaced, leaving every other limit unchanged. Added instead of extending Create(long, int, long, long?, long?, double?, int?, int, int?, int, TimeSpan, bool, int, int?) - which is public API already shipped with a fixed parameter list - so that adding the independent disk-cache bound could not be a breaking change for existing callers. Declaration public ProxyResourceLimits WithCertificateCacheBounds(int? maxCertificateCacheEntries, int? maxCertificateDiskCacheEntries) Parameters Type Name Description int? maxCertificateCacheEntries See MaxCertificateCacheEntries. null disables the bound. int? maxCertificateDiskCacheEntries See MaxCertificateDiskCacheEntries. null disables the bound. Returns Type Description ProxyResourceLimits Exceptions Type Condition ArgumentOutOfRangeException A supplied value is zero or negative. | Edit this page View Source WithHttp2WindowUpdateTimeoutSeconds(int) Returns a copy with Http2WindowUpdateTimeoutSeconds replaced. Declaration public ProxyResourceLimits WithHttp2WindowUpdateTimeoutSeconds(int http2WindowUpdateTimeoutSeconds) Parameters Type Name Description int http2WindowUpdateTimeoutSeconds Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxConcurrentStreamsPerConnection(int) Returns a copy with MaxConcurrentStreamsPerConnection replaced. Declaration public ProxyResourceLimits WithMaxConcurrentStreamsPerConnection(int maxConcurrentStreamsPerConnection) Parameters Type Name Description int maxConcurrentStreamsPerConnection Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxDeferredOutboundBytesPerStream(int) Returns a copy with MaxDeferredOutboundBytesPerStream replaced. Declaration public ProxyResourceLimits WithMaxDeferredOutboundBytesPerStream(int maxDeferredOutboundBytesPerStream) Parameters Type Name Description int maxDeferredOutboundBytesPerStream Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxHttp2CompressedHeaderBlockBytes(int) Returns a copy with MaxHttp2CompressedHeaderBlockBytes replaced. Declaration public ProxyResourceLimits WithMaxHttp2CompressedHeaderBlockBytes(int maxHttp2CompressedHeaderBlockBytes) Parameters Type Name Description int maxHttp2CompressedHeaderBlockBytes Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxHttp3FramePayloadBytes(long) Returns a copy with MaxHttp3FramePayloadBytes replaced. Declaration public ProxyResourceLimits WithMaxHttp3FramePayloadBytes(long maxHttp3FramePayloadBytes) Parameters Type Name Description long maxHttp3FramePayloadBytes Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxInterimResponses(int) Returns a copy with MaxInterimResponses replaced. Declaration public ProxyResourceLimits WithMaxInterimResponses(int maxInterimResponses) Parameters Type Name Description int maxInterimResponses Returns Type Description ProxyResourceLimits | Edit this page View Source WithMaxOriginHttp2ConnectionsPerAuthority(int) Returns a copy with MaxOriginHttp2ConnectionsPerAuthority replaced. Declaration public ProxyResourceLimits WithMaxOriginHttp2ConnectionsPerAuthority(int maxOriginHttp2ConnectionsPerAuthority) Parameters Type Name Description int maxOriginHttp2ConnectionsPerAuthority Returns Type Description ProxyResourceLimits | Edit this page View Source WithTrailerHeaderBounds(int, int) Returns a copy with trailer header bounds replaced. Declaration public ProxyResourceLimits WithTrailerHeaderBounds(int maxTrailerHeaderCount, int maxTrailerHeaderBlockBytes) Parameters Type Name Description int maxTrailerHeaderCount int maxTrailerHeaderBlockBytes Returns Type Description ProxyResourceLimits" }, "api/Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html": { "href": "api/Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html", diff --git a/docs/xrefmap.yml b/docs/xrefmap.yml index f6be8c6d7..6c6c17fd4 100644 --- a/docs/xrefmap.yml +++ b/docs/xrefmap.yml @@ -3804,6 +3804,83 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Http.HeaderCollection.RemoveHeader nameWithType: HeaderCollection.RemoveHeader +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException + name: HeaderLimitsExceededException + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html + commentId: T:Titanium.Web.Proxy.Http.HeaderLimitsExceededException + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException + nameWithType: HeaderLimitsExceededException +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.#ctor(System.Boolean,System.Int64,System.Int64,System.Boolean) + name: HeaderLimitsExceededException(bool, long, long, bool) + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException__ctor_System_Boolean_System_Int64_System_Int64_System_Boolean_ + commentId: M:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.#ctor(System.Boolean,System.Int64,System.Int64,System.Boolean) + name.vb: New(Boolean, Long, Long, Boolean) + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.HeaderLimitsExceededException(bool, long, long, bool) + fullName.vb: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.New(Boolean, Long, Long, Boolean) + nameWithType: HeaderLimitsExceededException.HeaderLimitsExceededException(bool, long, long, bool) + nameWithType.vb: HeaderLimitsExceededException.New(Boolean, Long, Long, Boolean) +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.#ctor* + name: HeaderLimitsExceededException + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException__ctor_ + commentId: Overload:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.#ctor + isSpec: "True" + name.vb: New + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.HeaderLimitsExceededException + fullName.vb: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.New + nameWithType: HeaderLimitsExceededException.HeaderLimitsExceededException + nameWithType.vb: HeaderLimitsExceededException.New +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsCount + name: IsCount + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_IsCount + commentId: P:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsCount + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsCount + nameWithType: HeaderLimitsExceededException.IsCount +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsCount* + name: IsCount + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_IsCount_ + commentId: Overload:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsCount + isSpec: "True" + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsCount + nameWithType: HeaderLimitsExceededException.IsCount +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsRequest + name: IsRequest + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_IsRequest + commentId: P:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsRequest + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsRequest + nameWithType: HeaderLimitsExceededException.IsRequest +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsRequest* + name: IsRequest + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_IsRequest_ + commentId: Overload:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsRequest + isSpec: "True" + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.IsRequest + nameWithType: HeaderLimitsExceededException.IsRequest +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Limit + name: Limit + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_Limit + commentId: P:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Limit + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Limit + nameWithType: HeaderLimitsExceededException.Limit +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Limit* + name: Limit + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_Limit_ + commentId: Overload:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Limit + isSpec: "True" + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Limit + nameWithType: HeaderLimitsExceededException.Limit +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Observed + name: Observed + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_Observed + commentId: P:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Observed + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Observed + nameWithType: HeaderLimitsExceededException.Observed +- uid: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Observed* + name: Observed + href: api/Titanium.Web.Proxy.Http.HeaderLimitsExceededException.html#Titanium_Web_Proxy_Http_HeaderLimitsExceededException_Observed_ + commentId: Overload:Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Observed + isSpec: "True" + fullName: Titanium.Web.Proxy.Http.HeaderLimitsExceededException.Observed + nameWithType: HeaderLimitsExceededException.Observed - uid: Titanium.Web.Proxy.Http.HttpWebClient name: HttpWebClient href: api/Titanium.Web.Proxy.Http.HttpWebClient.html @@ -8222,6 +8299,22 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllObservedExceptDisabled nameWithType: ProxyPolicyModes.WithAllObservedExceptDisabled +- uid: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming(System.Boolean) + name: WithAllowAmbiguousFraming(bool) + href: api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html#Titanium_Web_Proxy_Options_ProxyPolicyModes_WithAllowAmbiguousFraming_System_Boolean_ + commentId: M:Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming(System.Boolean) + name.vb: WithAllowAmbiguousFraming(Boolean) + fullName: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming(bool) + fullName.vb: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming(Boolean) + nameWithType: ProxyPolicyModes.WithAllowAmbiguousFraming(bool) + nameWithType.vb: ProxyPolicyModes.WithAllowAmbiguousFraming(Boolean) +- uid: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming* + name: WithAllowAmbiguousFraming + href: api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html#Titanium_Web_Proxy_Options_ProxyPolicyModes_WithAllowAmbiguousFraming_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFraming + nameWithType: ProxyPolicyModes.WithAllowAmbiguousFraming - uid: Titanium.Web.Proxy.Options.ProxyPolicyModes.WithAllowAmbiguousFramingEnabled name: WithAllowAmbiguousFramingEnabled() href: api/Titanium.Web.Proxy.Options.ProxyPolicyModes.html#Titanium_Web_Proxy_Options_ProxyPolicyModes_WithAllowAmbiguousFramingEnabled @@ -8495,6 +8588,32 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.Default nameWithType: ProxyResourceLimits.Default +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds + name: Http2WindowUpdateTimeoutSeconds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_Http2WindowUpdateTimeoutSeconds + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds + nameWithType: ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds* + name: Http2WindowUpdateTimeoutSeconds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_Http2WindowUpdateTimeoutSeconds_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds + nameWithType: ProxyResourceLimits.Http2WindowUpdateTimeoutSeconds +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxAuthChallengeRounds + name: MaxAuthChallengeRounds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxAuthChallengeRounds + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxAuthChallengeRounds + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxAuthChallengeRounds + nameWithType: ProxyResourceLimits.MaxAuthChallengeRounds +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxAuthChallengeRounds* + name: MaxAuthChallengeRounds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxAuthChallengeRounds_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxAuthChallengeRounds + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxAuthChallengeRounds + nameWithType: ProxyResourceLimits.MaxAuthChallengeRounds - uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxCachedConnectionsPerHost name: MaxCachedConnectionsPerHost href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxCachedConnectionsPerHost @@ -8586,6 +8705,25 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDecompressionRatio nameWithType: ProxyResourceLimits.MaxDecompressionRatio +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesCeiling + name: MaxDeferredOutboundBytesCeiling + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxDeferredOutboundBytesCeiling + commentId: F:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesCeiling + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesCeiling + nameWithType: ProxyResourceLimits.MaxDeferredOutboundBytesCeiling +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesPerStream + name: MaxDeferredOutboundBytesPerStream + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxDeferredOutboundBytesPerStream + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesPerStream + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesPerStream + nameWithType: ProxyResourceLimits.MaxDeferredOutboundBytesPerStream +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesPerStream* + name: MaxDeferredOutboundBytesPerStream + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxDeferredOutboundBytesPerStream_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesPerStream + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxDeferredOutboundBytesPerStream + nameWithType: ProxyResourceLimits.MaxDeferredOutboundBytesPerStream - uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxEncodedBodyBytes name: MaxEncodedBodyBytes href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxEncodedBodyBytes @@ -8638,6 +8776,51 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHeaderLineBytes nameWithType: ProxyResourceLimits.MaxHeaderLineBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes + name: MaxHttp2CompressedHeaderBlockBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxHttp2CompressedHeaderBlockBytes + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes + nameWithType: ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes* + name: MaxHttp2CompressedHeaderBlockBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxHttp2CompressedHeaderBlockBytes_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes + nameWithType: ProxyResourceLimits.MaxHttp2CompressedHeaderBlockBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadBytes + name: MaxHttp3FramePayloadBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxHttp3FramePayloadBytes + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadBytes + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadBytes + nameWithType: ProxyResourceLimits.MaxHttp3FramePayloadBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadBytes* + name: MaxHttp3FramePayloadBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxHttp3FramePayloadBytes_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadBytes + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadBytes + nameWithType: ProxyResourceLimits.MaxHttp3FramePayloadBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadCeiling + name: MaxHttp3FramePayloadCeiling + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxHttp3FramePayloadCeiling + commentId: F:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadCeiling + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxHttp3FramePayloadCeiling + nameWithType: ProxyResourceLimits.MaxHttp3FramePayloadCeiling +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxInterimResponses + name: MaxInterimResponses + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxInterimResponses + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxInterimResponses + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxInterimResponses + nameWithType: ProxyResourceLimits.MaxInterimResponses +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxInterimResponses* + name: MaxInterimResponses + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxInterimResponses_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxInterimResponses + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxInterimResponses + nameWithType: ProxyResourceLimits.MaxInterimResponses - uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxOpenHeaderBlockDuration name: MaxOpenHeaderBlockDuration href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxOpenHeaderBlockDuration @@ -8690,6 +8873,74 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxPeerInitiatedIncompleteStreamResets nameWithType: ProxyResourceLimits.MaxPeerInitiatedIncompleteStreamResets +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderBlockBytes + name: MaxTrailerHeaderBlockBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxTrailerHeaderBlockBytes + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderBlockBytes + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderBlockBytes + nameWithType: ProxyResourceLimits.MaxTrailerHeaderBlockBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderBlockBytes* + name: MaxTrailerHeaderBlockBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxTrailerHeaderBlockBytes_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderBlockBytes + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderBlockBytes + nameWithType: ProxyResourceLimits.MaxTrailerHeaderBlockBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderCount + name: MaxTrailerHeaderCount + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxTrailerHeaderCount + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderCount + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderCount + nameWithType: ProxyResourceLimits.MaxTrailerHeaderCount +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderCount* + name: MaxTrailerHeaderCount + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxTrailerHeaderCount_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderCount + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxTrailerHeaderCount + nameWithType: ProxyResourceLimits.MaxTrailerHeaderCount +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts + name: MaxUpstreamProxyAuthenticationAttempts + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxUpstreamProxyAuthenticationAttempts + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts + nameWithType: ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts* + name: MaxUpstreamProxyAuthenticationAttempts + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxUpstreamProxyAuthenticationAttempts_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts + nameWithType: ProxyResourceLimits.MaxUpstreamProxyAuthenticationAttempts +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxWinAuthTokenBytes + name: MaxWinAuthTokenBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxWinAuthTokenBytes + commentId: P:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxWinAuthTokenBytes + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxWinAuthTokenBytes + nameWithType: ProxyResourceLimits.MaxWinAuthTokenBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxWinAuthTokenBytes* + name: MaxWinAuthTokenBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_MaxWinAuthTokenBytes_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxWinAuthTokenBytes + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.MaxWinAuthTokenBytes + nameWithType: ProxyResourceLimits.MaxWinAuthTokenBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds(System.Int32,System.Int32,System.Int32) + name: WithAuthenticationBounds(int, int, int) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithAuthenticationBounds_System_Int32_System_Int32_System_Int32_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds(System.Int32,System.Int32,System.Int32) + name.vb: WithAuthenticationBounds(Integer, Integer, Integer) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds(int, int, int) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds(Integer, Integer, Integer) + nameWithType: ProxyResourceLimits.WithAuthenticationBounds(int, int, int) + nameWithType.vb: ProxyResourceLimits.WithAuthenticationBounds(Integer, Integer, Integer) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds* + name: WithAuthenticationBounds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithAuthenticationBounds_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithAuthenticationBounds + nameWithType: ProxyResourceLimits.WithAuthenticationBounds - uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithCertificateCacheBounds(System.Nullable{System.Int32},System.Nullable{System.Int32}) name: WithCertificateCacheBounds(int?, int?) href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithCertificateCacheBounds_System_Nullable_System_Int32__System_Nullable_System_Int32__ @@ -8706,6 +8957,22 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithCertificateCacheBounds nameWithType: ProxyResourceLimits.WithCertificateCacheBounds +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds(System.Int32) + name: WithHttp2WindowUpdateTimeoutSeconds(int) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithHttp2WindowUpdateTimeoutSeconds_System_Int32_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds(System.Int32) + name.vb: WithHttp2WindowUpdateTimeoutSeconds(Integer) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds(int) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds(Integer) + nameWithType: ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds(int) + nameWithType.vb: ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds(Integer) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds* + name: WithHttp2WindowUpdateTimeoutSeconds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithHttp2WindowUpdateTimeoutSeconds_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds + nameWithType: ProxyResourceLimits.WithHttp2WindowUpdateTimeoutSeconds - uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxConcurrentStreamsPerConnection(System.Int32) name: WithMaxConcurrentStreamsPerConnection(int) href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxConcurrentStreamsPerConnection_System_Int32_ @@ -8722,6 +8989,70 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxConcurrentStreamsPerConnection nameWithType: ProxyResourceLimits.WithMaxConcurrentStreamsPerConnection +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream(System.Int32) + name: WithMaxDeferredOutboundBytesPerStream(int) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxDeferredOutboundBytesPerStream_System_Int32_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream(System.Int32) + name.vb: WithMaxDeferredOutboundBytesPerStream(Integer) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream(int) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream(Integer) + nameWithType: ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream(int) + nameWithType.vb: ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream(Integer) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream* + name: WithMaxDeferredOutboundBytesPerStream + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxDeferredOutboundBytesPerStream_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream + nameWithType: ProxyResourceLimits.WithMaxDeferredOutboundBytesPerStream +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes(System.Int32) + name: WithMaxHttp2CompressedHeaderBlockBytes(int) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxHttp2CompressedHeaderBlockBytes_System_Int32_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes(System.Int32) + name.vb: WithMaxHttp2CompressedHeaderBlockBytes(Integer) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes(int) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes(Integer) + nameWithType: ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes(int) + nameWithType.vb: ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes(Integer) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes* + name: WithMaxHttp2CompressedHeaderBlockBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxHttp2CompressedHeaderBlockBytes_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes + nameWithType: ProxyResourceLimits.WithMaxHttp2CompressedHeaderBlockBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes(System.Int64) + name: WithMaxHttp3FramePayloadBytes(long) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxHttp3FramePayloadBytes_System_Int64_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes(System.Int64) + name.vb: WithMaxHttp3FramePayloadBytes(Long) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes(long) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes(Long) + nameWithType: ProxyResourceLimits.WithMaxHttp3FramePayloadBytes(long) + nameWithType.vb: ProxyResourceLimits.WithMaxHttp3FramePayloadBytes(Long) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes* + name: WithMaxHttp3FramePayloadBytes + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxHttp3FramePayloadBytes_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxHttp3FramePayloadBytes + nameWithType: ProxyResourceLimits.WithMaxHttp3FramePayloadBytes +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses(System.Int32) + name: WithMaxInterimResponses(int) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxInterimResponses_System_Int32_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses(System.Int32) + name.vb: WithMaxInterimResponses(Integer) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses(int) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses(Integer) + nameWithType: ProxyResourceLimits.WithMaxInterimResponses(int) + nameWithType.vb: ProxyResourceLimits.WithMaxInterimResponses(Integer) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses* + name: WithMaxInterimResponses + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxInterimResponses_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxInterimResponses + nameWithType: ProxyResourceLimits.WithMaxInterimResponses - uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxOriginHttp2ConnectionsPerAuthority(System.Int32) name: WithMaxOriginHttp2ConnectionsPerAuthority(int) href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithMaxOriginHttp2ConnectionsPerAuthority_System_Int32_ @@ -8738,6 +9069,22 @@ references: isSpec: "True" fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithMaxOriginHttp2ConnectionsPerAuthority nameWithType: ProxyResourceLimits.WithMaxOriginHttp2ConnectionsPerAuthority +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds(System.Int32,System.Int32) + name: WithTrailerHeaderBounds(int, int) + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithTrailerHeaderBounds_System_Int32_System_Int32_ + commentId: M:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds(System.Int32,System.Int32) + name.vb: WithTrailerHeaderBounds(Integer, Integer) + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds(int, int) + fullName.vb: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds(Integer, Integer) + nameWithType: ProxyResourceLimits.WithTrailerHeaderBounds(int, int) + nameWithType.vb: ProxyResourceLimits.WithTrailerHeaderBounds(Integer, Integer) +- uid: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds* + name: WithTrailerHeaderBounds + href: api/Titanium.Web.Proxy.Options.ProxyResourceLimits.html#Titanium_Web_Proxy_Options_ProxyResourceLimits_WithTrailerHeaderBounds_ + commentId: Overload:Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds + isSpec: "True" + fullName: Titanium.Web.Proxy.Options.ProxyResourceLimits.WithTrailerHeaderBounds + nameWithType: ProxyResourceLimits.WithTrailerHeaderBounds - uid: Titanium.Web.Proxy.Options.ProxyTimeoutOptions name: ProxyTimeoutOptions href: api/Titanium.Web.Proxy.Options.ProxyTimeoutOptions.html diff --git a/src/Titanium.Cli/Config/RunCommand.cs b/src/Titanium.Cli/Config/RunCommand.cs index ad1ab5e20..57fa29ed1 100644 --- a/src/Titanium.Cli/Config/RunCommand.cs +++ b/src/Titanium.Cli/Config/RunCommand.cs @@ -74,6 +74,8 @@ internal static async Task ExecuteCoreAsync( // NOSONAR S3776 -- CLI run li return 1; } + WriteConfigWarnings(loaded); + // When launched as a service, resolve relative paths against the config directory // (SCM / systemd / launchd cwd is typically System32 or /). var configDir = Path.GetDirectoryName(Path.GetFullPath(configPath)); @@ -292,6 +294,8 @@ internal static async Task ReloadConfigAsync( // NOSONAR S107 -- Reload keeps es throw new InvalidOperationException(string.Join("; ", errors)); } + WriteConfigWarnings(loaded); + ServerConfigApplier.Apply(proxy, loaded.Config.Server); if (loaded.Config.Clusters.Count > 0) { @@ -1041,4 +1045,12 @@ config.Plus.Options is not null && return config.Routes.Any(r => r.Transforms is { Count: > 0 }); } + + private static void WriteConfigWarnings(LoadedConfig loaded) + { + foreach (var warning in loaded.UnknownKeys) + AsyncConsole.WriteError("warning: " + warning); + foreach (var warning in TwpConfigValidator.CollectWarnings(loaded.Config)) + AsyncConsole.WriteError("warning: " + warning); + } } diff --git a/src/Titanium.Cli/Config/ServerConfigApplier.cs b/src/Titanium.Cli/Config/ServerConfigApplier.cs index 599840515..2e229a420 100644 --- a/src/Titanium.Cli/Config/ServerConfigApplier.cs +++ b/src/Titanium.Cli/Config/ServerConfigApplier.cs @@ -38,6 +38,21 @@ public static void Apply(ProxyServer proxy, ServerConfig? server) ApplyUpstream(proxy, server.Upstream); ApplyCertificateManager(proxy, server.CertificateManager); ApplyDecryptExclusions(proxy, server); + ApplyDecryptFailureBypass(proxy, server); + if (!string.IsNullOrWhiteSpace(server.ProxyAuthenticationRealm)) + proxy.ProxyAuthenticationRealm = server.ProxyAuthenticationRealm; + } + + private static void ApplyDecryptFailureBypass(ProxyServer proxy, ServerConfig server) + { + if (server.EnableDecryptFailureBypass is bool enabled) + proxy.EnableDecryptFailureBypass = enabled; + if (server.DecryptFailureBypassTtlMinutes is int minutes && minutes > 0) + proxy.DecryptFailureBypassTtl = TimeSpan.FromMinutes(minutes); + if (server.DecryptFailureBypassMaxEntries is int entries && entries > 0) + proxy.DecryptFailureBypassMaxEntries = entries; + if (server.DecryptFailureBypassThreshold is int threshold && threshold > 0) + proxy.DecryptFailureBypassThreshold = threshold; } /// @@ -312,6 +327,22 @@ private static void ApplyLimits(ProxyServer proxy, LimitsConfig? limits) built = built.WithCertificateCacheBounds( built.MaxCertificateCacheEntries, limits.MaxCertificateDiskCacheEntries ?? current.MaxCertificateDiskCacheEntries); + built = built.WithMaxHttp3FramePayloadBytes( + limits.MaxHttp3FramePayloadBytes ?? current.MaxHttp3FramePayloadBytes); + built = built.WithMaxDeferredOutboundBytesPerStream( + limits.MaxDeferredOutboundBytesPerStream ?? current.MaxDeferredOutboundBytesPerStream); + built = built.WithTrailerHeaderBounds( + limits.MaxTrailerHeaderCount ?? current.MaxTrailerHeaderCount, + limits.MaxTrailerHeaderBlockBytes ?? current.MaxTrailerHeaderBlockBytes); + built = built.WithMaxHttp2CompressedHeaderBlockBytes( + limits.MaxHttp2CompressedHeaderBlockBytes ?? current.MaxHttp2CompressedHeaderBlockBytes); + built = built.WithMaxInterimResponses(limits.MaxInterimResponses ?? current.MaxInterimResponses); + built = built.WithAuthenticationBounds( + limits.MaxAuthChallengeRounds ?? current.MaxAuthChallengeRounds, + limits.MaxUpstreamProxyAuthenticationAttempts ?? current.MaxUpstreamProxyAuthenticationAttempts, + limits.MaxWinAuthTokenBytes ?? current.MaxWinAuthTokenBytes); + built = built.WithHttp2WindowUpdateTimeoutSeconds( + limits.Http2WindowUpdateTimeoutSeconds ?? current.Http2WindowUpdateTimeoutSeconds); proxy.ResourceLimits = built; @@ -338,22 +369,25 @@ private static void ApplyPolicyModes(ProxyServer proxy, PolicyModesConfig? polic return; } - var current = proxy.PolicyModes; - var modes = ProxyPolicyModes.Create( - ParsePolicyMode(policy.BodyBudget, current[PolicyFamily.BodyBudget]), - ParsePolicyMode(policy.DecompressionRatio, current[PolicyFamily.DecompressionRatio]), - ParsePolicyMode(policy.HeaderLimits, current[PolicyFamily.HeaderLimits]), - ParsePolicyMode(policy.AdmissionControl, current[PolicyFamily.AdmissionControl]), - ParsePolicyMode(policy.Http2AbuseBudget, current[PolicyFamily.Http2AbuseBudget]), - ParsePolicyMode(policy.Http2RelayValidation, current[PolicyFamily.Http2RelayValidation])) - .With( - PolicyFamily.WebSocketFrameBudget, - ParsePolicyMode(policy.WebSocketFrameBudget, current[PolicyFamily.WebSocketFrameBudget])); - - if (policy.AllowAmbiguousFraming == true) - { - modes = modes.WithAllowAmbiguousFramingEnabled(); - } + var modes = proxy.PolicyModes; + if (!string.IsNullOrWhiteSpace(policy.BodyBudget)) + modes = modes.With(PolicyFamily.BodyBudget, ParsePolicyMode(policy.BodyBudget, modes[PolicyFamily.BodyBudget])); + if (!string.IsNullOrWhiteSpace(policy.DecompressionRatio)) + modes = modes.With(PolicyFamily.DecompressionRatio, ParsePolicyMode(policy.DecompressionRatio, modes[PolicyFamily.DecompressionRatio])); + if (!string.IsNullOrWhiteSpace(policy.HeaderLimits)) + modes = modes.With(PolicyFamily.HeaderLimits, ParsePolicyMode(policy.HeaderLimits, modes[PolicyFamily.HeaderLimits])); + if (!string.IsNullOrWhiteSpace(policy.AdmissionControl)) + modes = modes.With(PolicyFamily.AdmissionControl, ParsePolicyMode(policy.AdmissionControl, modes[PolicyFamily.AdmissionControl])); + if (!string.IsNullOrWhiteSpace(policy.Http2AbuseBudget)) + modes = modes.With(PolicyFamily.Http2AbuseBudget, ParsePolicyMode(policy.Http2AbuseBudget, modes[PolicyFamily.Http2AbuseBudget])); + if (!string.IsNullOrWhiteSpace(policy.Http2RelayValidation)) + modes = modes.With(PolicyFamily.Http2RelayValidation, ParsePolicyMode(policy.Http2RelayValidation, modes[PolicyFamily.Http2RelayValidation])); + if (!string.IsNullOrWhiteSpace(policy.WebSocketFrameBudget)) + modes = modes.With(PolicyFamily.WebSocketFrameBudget, ParsePolicyMode(policy.WebSocketFrameBudget, modes[PolicyFamily.WebSocketFrameBudget])); + if (!string.IsNullOrWhiteSpace(policy.Http1ReplaySafety)) + modes = modes.With(PolicyFamily.Http1ReplaySafety, ParsePolicyMode(policy.Http1ReplaySafety, modes[PolicyFamily.Http1ReplaySafety])); + if (policy.AllowAmbiguousFraming is bool framing) + modes = modes.WithAllowAmbiguousFraming(framing); proxy.PolicyModes = modes; } diff --git a/src/Titanium.Cli/Config/TestCommand.cs b/src/Titanium.Cli/Config/TestCommand.cs index 4da47f511..460528556 100644 --- a/src/Titanium.Cli/Config/TestCommand.cs +++ b/src/Titanium.Cli/Config/TestCommand.cs @@ -13,6 +13,7 @@ public static Task ExecuteAsync(string[] args) return Task.FromResult(PrintHelp()); } + var strict = args.Any(a => string.Equals(a, "--strict", StringComparison.OrdinalIgnoreCase)); var configPath = RunCommand.ParseConfigPath(args); var loaded = ConfigLoader.Load(configPath); var errors = TwpConfigValidator.Validate(loaded.Config); @@ -26,6 +27,13 @@ public static Task ExecuteAsync(string[] args) return Task.FromResult(1); } + foreach (var warning in loaded.UnknownKeys) + AsyncConsole.WriteError("warning: " + warning); + foreach (var warning in TwpConfigValidator.CollectWarnings(loaded.Config)) + AsyncConsole.WriteError("warning: " + warning); + if (strict && loaded.UnknownKeys.Count > 0) + return Task.FromResult(1); + var needsSession = RunCommand.ConfigNeedsSessionPath(loaded.Config); AsyncConsole.WriteLine($"Config OK: {configPath}"); AsyncConsole.WriteLine($"Routes: {loaded.Config.Routes.Count}, Clusters: {loaded.Config.Clusters.Count}, Listeners: {loaded.Config.Listeners.Count}"); @@ -37,9 +45,10 @@ public static Task ExecuteAsync(string[] args) internal static int PrintHelp() { AsyncConsole.WriteLine(""" - titanium test -c + titanium test -c [--strict] -c, --config Path to twp.yaml / .json / .twp / .conf (required). + --strict Exit 1 when the file contains unknown keys. Validates the config without opening listeners or serving traffic. """); diff --git a/src/Titanium.Cli/Parsers/ConfigLoader.cs b/src/Titanium.Cli/Parsers/ConfigLoader.cs index 278f52f3d..926f1ee07 100644 --- a/src/Titanium.Cli/Parsers/ConfigLoader.cs +++ b/src/Titanium.Cli/Parsers/ConfigLoader.cs @@ -10,6 +10,7 @@ internal sealed class LoadedConfig public required TwpConfig Config { get; init; } public required string Path { get; init; } public required string Dialect { get; init; } + public IReadOnlyList UnknownKeys { get; init; } = []; } internal static class ConfigLoader @@ -68,11 +69,15 @@ public static LoadedConfig Load(string path) } } + var text = File.ReadAllText(path); + var yaml = ext.Equals(".yaml", StringComparison.OrdinalIgnoreCase) || + ext.Equals(".yml", StringComparison.OrdinalIgnoreCase); return new LoadedConfig { Path = path, Dialect = "twp-native", - Config = TwpConfigLoader.LoadFile(path), + Config = yaml ? TwpConfigLoader.LoadYaml(text) : TwpConfigLoader.LoadJson(text), + UnknownKeys = UnknownConfigKeyScanner.Scan(text, yaml), }; } diff --git a/src/Titanium.Cli/Titanium.Cli.csproj b/src/Titanium.Cli/Titanium.Cli.csproj index 2b7d38d57..c271e6f1f 100644 --- a/src/Titanium.Cli/Titanium.Cli.csproj +++ b/src/Titanium.Cli/Titanium.Cli.csproj @@ -7,7 +7,7 @@ latest enable false - 7.0.18 + 7.0.19 Jehonathan Thomas Titanium Web Proxy CLI (titanium / twp). MIT diff --git a/src/Titanium.Inspector/Services/InterceptionService.cs b/src/Titanium.Inspector/Services/InterceptionService.cs index 437c82b2a..e576bc5c3 100644 --- a/src/Titanium.Inspector/Services/InterceptionService.cs +++ b/src/Titanium.Inspector/Services/InterceptionService.cs @@ -603,6 +603,59 @@ public bool ReapplySystemProxyIfEnabled() return SetSystemProxy(true, SystemProxySettings); } + /// + /// Turns the system proxy off, then back on, so clients drop a cached connection and open a new one. + /// Rewriting the same ProxyEnable=1 value does not do that: packaged apps that already + /// failed to reach localhost keep their direct connection until ProxyEnable actually changes. + /// Must not run on the UI thread: the WinINET settings broadcast can deadlock Avalonia. + /// + /// + /// When this returns false after the proxy is turned off, it stays off (the user turned System proxy off). + /// + /// True only when the system proxy is enabled again. + public bool NudgeSystemProxy(Func? stillWanted = null) + { + lock (_systemProxyGate) + { + LastSystemProxyError = null; + if (!_systemProxyEnabled) + { + return false; + } + + if (stillWanted is not null && !stillWanted()) + { + return false; + } + + if (_proxy is null || _endPoint is null || !_proxy.ProxyRunning) + { + LastSystemProxyError = "Proxy is not running"; + return false; + } + + try + { + if (!TryDisableSystemProxyLocked()) + { + return false; + } + + if (stillWanted is not null && !stillWanted()) + { + return false; + } + + return TryEnableSystemProxyLocked(SystemProxySettings); + } + catch (Exception ex) + { + LastSystemProxyError = ex.Message; + return false; + } + } + } + /// Install root CA and refresh from the store. /// True when the cert is present in the target Root store after install (or Unix SSL trust succeeded / needs Keychain confirm). /// diff --git a/src/Titanium.Inspector/Services/LoopbackExemptCopy.cs b/src/Titanium.Inspector/Services/LoopbackExemptCopy.cs new file mode 100644 index 000000000..6cd56b5e9 --- /dev/null +++ b/src/Titanium.Inspector/Services/LoopbackExemptCopy.cs @@ -0,0 +1,114 @@ +namespace Titanium.Inspector.Services; + +/// Whether Inspector can receive Store-app traffic right now. +public enum LoopbackCaptureReadiness +{ + Ready, + ProxyStopped, + SystemProxyOff, +} + +/// Result returned when the Allow Store apps dialog closes. +public sealed class LoopbackExemptResult +{ + public bool Changed { get; init; } + + public string StatusText { get; init; } = LoopbackExemptCopy.ClosedUnchanged; +} + +/// +/// Proxy state and the one-shot reconnect used by Allow Store apps. +/// Checkbox edits do not call . +/// +public sealed class LoopbackExemptSession +{ + public Func? Readiness { get; init; } + + /// + /// Turns the system proxy off and back on so running apps open a new connection. + /// Returns true only when the proxy is enabled again afterward. + /// + public Func>? RefreshRunningAppsAsync { get; init; } + + public LoopbackCaptureReadiness CurrentReadiness() => + Readiness?.Invoke() ?? LoopbackCaptureReadiness.ProxyStopped; +} + +/// User-facing copy for Allow Store apps. Shared by the dialog and tests. +public static class LoopbackExemptCopy +{ + public const string Intro = + "Windows Store / UWP apps are blocked from localhost by default. Check apps that should use Inspector, then Apply. " + + "Restart each app (fully quit it) after Apply. Inspector must be running with System proxy on. " + + "Clear all removes every allow entry."; + + public const string ClosedUnchanged = "Store apps unchanged."; + + public const string ProxyStoppedWarning = + "Start the proxy and turn on System proxy. Store apps cannot be captured until both are on."; + + public const string SystemProxyOffWarning = + "Turn on System proxy (Capture menu). The allow list only lets Store apps reach localhost; they still follow the system proxy."; + + public const string RefreshingStatus = "Refreshing system proxy so running apps reconnect…"; + + public static string? ProxyWarning(LoopbackCaptureReadiness readiness) => readiness switch + { + LoopbackCaptureReadiness.ProxyStopped => ProxyStoppedWarning, + LoopbackCaptureReadiness.SystemProxyOff => SystemProxyOffWarning, + _ => null, + }; + + /// + /// Refresh only after a real allow-list change, and only while System proxy is already on. + /// Checkbox edits are not a change until Apply or Clear. + /// + public static bool ShouldRefreshRunningApps(bool setChanged, LoopbackCaptureReadiness readiness) => + setChanged && readiness == LoopbackCaptureReadiness.Ready; + + public static bool SameSet(IEnumerable left, IEnumerable right) + { + var a = ToSet(left); + var b = ToSet(right); + return a.SetEquals(b); + } + + public static string UnchangedStatus(int count) => + count == 1 + ? "Allow list already matches this app." + : $"Allow list already matches these {count} apps."; + + public static string AppliedStatus(int count, LoopbackCaptureReadiness readiness, bool refreshed) + { + var allowed = count == 1 ? "Allowed 1 app." : $"Allowed {count} apps."; + if (refreshed) + { + return allowed + + " System proxy was refreshed so running apps reconnect. If traffic still does not appear, fully quit and reopen the app."; + } + + return readiness switch + { + LoopbackCaptureReadiness.ProxyStopped => + allowed + " Start the proxy and turn on System proxy, then fully quit and reopen the app.", + LoopbackCaptureReadiness.SystemProxyOff => + allowed + " Turn on System proxy, then fully quit and reopen the app.", + _ => allowed + " Fully quit and reopen the app to capture traffic.", + }; + } + + public static string ClearedStatus(LoopbackCaptureReadiness readiness, bool refreshed) + { + if (refreshed) + { + return "All loopback exemptions cleared. System proxy was refreshed so running apps reconnect."; + } + + return readiness == LoopbackCaptureReadiness.Ready + ? "All loopback exemptions cleared. Fully quit and reopen any app that was using Inspector." + : "All loopback exemptions cleared."; + } + + private static HashSet ToSet(IEnumerable values) => + new(values.Where(static s => !string.IsNullOrWhiteSpace(s)), StringComparer.OrdinalIgnoreCase); +} diff --git a/src/Titanium.Inspector/Services/SessionSearch.cs b/src/Titanium.Inspector/Services/SessionSearch.cs index 4d2dcfac1..bd82cbe21 100644 --- a/src/Titanium.Inspector/Services/SessionSearch.cs +++ b/src/Titanium.Inspector/Services/SessionSearch.cs @@ -3,8 +3,9 @@ namespace Titanium.Inspector.Services; /// -/// Session search/filter syntax: -/// method:, status: (exact or 2xx–5xx), host:, url:, body:, process:, content-type:, +/// Session search/filter syntax. A bare word matches URL, host, process name, process ID (exact), +/// method (exact), or status code (exact). Prefixes limit the match to one field: +/// method:, status: (exact or 2xx–5xx), host:, url:, body:, process:, pid:, protocol:, content-type:, /// is:ws|grpc|tunnel|multipart|error, hide:tunnel|image|static /// public static class SessionSearch @@ -194,31 +195,41 @@ public static string BuildSessionCountText( DateTimeOffset? oldestStartedUtc) { var searching = !string.IsNullOrWhiteSpace(searchQuery); + var kept = FormatSessionCount(totalCount); + if (retentionEvictedTotal > 0) + kept += " most recent"; + var text = searching - ? $"Sessions: {visibleCount} / {totalCount}" - : $"Sessions: {totalCount}"; + ? $"Sessions: {FormatSessionCount(visibleCount)} of {kept} match filter" + : $"Sessions: {kept}"; + + var emptySearch = searching && visibleCount == 0 && totalCount > 0; if (retentionEvictedTotal > 0 && oldestStartedUtc is { } oldest) { + // Retention dropped older sessions: the list is the most recent kept window. text += $" · since {oldest.ToLocalTime():HH:mm}"; } - if (searching && visibleCount == 0 && totalCount > 0) + if (emptySearch) text += FormatEmptySearchRetentionHint(retentionEvictedTotal); return text; } + /// Compact round thousands (10k) so a retention cap is readable in the status bar. + private static string FormatSessionCount(int count) => + count >= 1_000 && count % 1_000 == 0 + ? $"{count / 1_000}k" + : count.ToString("N0"); + private static string FormatEmptySearchRetentionHint(int retentionEvictedTotal) { if (retentionEvictedTotal <= 0) return ""; - var retention = retentionEvictedTotal == 1 - ? "1 removed by retention" - : $"{retentionEvictedTotal} removed by retention"; - - return $" · no matches in current list · {retention}"; + // Removed sessions are no longer searchable, so a zero-match result may not be the whole story. + return $" · {retentionEvictedTotal:N0} older removed by retention (not searched)"; } private static List<(string Key, string Value)> Tokenize(string query) @@ -232,7 +243,8 @@ private static string FormatEmptySearchRetentionHint(int retentionEvictedTotal) } else { - list.Add(("url", groups[3].Value)); + // Empty key is not a user prefix (those match [\w-]+), so text: stays an unknown key. + list.Add(("", groups[3].Value)); } } @@ -254,6 +266,11 @@ private static bool MatchToken( ((s.RequestBodyText?.Contains(token.Value, StringComparison.OrdinalIgnoreCase) == true) || (s.ResponseBodyText?.Contains(token.Value, StringComparison.OrdinalIgnoreCase) == true)), "process" => MatchProcess(s, token.Value), + "pid" => s.ProcessId > 0 && + s.ProcessId.ToString().Equals(token.Value, StringComparison.Ordinal), + "protocol" => + s.Protocol?.Contains(token.Value, StringComparison.OrdinalIgnoreCase) == true, + "" => MatchBareText(s, token.Value), "content-type" or "contenttype" => s.ContentType?.Contains(token.Value, StringComparison.OrdinalIgnoreCase) == true, "is" => token.Value.ToLowerInvariant() switch @@ -327,6 +344,43 @@ private static bool MatchProcess(SessionSnapshot s, string value) => s.ProcessDisplay.Contains(value, StringComparison.OrdinalIgnoreCase) || (s.ProcessId > 0 && s.ProcessId.ToString().Equals(value, StringComparison.Ordinal)); + /// + /// Free-text match over identifying columns. Process matches by name, or by exact PID — + /// never by substring of (chrome:4430), + /// which would treat port-like numbers as hits. + /// + private static bool MatchBareText(SessionSnapshot s, string value) + { + if (s.Url.Contains(value, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (MatchHost(s, value)) + { + return true; + } + + if (!string.IsNullOrEmpty(s.ProcessName) && + s.ProcessName.Contains(value, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + if (s.ProcessId > 0 && + s.ProcessId.ToString().Equals(value, StringComparison.Ordinal)) + { + return true; + } + + if (s.Method.Equals(value, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + + return s.StatusCode?.ToString() == value; + } + internal static bool IsImageOrStatic(SessionSnapshot s) { var ct = s.ContentType; diff --git a/src/Titanium.Inspector/Titanium.Inspector.csproj b/src/Titanium.Inspector/Titanium.Inspector.csproj index 1fda90cf1..95c3d84f2 100644 --- a/src/Titanium.Inspector/Titanium.Inspector.csproj +++ b/src/Titanium.Inspector/Titanium.Inspector.csproj @@ -8,7 +8,7 @@ enable true false - 7.0.18 + 7.0.19 Jehonathan Thomas Titanium Inspector desktop traffic debugger (PolyForm Noncommercial). LICENSE diff --git a/src/Titanium.Inspector/ViewModels/MainWindowViewModel.cs b/src/Titanium.Inspector/ViewModels/MainWindowViewModel.cs index 58fc28bce..1ccd10ea1 100644 --- a/src/Titanium.Inspector/ViewModels/MainWindowViewModel.cs +++ b/src/Titanium.Inspector/ViewModels/MainWindowViewModel.cs @@ -932,7 +932,6 @@ private async Task TryToggleSystemProxyAsync() SystemProxy = true; } - private Task AwaitCancellableAsync(Task task) => task.WaitAsync(StatusCancelToken); private Task AwaitCancellableAsync(Task task) => task.WaitAsync(StatusCancelToken); /// @@ -974,8 +973,52 @@ private async Task OpenLoopbackExemptAsync() return; } - await AwaitCancellableAsync(LoopbackExemptWindow.ShowAsync(owner)); - StatusText = "Allow Store apps dialog closed"; + var result = await AwaitDialogAsync(LoopbackExemptWindow.ShowAsync(owner, CreateLoopbackExemptSession())); + StatusText = result.StatusText; + } + + private LoopbackExemptSession CreateLoopbackExemptSession() => new() + { + Readiness = ReadLoopbackCaptureReadiness, + RefreshRunningAppsAsync = RefreshStoreAppsAfterLoopbackChangeAsync, + }; + + private LoopbackCaptureReadiness ReadLoopbackCaptureReadiness() + { + if (!_interception.IsRunning) + return LoopbackCaptureReadiness.ProxyStopped; + if (!_interception.SystemProxyEnabled) + return LoopbackCaptureReadiness.SystemProxyOff; + return LoopbackCaptureReadiness.Ready; + } + + /// + /// One off/on cycle of the system proxy after the Store-app allow list changes. + /// Runs off the UI thread. Does nothing when System proxy is already off. + /// + private async Task RefreshStoreAppsAfterLoopbackChangeAsync() + { + if (!_interception.SystemProxyEnabled || !_interception.IsRunning) + return false; + + var ok = await RunOffUiAsync( + () => _interception.NudgeSystemProxy( + stillWanted: () => _systemProxy && _interception.IsRunning), + CancellationToken.None).ConfigureAwait(true); + + if (!_interception.SystemProxyEnabled && _systemProxy) + { + await MarshalToUiAsync(() => + { + SetSystemProxyCore(false); + SetOutcomeStatus( + FormatSystemProxyFailureStatus(true, _interception.LastSystemProxyError), + StatusSeverity.Error, + toastImportant: true); + }, CancellationToken.None).ConfigureAwait(true); + } + + return ok && _interception.SystemProxyEnabled; } private async Task OpenSessionRetentionAsync() diff --git a/src/Titanium.Inspector/Views/LoopbackExemptWindow.axaml b/src/Titanium.Inspector/Views/LoopbackExemptWindow.axaml index f3b8b5359..a53a4e03f 100644 --- a/src/Titanium.Inspector/Views/LoopbackExemptWindow.axaml +++ b/src/Titanium.Inspector/Views/LoopbackExemptWindow.axaml @@ -3,11 +3,13 @@ xmlns:svc="using:Titanium.Inspector.Services" x:Class="Titanium.Inspector.Views.LoopbackExemptWindow" AutomationProperties.AutomationId="LoopbackExemptWindow" Title="Allow Store apps to use this proxy" - Width="640" Height="520" + Width="640" Height="560" WindowStartupLocation="CenterOwner"> - + +