mirror of
https://github.com/opensim/opensim.git
synced 2026-08-01 14:16:07 +08:00
use osutf8 on some http headers parse
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OSHttpServer.Parser
|
||||
{
|
||||
@@ -7,16 +8,8 @@ namespace OSHttpServer.Parser
|
||||
/// </summary>
|
||||
public class HeaderEventArgs : EventArgs
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="HeaderEventArgs"/> class.
|
||||
/// </summary>
|
||||
/// <param name="name">Name of header.</param>
|
||||
/// <param name="value">Header value.</param>
|
||||
public HeaderEventArgs(string name, string value)
|
||||
{
|
||||
Name = name;
|
||||
Value = value;
|
||||
}
|
||||
public osUTF8Slice Name;
|
||||
public string Value;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="HeaderEventArgs"/> class.
|
||||
@@ -26,13 +19,14 @@ namespace OSHttpServer.Parser
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets header name.
|
||||
/// Initializes a new instance of the <see cref="HeaderEventArgs"/> class.
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets header value.
|
||||
/// </summary>
|
||||
public string Value { get; set; }
|
||||
/// <param name="name">Name of header.</param>
|
||||
/// <param name="value">Header value.</param>
|
||||
public HeaderEventArgs(osUTF8Slice name, string value)
|
||||
{
|
||||
Name = name;
|
||||
Value = value;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ using OSHttpServer.Exceptions;
|
||||
using OSHttpServer.Parser;
|
||||
using System.Net.Security;
|
||||
using System.Security.Cryptography.X509Certificates;
|
||||
using OpenMetaverse;
|
||||
|
||||
namespace OSHttpServer
|
||||
{
|
||||
@@ -165,6 +166,7 @@ namespace OSHttpServer
|
||||
m_currentRequest.AddToBody(e.Buffer, e.Offset, e.Count);
|
||||
}
|
||||
|
||||
private static readonly byte[] OSUTF8expect = osUTF8.GetASCIIBytes("expect");
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
@@ -172,7 +174,7 @@ namespace OSHttpServer
|
||||
/// <param name="e"></param>
|
||||
protected virtual void OnHeaderReceived(object sender, HeaderEventArgs e)
|
||||
{
|
||||
if (string.Compare(e.Name, "expect", true) == 0 && e.Value.Contains("100-continue"))
|
||||
if (e.Name.ACSIILowerEquals(OSUTF8expect) && e.Value.Contains("100-continue"))
|
||||
{
|
||||
lock (m_requestsLock)
|
||||
{
|
||||
@@ -180,7 +182,7 @@ namespace OSHttpServer
|
||||
Respond("HTTP/1.1", HttpStatusCode.Continue, null);
|
||||
}
|
||||
}
|
||||
m_currentRequest.AddHeader(e.Name, e.Value);
|
||||
m_currentRequest.AddHeader(e.Name.ToString(), e.Value);
|
||||
}
|
||||
|
||||
private void OnRequestLine(object sender, RequestLineEventArgs e)
|
||||
|
||||
@@ -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