use osutf8 on some http headers parse

This commit is contained in:
UbitUmarov
2022-03-16 15:56:00 +00:00
parent bfa620ed09
commit 3d705fefa2
6 changed files with 44 additions and 37 deletions

View File

@@ -1,6 +1,7 @@
using System;
using System.Text;
using OSHttpServer.Exceptions;
using OpenMetaverse;
namespace OSHttpServer.Parser
{
@@ -13,8 +14,8 @@ namespace OSHttpServer.Parser
private readonly HeaderEventArgs m_headerArgs = new HeaderEventArgs();
private readonly BodyEventArgs m_bodyEventArgs = new BodyEventArgs();
private readonly RequestLineEventArgs m_requestLineArgs = new RequestLineEventArgs();
private string m_curHeaderName = string.Empty;
private string m_curHeaderValue = string.Empty;
private osUTF8Slice m_curHeaderName = new osUTF8Slice();
private osUTF8Slice m_curHeaderValue = new osUTF8Slice();
private int m_bodyBytesLeft;
/// <summary>
@@ -81,8 +82,8 @@ namespace OSHttpServer.Parser
public void Clear()
{
m_bodyBytesLeft = 0;
m_curHeaderName = string.Empty;
m_curHeaderValue = string.Empty;
m_curHeaderName.Clear();
m_curHeaderValue.Clear();
CurrentState = RequestParserState.FirstLine;
}
@@ -153,6 +154,7 @@ namespace OSHttpServer.Parser
}
}
private static readonly byte[] OSUTF8contentlength = osUTF8.GetASCIIBytes("content-length");
/// <summary>
/// We've parsed a new header.
/// </summary>
@@ -161,21 +163,21 @@ namespace OSHttpServer.Parser
/// <exception cref="BadRequestException">If content length cannot be parsed.</exception>
protected void OnHeader()
{
if (string.Compare(m_curHeaderName, "content-length", true) == 0)
if (m_curHeaderName.ACSIILowerEquals(OSUTF8contentlength))
{
if (!int.TryParse(m_curHeaderValue, out m_bodyBytesLeft))
if (!m_curHeaderValue.TryParseInt(out m_bodyBytesLeft))
throw new BadRequestException("Content length is not a number.");
}
if (HeaderReceived != null)
{
m_headerArgs.Name = m_curHeaderName;
m_headerArgs.Value = m_curHeaderValue;
m_headerArgs.Value = m_curHeaderValue.ToString();
HeaderReceived?.Invoke(this, m_headerArgs);
}
m_curHeaderName = string.Empty;
m_curHeaderValue = string.Empty;
m_curHeaderName.Clear();
m_curHeaderValue.Clear();
}
private void OnRequestCompleted()
@@ -288,7 +290,7 @@ namespace OSHttpServer.Parser
"Expected header name, got colon on line " + currentLine);
throw new BadRequestException("Expected header name, got colon on line " + currentLine);
}
m_curHeaderName = Encoding.UTF8.GetString(buffer, startPos, currentPos - startPos);
m_curHeaderName = new osUTF8Slice(buffer, startPos, currentPos - startPos);
handledBytes = currentPos + 1;
startPos = handledBytes;
if (ch == ':')
@@ -374,8 +376,13 @@ namespace OSHttpServer.Parser
&& (buffer[currentPos + newLineSize] == ' ' || buffer[currentPos + newLineSize] == '\t'))
{
if (startPos != -1)
m_curHeaderValue += Encoding.UTF8.GetString(buffer, startPos, currentPos - startPos);
{
osUTF8Slice osUTF8SliceTmp = new osUTF8Slice(buffer, startPos, currentPos - startPos);
if (m_curHeaderValue.Length == 0)
m_curHeaderValue = osUTF8SliceTmp.Clone();
else
m_curHeaderValue.Append(osUTF8SliceTmp);
}
m_log.Write(this, LogPrio.Trace, "Header value is on multiple lines.");
CurrentState = RequestParserState.Between;
currentPos += newLineSize - 1;
@@ -384,8 +391,14 @@ namespace OSHttpServer.Parser
}
else
{
m_curHeaderValue += Encoding.UTF8.GetString(buffer, startPos, currentPos - startPos);
osUTF8Slice osUTF8SliceTmp = new osUTF8Slice(buffer, startPos, currentPos - startPos);
if (m_curHeaderValue.Length == 0)
m_curHeaderValue = osUTF8SliceTmp.Clone();
else
m_curHeaderValue.Append(osUTF8SliceTmp);
m_log.Write(this, LogPrio.Trace, "Header [" + m_curHeaderName + ": " + m_curHeaderValue + "]");
OnHeader();
startPos = -1;