diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/BodyEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/BodyEventArgs.cs
index 91dec7945a..a1ed60056a 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/BodyEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/BodyEventArgs.cs
@@ -3,53 +3,23 @@
namespace OSHttpServer.Parser
{
///
- /// Arguments used when more body bytes have come.
+ /// Arguments used when body bytes have come.
///
public class BodyEventArgs : EventArgs
{
- ///
- /// Initializes a new instance of the class.
- ///
- /// buffer that contains the received bytes.
- /// offset in buffer where to start processing.
- /// number of bytes from that should be parsed.
- public BodyEventArgs(byte[] buffer, int offset, int count)
- {
- Buffer = buffer;
- Offset = offset;
- Count = count;
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- public BodyEventArgs()
- {
- }
-
///
/// Gets or sets buffer that contains the received bytes.
///
- public byte[] Buffer { get; set; }
- /*
+ public byte[] Buffer;
+
///
- /// Gets or sets number of bytes used by the request.
+ /// number of bytes from that should be parsed.
///
- public int BytesUsed { get; set; }
- */
+ public int Count;
+
///
- /// Gets or sets number of bytes from that should be parsed.
+ /// offset in buffer where to start processing.
///
- public int Count { get; set; }
- /*
- ///
- /// Gets or sets whether the body is complete.
- ///
- public bool IsBodyComplete { get; set; }
- */
- ///
- /// Gets or sets offset in buffer where to start processing.
- ///
- public int Offset { get; set; }
+ public int Offset;
}
}
\ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HeaderEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HeaderEventArgs.cs
index 23a57e97e2..35bb894d3d 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HeaderEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HeaderEventArgs.cs
@@ -9,24 +9,6 @@ namespace OSHttpServer.Parser
public class HeaderEventArgs : EventArgs
{
public osUTF8Slice Name;
- public string Value;
-
- ///
- /// Initializes a new instance of the class.
- ///
- public HeaderEventArgs()
- {
- }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// Name of header.
- /// Header value.
- public HeaderEventArgs(osUTF8Slice name, string value)
- {
- Name = name;
- Value = value;
- }
+ public osUTF8Slice Value;
}
}
\ No newline at end of file
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs
index cf636cede5..4133c02b82 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs
@@ -182,14 +182,14 @@ namespace OSHttpServer
Respond("HTTP/1.1", HttpStatusCode.Continue, null);
}
}
- m_currentRequest.AddHeader(e.Name.ToString(), e.Value);
+ m_currentRequest.AddHeader(e.Name.ToString(), e.Value.ToString());
}
private void OnRequestLine(object sender, RequestLineEventArgs e)
{
- m_currentRequest.Method = e.HttpMethod;
- m_currentRequest.HttpVersion = e.HttpVersion;
- m_currentRequest.UriPath = e.UriPath;
+ m_currentRequest.Method = e.HttpMethod.ToString();
+ m_currentRequest.HttpVersion = e.HttpVersion.ToString();
+ m_currentRequest.UriPath = e.UriPath.ToString();
m_currentRequest.AddHeader("remote_addr", LocalIPEndPoint.Address.ToString());
m_currentRequest.AddHeader("remote_port", LocalIPEndPoint.Port.ToString());
m_currentRequest.ArrivalTS = ContextTimeoutManager.GetTimeStamp();
@@ -212,7 +212,7 @@ namespace OSHttpServer
{
m_stream.BeginRead(m_ReceiveBuffer, 0, m_ReceiveBuffer.Length, OnReceive, null);
}
- catch (IOException err)
+ catch (Exception err)
{
LogWriter.Write(this, LogPrio.Debug, err.ToString());
}
@@ -353,7 +353,7 @@ namespace OSHttpServer
try
{
int bytesRead = 0;
- if (m_stream == null)
+ if (m_stream is null)
return;
try
{
@@ -377,24 +377,24 @@ namespace OSHttpServer
m_ReceiveBytesLeft += bytesRead;
int offset = m_parser.Parse(m_ReceiveBuffer, 0, m_ReceiveBytesLeft);
- if (m_stream == null)
+ if (m_stream is null)
return; // "Connection: Close" in effect.
- while (offset != 0)
+ if(offset > 0)
{
- int nextBytesleft = m_ReceiveBytesLeft - offset;
- if (nextBytesleft <= 0)
- break;
+ int nextBytesleft, nextOffset;
+ while ((nextBytesleft = m_ReceiveBytesLeft - offset) > 0)
+ {
+ nextOffset = m_parser.Parse(m_ReceiveBuffer, offset, nextBytesleft);
- int nextOffset = m_parser.Parse(m_ReceiveBuffer, offset, nextBytesleft);
+ if (m_stream is null)
+ return; // "Connection: Close" in effect.
- if (m_stream == null)
- return; // "Connection: Close" in effect.
+ if (nextOffset == 0)
+ break;
- if (nextOffset == 0)
- break;
-
- offset = nextOffset;
+ offset = nextOffset;
+ }
}
// copy unused bytes to the beginning of the array
@@ -472,7 +472,7 @@ namespace OSHttpServer
if (--m_maxRequests == 0)
m_currentRequest.Connection = ConnectionType.Close;
- if(m_currentRequest.Uri == null)
+ if(m_currentRequest.Uri is null)
{
// should not happen
try
@@ -488,7 +488,7 @@ namespace OSHttpServer
}
// load cookies if they exist
- if(m_currentRequest.Headers["cookie"] != null)
+ if(m_currentRequest.Headers["cookie"] is not null)
m_currentRequest.SetCookies(new RequestCookies(m_currentRequest.Headers["cookie"]));
m_currentRequest.Body.Seek(0, SeekOrigin.Begin);
@@ -519,7 +519,7 @@ namespace OSHttpServer
public bool TrySendResponse(int bytesLimit)
{
- if (m_currentResponse == null)
+ if (m_currentResponse is null)
return false;
try
{
@@ -540,7 +540,7 @@ namespace OSHttpServer
public void ContinueSendResponse()
{
- if(m_currentResponse == null)
+ if(m_currentResponse is null)
return;
LastActivityTimeMS = ContextTimeoutManager.EnvironmentTickCount();
ContextTimeoutManager.EnqueueSend(this, m_currentResponse.Priority);
@@ -566,16 +566,16 @@ namespace OSHttpServer
}
else
{
- if (Stream == null || !Stream.CanWrite)
+ if (Stream is null || !Stream.CanWrite)
return;
LastActivityTimeMS = ContextTimeoutManager.EnvironmentTickCount();
HttpRequest nextRequest = null;
lock (m_requestsLock)
{
- if (m_requests != null && m_requests.Count > 0)
+ if (m_requests is not null && m_requests.Count > 0)
nextRequest = m_requests.Dequeue();
- if (nextRequest != null && RequestReceived != null)
+ if (nextRequest is not null && RequestReceived is not null)
{
m_waitingResponse = true;
TriggerKeepalive = false;
@@ -583,7 +583,7 @@ namespace OSHttpServer
else
TriggerKeepalive = true;
}
- if (nextRequest != null)
+ if (nextRequest is not null)
RequestReceived?.Invoke(this, new RequestEventArgs(nextRequest));
}
ContextTimeoutManager.PulseWaitSend();
@@ -659,7 +659,7 @@ namespace OSHttpServer
public bool Send(byte[] buffer, int offset, int size)
{
- if (m_stream == null || m_sock == null || !m_sock.Connected)
+ if (m_stream is null || m_sock is null || !m_sock.Connected)
return false;
if (offset + size > buffer.Length)
@@ -682,7 +682,7 @@ namespace OSHttpServer
}
ContextTimeoutManager.ContextLeaveActiveSend();
- if (!ok && m_stream != null)
+ if (!ok && m_stream is not null)
Disconnect(SocketError.NoRecovery);
return ok;
}
@@ -693,6 +693,7 @@ namespace OSHttpServer
try
{
m_stream.EndWrite(res);
+
ContextTimeoutManager.ContextLeaveActiveSend();
didleave = true;
m_currentResponse.CheckSendNextAsyncContinue();
@@ -700,7 +701,7 @@ namespace OSHttpServer
catch (Exception e)
{
e.GetHashCode();
- if (m_stream != null)
+ if (m_stream is not null)
Disconnect(SocketError.NoRecovery);
}
if(!didleave)
@@ -709,7 +710,7 @@ namespace OSHttpServer
public bool SendAsyncStart(byte[] buffer, int offset, int size)
{
- if (m_stream == null || m_sock == null || !m_sock.Connected)
+ if (m_stream is null || m_sock is null || !m_sock.Connected)
return false;
if (offset + size > buffer.Length)
@@ -728,7 +729,7 @@ namespace OSHttpServer
ok = false;
}
- if (!ok && m_stream != null)
+ if (!ok && m_stream is not null)
Disconnect(SocketError.NoRecovery);
return ok;
}
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs
index 35b708ce3e..c5d7f6c2b2 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpRequestParser.cs
@@ -1,5 +1,4 @@
using System;
-using System.Text;
using OSHttpServer.Exceptions;
using OpenMetaverse;
@@ -102,7 +101,7 @@ namespace OSHttpServer.Parser
///
/// If line is incorrect
/// Expects the following format: "Method SP Request-URI SP HTTP-Version CRLF"
- protected void OnFirstLine(string value)
+ protected void OnFirstLine(osUTF8Slice value)
{
//
//todo: In the interest of robustness, servers SHOULD ignore any empty line(s) received where a Request-Line is expected.
@@ -111,7 +110,7 @@ namespace OSHttpServer.Parser
m_log.Write(this, LogPrio.Debug, $"Got request: {value}");
//Request-Line = Method SP Request-URI SP HTTP-Version CRLF
- int pos = value.IndexOf(' ');
+ int pos = value.IndexOf((byte)' ');
int oldPos = pos + 1;
if (pos == -1 || oldPos >= value.Length)
{
@@ -119,18 +118,20 @@ namespace OSHttpServer.Parser
throw new BadRequestException($"Invalid request line, missing Method. Line: {value}");
}
- string method = value[..pos].ToUpper();
- pos = value.IndexOf(' ', oldPos);
+ osUTF8Slice method = value.SubUTF8(0, pos);
+ value.SubUTF8Self(oldPos);
+ pos = value.IndexOf((byte)' ');
if (pos == -1)
{
- m_log.Write(this, LogPrio.Warning, "Invalid request line, missing URI. Line: " + value);
- throw new BadRequestException("Invalid request line, missing URI. Line: " + value);
+ m_log.Write(this, LogPrio.Warning, "Invalid request line, missing URI");
+ throw new BadRequestException("Invalid request line, missing URI");
}
- string path = value[oldPos..pos];
- if (path.Length > 4196)
- throw new BadRequestException("Too long URI.");
- if (path == "*")
- throw new BadRequestException("Not supported URI.");
+ if(pos > 4196)
+ throw new BadRequestException("URI too long");
+
+ osUTF8Slice path = value.SubUTF8(0, pos);
+ if (path.ACSIILowerEquals("*"))
+ throw new BadRequestException("URI not supported");
oldPos = pos + 1;
if (oldPos >= value.Length)
@@ -139,20 +140,21 @@ namespace OSHttpServer.Parser
throw new BadRequestException($"Invalid request line, missing HTTP-Version. Line: {value}");
}
- string version = value[oldPos..];
- if (version.Length < 4 || string.Compare(version[..4], "HTTP", true) != 0)
+ osUTF8Slice version = value.SubUTF8(oldPos);
+ if (version.Length < 4 || !version.SubUTF8(0,4).ACSIILowerEquals("http"))
{
m_log.Write(this, LogPrio.Warning, $"Invalid HTTP version in request line. Line: {value}");
throw new BadRequestException($"Invalid HTTP version in Request line. Line: {value}");
}
- if(RequestLineReceived != null)
+ if(RequestLineReceived is not null)
{
+ method.ToASCIIUpperSelf();
m_requestLineArgs.HttpMethod = method;
m_requestLineArgs.HttpVersion = version;
m_requestLineArgs.UriPath = path;
RequestLineReceived?.Invoke(this, m_requestLineArgs);
- }
+ }
}
private static readonly byte[] OSUTF8contentlength = osUTF8.GetASCIIBytes("content-length");
@@ -175,7 +177,7 @@ namespace OSHttpServer.Parser
if (HeaderReceived != null)
{
m_headerArgs.Name = m_curHeaderName;
- m_headerArgs.Value = m_curHeaderValue.ToString();
+ m_headerArgs.Value = m_curHeaderValue;
HeaderReceived?.Invoke(this, m_headerArgs);
}
@@ -256,7 +258,7 @@ namespace OSHttpServer.Parser
else if(ch == '\r' || ch == '\n')
{
int size = GetLineBreakSize(buffer, currentPos);
- OnFirstLine(Encoding.UTF8.GetString(buffer, startPos, currentPos - startPos));
+ OnFirstLine(new osUTF8Slice(buffer, startPos, currentPos - startPos));
currentPos += size - 1;
handledBytes = currentPos + 1;
startPos = -1;
diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestLineEventArgs.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestLineEventArgs.cs
index 1b9b8dc69b..e2b72e3df8 100644
--- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestLineEventArgs.cs
+++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/RequestLineEventArgs.cs
@@ -1,4 +1,5 @@
-using System;
+using OpenMetaverse;
+using System;
namespace OSHttpServer.Parser
{
@@ -8,41 +9,18 @@ namespace OSHttpServer.Parser
public class RequestLineEventArgs : EventArgs
{
///
- /// Initializes a new instance of the class.
+ /// http method.
///
- /// The HTTP method.
- /// The URI path.
- /// The HTTP version.
- public RequestLineEventArgs(string httpMethod, string uriPath, string httpVersion)
- {
- HttpMethod = httpMethod;
- UriPath = uriPath;
- HttpVersion = httpVersion;
- }
+ public osUTF8Slice HttpMethod;
///
- /// Initializes a new instance of the class.
+ /// version of the HTTP protocol that the client want to use.
///
- public RequestLineEventArgs()
- {
- }
+ public osUTF8Slice HttpVersion;
///
- /// Gets or sets http method.
+ /// requested URI path.
///
- ///
- /// Should be one of the methods declared in .
- ///
- public string HttpMethod { get; set; }
-
- ///
- /// Gets or sets the version of the HTTP protocol that the client want to use.
- ///
- public string HttpVersion { get; set; }
-
- ///
- /// Gets or sets requested URI path.
- ///
- public string UriPath { get; set; }
+ public osUTF8Slice UriPath;
}
}
\ No newline at end of file