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