Unverified Commit 94e57f7f authored by justcoding121's avatar justcoding121 Committed by GitHub

Merge pull request #456 from justcoding121/master

Beta
parents 2560b800 f65cecec
Doneness: Doneness:
- [ ] Build is okay - I made sure that this change is building successfully. - [ ] Build is okay - I made sure that this change is building successfully.
- [ ] No Bugs - I made sure that this change is working properly as expected. It doesn't have any bugs that you are aware of. - [ ] No Bugs - I made sure that this change is working properly as expected. It doesn't have any bugs that you are aware of.
- [ ] Branching - If this is not a hotfix, I am making this request against develop branch - [ ] Branching - If this is not a hotfix, I am making this request against master branch
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateInstanceFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticFields/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=PrivateStaticReadonly/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=a4ab2e69_002D4d9c_002D4345_002Dbcd1_002D5541dacf5d38/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static, Instance" AccessRightKinds="Private" Description="Method (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="METHOD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=dda2ffa1_002D435c_002D4111_002D88eb_002D1a7c93c382f0/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static, Instance" AccessRightKinds="Private" Description="Property (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="PROPERTY" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=dda2ffa1_002D435c_002D4111_002D88eb_002D1a7c93c382f0/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Static, Instance" AccessRightKinds="Private" Description="Property (private)"&gt;&lt;ElementKinds&gt;&lt;Kind Name="PROPERTY" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpAttributeForSingleLineMethodUpgrade/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ECSharpKeepExistingMigration/@EntryIndexedValue">True</s:Boolean>
......
...@@ -21,44 +21,52 @@ namespace Titanium.Web.Proxy.Helpers ...@@ -21,44 +21,52 @@ namespace Titanium.Web.Proxy.Helpers
// get local IP addresses // get local IP addresses
var localIPs = Dns.GetHostAddresses(Dns.GetHostName()); var localIPs = Dns.GetHostAddresses(Dns.GetHostName());
// test if any host IP equals to any local IP or to localhost // test if any host IP equals to any local IP or to localhost
return localIPs.Contains(address); return localIPs.Contains(address);
} }
internal static bool IsLocalIpAddress(string hostName) internal static bool IsLocalIpAddress(string hostName)
{ {
bool isLocalhost = false; hostName = hostName.ToLower();
var localhost = Dns.GetHostEntry("127.0.0.1"); if (hostName == "127.0.0.1"
if (hostName == localhost.HostName) || hostName == "localhost")
{ {
var hostEntry = Dns.GetHostEntry(hostName); return true;
isLocalhost = hostEntry.AddressList.Any(IPAddress.IsLoopback);
} }
if (!isLocalhost) var localhostDnsName = Dns.GetHostName().ToLower();
//if hostname matches current machine DNS name
if (hostName == localhostDnsName)
{
return true;
}
var isLocalhost = false;
IPHostEntry hostEntry = null;
//check if parsable to an IP Address
if (IPAddress.TryParse(hostName, out var ipAddress))
{ {
localhost = Dns.GetHostEntry(Dns.GetHostName()); hostEntry = Dns.GetHostEntry(localhostDnsName);
isLocalhost = hostEntry.AddressList.Any(x => x.Equals(ipAddress));
}
if (IPAddress.TryParse(hostName, out var ipAddress)) if (!isLocalhost)
{
try
{ {
isLocalhost = localhost.AddressList.Any(x => x.Equals(ipAddress)); hostEntry = Dns.GetHostEntry(hostName);
isLocalhost = hostEntry.AddressList.Any(x => hostEntry.AddressList.Any(x.Equals));
} }
catch (SocketException)
if (!isLocalhost)
{ {
try
{
var hostEntry = Dns.GetHostEntry(hostName);
isLocalhost = localhost.AddressList.Any(x => hostEntry.AddressList.Any(x.Equals));
}
catch (SocketException)
{
}
} }
} }
return isLocalhost; return isLocalhost;
} }
} }
......
...@@ -173,7 +173,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -173,7 +173,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
break; break;
case State.ReadMaxDynamicTableSize: case State.ReadMaxDynamicTableSize:
int maxSize = DecodeULE128(input); int maxSize = decodeULE128(input);
if (maxSize == -1) if (maxSize == -1)
{ {
return; return;
...@@ -190,7 +190,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -190,7 +190,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
break; break;
case State.ReadIndexedHeader: case State.ReadIndexedHeader:
int headerIndex = DecodeULE128(input); int headerIndex = decodeULE128(input);
if (headerIndex == -1) if (headerIndex == -1)
{ {
return; return;
...@@ -208,7 +208,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -208,7 +208,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
case State.ReadIndexedHeaderName: case State.ReadIndexedHeaderName:
// Header Name matches an entry in the Header Table // Header Name matches an entry in the Header Table
int nameIndex = DecodeULE128(input); int nameIndex = decodeULE128(input);
if (nameIndex == -1) if (nameIndex == -1)
{ {
return; return;
...@@ -272,7 +272,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -272,7 +272,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
case State.ReadLiteralHeaderNameLength: case State.ReadLiteralHeaderNameLength:
// Header Name is a Literal String // Header Name is a Literal String
nameLength = DecodeULE128(input); nameLength = decodeULE128(input);
if (nameLength == -1) if (nameLength == -1)
{ {
return; return;
...@@ -388,7 +388,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -388,7 +388,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
case State.ReadLiteralHeaderValueLength: case State.ReadLiteralHeaderValueLength:
// Header Value is a Literal String // Header Value is a Literal String
valueLength = DecodeULE128(input); valueLength = decodeULE128(input);
if (valueLength == -1) if (valueLength == -1)
{ {
return; return;
...@@ -612,7 +612,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -612,7 +612,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
} }
// Unsigned Little Endian Base 128 Variable-Length Integer Encoding // Unsigned Little Endian Base 128 Variable-Length Integer Encoding
private static int DecodeULE128(BinaryReader input) private static int decodeULE128(BinaryReader input)
{ {
long markedPosition = input.BaseStream.Position; long markedPosition = input.BaseStream.Position;
int result = 0; int result = 0;
......
...@@ -66,8 +66,8 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -66,8 +66,8 @@ namespace Titanium.Web.Proxy.Http2.Hpack
// If the header value is sensitive then it must never be indexed // If the header value is sensitive then it must never be indexed
if (sensitive) if (sensitive)
{ {
int nameIndex = GetNameIndex(name); int nameIndex = getNameIndex(name);
EncodeLiteral(output, name, value, HpackUtil.IndexType.Never, nameIndex); encodeLiteral(output, name, value, HpackUtil.IndexType.Never, nameIndex);
return; return;
} }
...@@ -78,11 +78,11 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -78,11 +78,11 @@ namespace Titanium.Web.Proxy.Http2.Hpack
if (staticTableIndex == -1) if (staticTableIndex == -1)
{ {
int nameIndex = StaticTable.GetIndex(name); int nameIndex = StaticTable.GetIndex(name);
EncodeLiteral(output, name, value, HpackUtil.IndexType.None, nameIndex); encodeLiteral(output, name, value, HpackUtil.IndexType.None, nameIndex);
} }
else else
{ {
EncodeInteger(output, 0x80, 7, staticTableIndex); encodeInteger(output, 0x80, 7, staticTableIndex);
} }
return; return;
...@@ -93,18 +93,18 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -93,18 +93,18 @@ namespace Titanium.Web.Proxy.Http2.Hpack
// If the headerSize is greater than the max table size then it must be encoded literally // If the headerSize is greater than the max table size then it must be encoded literally
if (headerSize > MaxHeaderTableSize) if (headerSize > MaxHeaderTableSize)
{ {
int nameIndex = GetNameIndex(name); int nameIndex = getNameIndex(name);
EncodeLiteral(output, name, value, HpackUtil.IndexType.None, nameIndex); encodeLiteral(output, name, value, HpackUtil.IndexType.None, nameIndex);
return; return;
} }
var headerField = GetEntry(name, value); var headerField = getEntry(name, value);
if (headerField != null) if (headerField != null)
{ {
int index = GetIndex(headerField.Index) + StaticTable.Length; int index = getIndex(headerField.Index) + StaticTable.Length;
// Section 6.1. Indexed Header Field Representation // Section 6.1. Indexed Header Field Representation
EncodeInteger(output, 0x80, 7, index); encodeInteger(output, 0x80, 7, index);
} }
else else
{ {
...@@ -112,16 +112,16 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -112,16 +112,16 @@ namespace Titanium.Web.Proxy.Http2.Hpack
if (staticTableIndex != -1) if (staticTableIndex != -1)
{ {
// Section 6.1. Indexed Header Field Representation // Section 6.1. Indexed Header Field Representation
EncodeInteger(output, 0x80, 7, staticTableIndex); encodeInteger(output, 0x80, 7, staticTableIndex);
} }
else else
{ {
int nameIndex = GetNameIndex(name); int nameIndex = getNameIndex(name);
EnsureCapacity(headerSize); ensureCapacity(headerSize);
var indexType = HpackUtil.IndexType.Incremental; var indexType = HpackUtil.IndexType.Incremental;
EncodeLiteral(output, name, value, indexType, nameIndex); encodeLiteral(output, name, value, indexType, nameIndex);
Add(name, value); add(name, value);
} }
} }
} }
...@@ -144,8 +144,8 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -144,8 +144,8 @@ namespace Titanium.Web.Proxy.Http2.Hpack
} }
MaxHeaderTableSize = maxHeaderTableSize; MaxHeaderTableSize = maxHeaderTableSize;
EnsureCapacity(0); ensureCapacity(0);
EncodeInteger(output, 0x20, 5, maxHeaderTableSize); encodeInteger(output, 0x20, 5, maxHeaderTableSize);
} }
/// <summary> /// <summary>
...@@ -155,7 +155,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -155,7 +155,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// <param name="mask">Mask.</param> /// <param name="mask">Mask.</param>
/// <param name="n">N.</param> /// <param name="n">N.</param>
/// <param name="i">The index.</param> /// <param name="i">The index.</param>
private static void EncodeInteger(BinaryWriter output, int mask, int n, int i) private static void encodeInteger(BinaryWriter output, int mask, int n, int i)
{ {
if (n < 0 || n > 8) if (n < 0 || n > 8)
{ {
...@@ -190,18 +190,18 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -190,18 +190,18 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// </summary> /// </summary>
/// <param name="output">Output.</param> /// <param name="output">Output.</param>
/// <param name="stringLiteral">String literal.</param> /// <param name="stringLiteral">String literal.</param>
private void EncodeStringLiteral(BinaryWriter output, string stringLiteral) private void encodeStringLiteral(BinaryWriter output, string stringLiteral)
{ {
var stringData = Encoding.UTF8.GetBytes(stringLiteral); var stringData = Encoding.UTF8.GetBytes(stringLiteral);
int huffmanLength = HuffmanEncoder.Instance.GetEncodedLength(stringData); int huffmanLength = HuffmanEncoder.Instance.GetEncodedLength(stringData);
if (huffmanLength < stringLiteral.Length) if (huffmanLength < stringLiteral.Length)
{ {
EncodeInteger(output, 0x80, 7, huffmanLength); encodeInteger(output, 0x80, 7, huffmanLength);
HuffmanEncoder.Instance.Encode(output, stringData); HuffmanEncoder.Instance.Encode(output, stringData);
} }
else else
{ {
EncodeInteger(output, 0x00, 7, stringData.Length); encodeInteger(output, 0x00, 7, stringData.Length);
output.Write(stringData, 0, stringData.Length); output.Write(stringData, 0, stringData.Length);
} }
} }
...@@ -214,7 +214,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -214,7 +214,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// <param name="value">Value.</param> /// <param name="value">Value.</param>
/// <param name="indexType">Index type.</param> /// <param name="indexType">Index type.</param>
/// <param name="nameIndex">Name index.</param> /// <param name="nameIndex">Name index.</param>
private void EncodeLiteral(BinaryWriter output, string name, string value, HpackUtil.IndexType indexType, private void encodeLiteral(BinaryWriter output, string name, string value, HpackUtil.IndexType indexType,
int nameIndex) int nameIndex)
{ {
int mask; int mask;
...@@ -240,21 +240,21 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -240,21 +240,21 @@ namespace Titanium.Web.Proxy.Http2.Hpack
throw new Exception("should not reach here"); throw new Exception("should not reach here");
} }
EncodeInteger(output, mask, prefixBits, nameIndex == -1 ? 0 : nameIndex); encodeInteger(output, mask, prefixBits, nameIndex == -1 ? 0 : nameIndex);
if (nameIndex == -1) if (nameIndex == -1)
{ {
EncodeStringLiteral(output, name); encodeStringLiteral(output, name);
} }
EncodeStringLiteral(output, value); encodeStringLiteral(output, value);
} }
private int GetNameIndex(string name) private int getNameIndex(string name)
{ {
int index = StaticTable.GetIndex(name); int index = StaticTable.GetIndex(name);
if (index == -1) if (index == -1)
{ {
index = GetIndex(name); index = getIndex(name);
if (index >= 0) if (index >= 0)
{ {
index += StaticTable.Length; index += StaticTable.Length;
...@@ -269,24 +269,24 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -269,24 +269,24 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// Removes the oldest entry from the dynamic table until sufficient space is available. /// Removes the oldest entry from the dynamic table until sufficient space is available.
/// </summary> /// </summary>
/// <param name="headerSize">Header size.</param> /// <param name="headerSize">Header size.</param>
private void EnsureCapacity(int headerSize) private void ensureCapacity(int headerSize)
{ {
while (size + headerSize > MaxHeaderTableSize) while (size + headerSize > MaxHeaderTableSize)
{ {
int index = Length(); int index = length();
if (index == 0) if (index == 0)
{ {
break; break;
} }
Remove(); remove();
} }
} }
/// <summary> /// <summary>
/// Return the number of header fields in the dynamic table. /// Return the number of header fields in the dynamic table.
/// </summary> /// </summary>
private int Length() private int length()
{ {
return size == 0 ? 0 : head.After.Index - head.Before.Index + 1; return size == 0 ? 0 : head.After.Index - head.Before.Index + 1;
} }
...@@ -298,15 +298,15 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -298,15 +298,15 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// <returns>The entry.</returns> /// <returns>The entry.</returns>
/// <param name="name">Name.</param> /// <param name="name">Name.</param>
/// <param name="value">Value.</param> /// <param name="value">Value.</param>
private HeaderEntry GetEntry(string name, string value) private HeaderEntry getEntry(string name, string value)
{ {
if (Length() == 0 || name == null || value == null) if (length() == 0 || name == null || value == null)
{ {
return null; return null;
} }
int h = Hash(name); int h = hash(name);
int i = Index(h); int i = index(h);
for (var e = headerFields[i]; e != null; e = e.Next) for (var e = headerFields[i]; e != null; e = e.Next)
{ {
if (e.Hash == h && Equals(name, e.Name) && Equals(value, e.Value)) if (e.Hash == h && Equals(name, e.Name) && Equals(value, e.Value))
...@@ -324,15 +324,15 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -324,15 +324,15 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// </summary> /// </summary>
/// <returns>The index.</returns> /// <returns>The index.</returns>
/// <param name="name">Name.</param> /// <param name="name">Name.</param>
private int GetIndex(string name) private int getIndex(string name)
{ {
if (Length() == 0 || name == null) if (length() == 0 || name == null)
{ {
return -1; return -1;
} }
int h = Hash(name); int h = hash(name);
int i = Index(h); int i = Encoder.index(h);
int index = -1; int index = -1;
for (var e = headerFields[i]; e != null; e = e.Next) for (var e = headerFields[i]; e != null; e = e.Next)
{ {
...@@ -343,7 +343,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -343,7 +343,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
} }
} }
return GetIndex(index); return getIndex(index);
} }
/// <summary> /// <summary>
...@@ -351,7 +351,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -351,7 +351,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// </summary> /// </summary>
/// <returns>The index.</returns> /// <returns>The index.</returns>
/// <param name="index">Index.</param> /// <param name="index">Index.</param>
private int GetIndex(int index) private int getIndex(int index)
{ {
if (index == -1) if (index == -1)
{ {
...@@ -370,25 +370,25 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -370,25 +370,25 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// </summary> /// </summary>
/// <param name="name">Name.</param> /// <param name="name">Name.</param>
/// <param name="value">Value.</param> /// <param name="value">Value.</param>
private void Add(string name, string value) private void add(string name, string value)
{ {
int headerSize = HttpHeader.SizeOf(name, value); int headerSize = HttpHeader.SizeOf(name, value);
// Clear the table if the header field size is larger than the capacity. // Clear the table if the header field size is larger than the capacity.
if (headerSize > MaxHeaderTableSize) if (headerSize > MaxHeaderTableSize)
{ {
Clear(); clear();
return; return;
} }
// Evict oldest entries until we have enough capacity. // Evict oldest entries until we have enough capacity.
while (size + headerSize > MaxHeaderTableSize) while (size + headerSize > MaxHeaderTableSize)
{ {
Remove(); remove();
} }
int h = Hash(name); int h = hash(name);
int i = Index(h); int i = index(h);
var old = headerFields[i]; var old = headerFields[i];
var e = new HeaderEntry(h, name, value, head.Before.Index - 1, old); var e = new HeaderEntry(h, name, value, head.Before.Index - 1, old);
headerFields[i] = e; headerFields[i] = e;
...@@ -399,7 +399,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -399,7 +399,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// <summary> /// <summary>
/// Remove and return the oldest header field from the dynamic table. /// Remove and return the oldest header field from the dynamic table.
/// </summary> /// </summary>
private HttpHeader Remove() private HttpHeader remove()
{ {
if (size == 0) if (size == 0)
{ {
...@@ -408,7 +408,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -408,7 +408,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
var eldest = head.After; var eldest = head.After;
int h = eldest.Hash; int h = eldest.Hash;
int i = Index(h); int i = index(h);
var prev = headerFields[i]; var prev = headerFields[i];
var e = prev; var e = prev;
while (e != null) while (e != null)
...@@ -440,7 +440,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -440,7 +440,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// <summary> /// <summary>
/// Remove all entries from the dynamic table. /// Remove all entries from the dynamic table.
/// </summary> /// </summary>
private void Clear() private void clear()
{ {
for (int i = 0; i < headerFields.Length; i++) for (int i = 0; i < headerFields.Length; i++)
{ {
...@@ -456,7 +456,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -456,7 +456,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// </summary> /// </summary>
/// <returns><c>true</c> if hash name; otherwise, <c>false</c>.</returns> /// <returns><c>true</c> if hash name; otherwise, <c>false</c>.</returns>
/// <param name="name">Name.</param> /// <param name="name">Name.</param>
private static int Hash(string name) private static int hash(string name)
{ {
int h = 0; int h = 0;
for (int i = 0; i < name.Length; i++) for (int i = 0; i < name.Length; i++)
...@@ -481,7 +481,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack ...@@ -481,7 +481,7 @@ namespace Titanium.Web.Proxy.Http2.Hpack
/// Returns the index into the hash table for the hash code h. /// Returns the index into the hash table for the hash code h.
/// </summary> /// </summary>
/// <param name="h">The height.</param> /// <param name="h">The height.</param>
private static int Index(int h) private static int index(int h)
{ {
return h % bucketSize; return h % bucketSize;
} }
......
...@@ -146,7 +146,6 @@ namespace Titanium.Web.Proxy.Network.Certificate ...@@ -146,7 +146,6 @@ namespace Titanium.Web.Proxy.Network.Certificate
x509Certificate.PrivateKey = DotNetUtilities.ToRSA(rsaparams); x509Certificate.PrivateKey = DotNetUtilities.ToRSA(rsaparams);
#else #else
var x509Certificate = withPrivateKey(certificate, rsaparams); var x509Certificate = withPrivateKey(certificate, rsaparams);
x509Certificate.FriendlyName = subjectName;
#endif #endif
if (!doNotSetFriendlyName) if (!doNotSetFriendlyName)
......
...@@ -229,6 +229,22 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -229,6 +229,22 @@ namespace Titanium.Web.Proxy.Network.Tcp
ProxyServer proxyServer, IPEndPoint upStreamEndPoint, ExternalProxy externalProxy, ProxyServer proxyServer, IPEndPoint upStreamEndPoint, ExternalProxy externalProxy,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
//deny connection to proxy end points to avoid infinite connection loop.
if (server.ProxyEndPoints.Any(x => x.Port == remotePort)
&& NetworkHelper.IsLocalIpAddress(remoteHostName))
{
throw new Exception($"A client is making HTTP request to one of the listening ports of this proxy {remoteHostName}:{remotePort}");
}
if (externalProxy != null)
{
if (server.ProxyEndPoints.Any(x => x.Port == externalProxy.Port)
&& NetworkHelper.IsLocalIpAddress(externalProxy.HostName))
{
throw new Exception($"A client is making HTTP request via external proxy to one of the listening ports of this proxy {remoteHostName}:{remotePort}");
}
}
bool useUpstreamProxy = false; bool useUpstreamProxy = false;
// check if external proxy is set for HTTP/HTTPS // check if external proxy is set for HTTP/HTTPS
...@@ -472,12 +488,16 @@ namespace Titanium.Web.Proxy.Network.Tcp ...@@ -472,12 +488,16 @@ namespace Titanium.Web.Proxy.Network.Tcp
} }
} }
} }
catch (Exception e)
{
server.ExceptionFunc(new Exception("An error occurred when disposing server connections.", e));
}
finally finally
{ {
//cleanup every 3 seconds by default //cleanup every 3 seconds by default
await Task.Delay(1000 * 3); await Task.Delay(1000 * 3);
} }
} }
} }
......
...@@ -442,7 +442,7 @@ namespace Titanium.Web.Proxy ...@@ -442,7 +442,7 @@ namespace Titanium.Web.Proxy
systemProxySettingsManager.SetProxy( systemProxySettingsManager.SetProxy(
Equals(endPoint.IpAddress, IPAddress.Any) | Equals(endPoint.IpAddress, IPAddress.Any) |
Equals(endPoint.IpAddress, IPAddress.Loopback) Equals(endPoint.IpAddress, IPAddress.Loopback)
? "127.0.0.1" ? "localhost"
: endPoint.IpAddress.ToString(), : endPoint.IpAddress.ToString(),
endPoint.Port, endPoint.Port,
protocolType); protocolType);
...@@ -545,8 +545,7 @@ namespace Titanium.Web.Proxy ...@@ -545,8 +545,7 @@ namespace Titanium.Web.Proxy
var protocolToRemove = ProxyProtocolType.None; var protocolToRemove = ProxyProtocolType.None;
foreach (var proxy in proxyInfo.Proxies.Values) foreach (var proxy in proxyInfo.Proxies.Values)
{ {
if ((proxy.HostName == "127.0.0.1" if (NetworkHelper.IsLocalIpAddress(proxy.HostName)
|| proxy.HostName.EqualsIgnoreCase("localhost"))
&& ProxyEndPoints.Any(x => x.Port == proxy.Port)) && ProxyEndPoints.Any(x => x.Port == proxy.Port))
{ {
protocolToRemove |= proxy.ProtocolType; protocolToRemove |= proxy.ProtocolType;
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Delegate AsyncEventHandler&lt;TEventArgs&gt; <meta name="title" content="Delegate AsyncEventHandler&lt;TEventArgs&gt;
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class BeforeSslAuthenticateEventArgs <meta name="title" content="Class BeforeSslAuthenticateEventArgs
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class CertificateSelectionEventArgs <meta name="title" content="Class CertificateSelectionEventArgs
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class CertificateValidationEventArgs <meta name="title" content="Class CertificateValidationEventArgs
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class MultipartRequestPartSentEventArgs <meta name="title" content="Class MultipartRequestPartSentEventArgs
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class SessionEventArgs <meta name="title" content="Class SessionEventArgs
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class SessionEventArgsBase <meta name="title" content="Class SessionEventArgsBase
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class TunnelConnectSessionEventArgs <meta name="title" content="Class TunnelConnectSessionEventArgs
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy.EventArguments <meta name="title" content="Namespace Titanium.Web.Proxy.EventArguments
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Delegate ExceptionHandler <meta name="title" content="Delegate ExceptionHandler
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class BodyNotFoundException <meta name="title" content="Class BodyNotFoundException
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ProxyAuthorizationException <meta name="title" content="Class ProxyAuthorizationException
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ProxyException <meta name="title" content="Class ProxyException
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ProxyHttpException <meta name="title" content="Class ProxyHttpException
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy.Exceptions <meta name="title" content="Namespace Titanium.Web.Proxy.Exceptions
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ConnectRequest <meta name="title" content="Class ConnectRequest
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ConnectResponse <meta name="title" content="Class ConnectResponse
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class HeaderCollection <meta name="title" content="Class HeaderCollection
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class HttpWebClient <meta name="title" content="Class HttpWebClient
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class KnownHeaders <meta name="title" content="Class KnownHeaders
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class Request <meta name="title" content="Class Request
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class RequestResponseBase <meta name="title" content="Class RequestResponseBase
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class Response <meta name="title" content="Class Response
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class GenericResponse <meta name="title" content="Class GenericResponse
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class OkResponse <meta name="title" content="Class OkResponse
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class RedirectResponse <meta name="title" content="Class RedirectResponse
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy.Http.Responses <meta name="title" content="Namespace Titanium.Web.Proxy.Http.Responses
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy.Http <meta name="title" content="Namespace Titanium.Web.Proxy.Http
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ExplicitProxyEndPoint <meta name="title" content="Class ExplicitProxyEndPoint
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ExternalProxy <meta name="title" content="Class ExternalProxy
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class HttpHeader <meta name="title" content="Class HttpHeader
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ProxyEndPoint <meta name="title" content="Class ProxyEndPoint
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class TransparentProxyEndPoint <meta name="title" content="Class TransparentProxyEndPoint
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy.Models <meta name="title" content="Namespace Titanium.Web.Proxy.Models
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Enum CertificateEngine <meta name="title" content="Enum CertificateEngine
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class CertificateManager <meta name="title" content="Class CertificateManager
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy.Network <meta name="title" content="Namespace Titanium.Web.Proxy.Network
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Class ProxyServer <meta name="title" content="Class ProxyServer
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
...@@ -10,7 +10,7 @@ ...@@ -10,7 +10,7 @@
<meta name="viewport" content="width=device-width"> <meta name="viewport" content="width=device-width">
<meta name="title" content="Namespace Titanium.Web.Proxy <meta name="title" content="Namespace Titanium.Web.Proxy
| Titanium Web Proxy "> | Titanium Web Proxy ">
<meta name="generator" content="docfx 2.36.0.0"> <meta name="generator" content="docfx 2.36.1.0">
<link rel="shortcut icon" href="../favicon.ico"> <link rel="shortcut icon" href="../favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css"> <link rel="stylesheet" href="../styles/docfx.vendor.css">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment