mirror of
https://github.com/opensim/opensim.git
synced 2026-05-19 14:35:44 +08:00
use osutf8 on some http headers parse
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user