Skip to content
This repository was archived by the owner on Jul 9, 2023. It is now read-only.

Commit 299d4ba

Browse files
committed
Fix for #638
1 parent b6d73ca commit 299d4ba

File tree

2 files changed

+22
-13
lines changed

2 files changed

+22
-13
lines changed

src/Titanium.Web.Proxy/Helpers/HttpHelper.cs

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -151,20 +151,28 @@ internal static Task<int> IsPriMethod(ICustomStreamReader clientStreamReader, IB
151151
/// </returns>
152152
private static async Task<int> startsWith(ICustomStreamReader clientStreamReader, IBufferPool bufferPool, string expectedStart, CancellationToken cancellationToken = default)
153153
{
154-
int iRet = -1;
155154
const int lengthToCheck = 10;
156155
byte[] buffer = null;
157156
try
158157
{
159-
buffer = bufferPool.GetBuffer(Math.Max(bufferPool.BufferSize, lengthToCheck));
158+
if (bufferPool.BufferSize < lengthToCheck)
159+
{
160+
throw new Exception($"Buffer is too small. Minimum size is {lengthToCheck} bytes");
161+
}
160162

161-
int peeked = await clientStreamReader.PeekBytesAsync(buffer, 0, 0, lengthToCheck, cancellationToken);
163+
buffer = bufferPool.GetBuffer(bufferPool.BufferSize);
162164

163-
if (peeked > 0)
165+
bool isExpected = true;
166+
int i = 0;
167+
while (i < lengthToCheck)
164168
{
165-
bool isExpected = true;
169+
int peeked = await clientStreamReader.PeekBytesAsync(buffer, i, i, lengthToCheck - i, cancellationToken);
170+
if (peeked == 0)
171+
return - 1;
172+
173+
peeked += i;
166174

167-
for (int i = 0; i < lengthToCheck; i++)
175+
while (i < peeked)
168176
{
169177
int b = buffer[i];
170178

@@ -173,23 +181,23 @@ private static async Task<int> startsWith(ICustomStreamReader clientStreamReader
173181
else
174182
{
175183
char ch = (char)b;
176-
if (!char.IsLetter(ch))
184+
if (ch < 'A' || ch > 'z' || (ch > 'Z' && ch < 'a')) // ASCII letter
177185
return -1;
178186
else if (i >= expectedStart.Length || ch != expectedStart[i])
179-
isExpected = false;
187+
isExpected = false;
180188
}
181-
}
182189

183-
// only letters
184-
iRet = isExpected ? 1 : 0;
190+
i++;
191+
}
185192
}
193+
194+
// only letters
195+
return 0;
186196
}
187197
finally
188198
{
189199
bufferPool.ReturnBuffer(buffer);
190-
buffer = null;
191200
}
192-
return iRet;
193201
}
194202
}
195203
}

src/Titanium.Web.Proxy/ProxyServer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ public ProxyServer(string rootCertificateName, string rootCertificateIssuerName,
235235
/// The buffer pool used throughout this proxy instance.
236236
/// Set custom implementations by implementing this interface.
237237
/// By default this uses DefaultBufferPool implementation available in StreamExtended library package.
238+
/// Buffer size should be at least 10 bytes.
238239
/// </summary>
239240
public IBufferPool BufferPool { get; set; }
240241

0 commit comments

Comments
 (0)