diff --git a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs index 8be8493097..fd8f72b8cf 100644 --- a/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs +++ b/OpenSim/Framework/Servers/HttpServer/BaseHttpServer.cs @@ -1153,8 +1153,6 @@ namespace OpenSim.Framework.Servers.HttpServer /// public void HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response) { - String requestBody = null; - Stream requestStream = request.InputStream; Stream innerStream = null; try @@ -1162,59 +1160,45 @@ namespace OpenSim.Framework.Servers.HttpServer if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip")) { innerStream = requestStream; - requestStream = new GZipStream(innerStream, System.IO.Compression.CompressionMode.Decompress); + requestStream = new GZipStream(innerStream, CompressionMode.Decompress); } - - using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8)) - requestBody = reader.ReadToEnd(); } catch { - requestBody = null; - } - finally - { - if (innerStream != null && innerStream.CanRead) - innerStream.Dispose(); if (requestStream.CanRead) requestStream.Dispose(); - } + if (innerStream != null && innerStream.CanRead) + innerStream.Dispose(); - if (string.IsNullOrWhiteSpace(requestBody)) - { - response.StatusCode = (int)HttpStatusCode.NotFound; + response.StatusCode = (int)HttpStatusCode.BadRequest; response.KeepAlive = false; return; } - //m_log.Debug(requestBody); - requestBody = requestBody.Replace("", ""); - XmlRpcRequest xmlRprcRequest = null; try { - xmlRprcRequest = (XmlRpcRequest) (new XmlRpcRequestDeserializer()).Deserialize(requestBody); - } - catch (XmlException e) - { - if (DebugLevel >= 1) + using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8)) { - if (DebugLevel >= 2) - m_log.Warn( - string.Format( - "[BASE HTTP SERVER]: Got XMLRPC request with invalid XML from {0}. XML was '{1}'. Sending blank response. Exception ", - request.RemoteIPEndPoint, requestBody), - e); - else - { - m_log.WarnFormat( - "[BASE HTTP SERVER]: Got XMLRPC request with invalid XML from {0}, length {1}. Sending blank response.", - request.RemoteIPEndPoint, requestBody.Length); - } + var xmlDes = new XmlRpcRequestDeserializer(); + xmlRprcRequest = (XmlRpcRequest)xmlDes.Deserialize(reader); } } + catch (Exception e) + { + m_log.WarnFormat( + "[BASE HTTP SERVER]: Fail to decode XMLRPC request {0}: {1}", + request.RemoteIPEndPoint, e.Message); + } + finally + { + if (requestStream.CanRead) + requestStream.Dispose(); + if (innerStream != null && innerStream.CanRead) + innerStream.Dispose(); + } - if(xmlRprcRequest == null) + if (xmlRprcRequest == null) { response.StatusCode = (int)HttpStatusCode.NotFound; response.KeepAlive = false; @@ -1298,32 +1282,26 @@ namespace OpenSim.Framework.Servers.HttpServer String.Format("Requested method [{0}] not found", methodName)); } - response.KeepAlive = keepAlive; - response.ContentType = "text/xml"; - string responseString = String.Empty; - using (MemoryStream outs = new MemoryStream()) + using (MemoryStream outs = new MemoryStream(64 * 1024)) { using (XmlTextWriter writer = new XmlTextWriter(outs, UTF8NoBOM)) { writer.Formatting = Formatting.None; - XmlRpcResponseSerializer.Singleton.Serialize(writer, xmlRpcResponse); + var xmlrpcSer = new XmlRpcResponseSerializer(); + xmlrpcSer.Serialize(writer, xmlRpcResponse); writer.Flush(); - //outs.Seek(0, SeekOrigin.Begin); - //using (StreamReader sr = new StreamReader(outs)) - // responseString = sr.ReadToEnd(); response.RawBuffer = outs.GetBuffer(); response.RawBufferLen = (int)outs.Length; } } - //response.RawBuffer = Util.UTF8NBGetbytes(responseString); response.StatusCode = (int)HttpStatusCode.OK; + response.KeepAlive = keepAlive; + response.ContentType = "text/xml"; } public void HandleXmlRpcRequests(OSHttpRequest request, OSHttpResponse response, Dictionary rpcHandlers) { - String requestBody = null; - Stream requestStream = request.InputStream; Stream innerStream = null; try @@ -1331,57 +1309,43 @@ namespace OpenSim.Framework.Servers.HttpServer if ((request.Headers["Content-Encoding"] == "gzip") || (request.Headers["X-Content-Encoding"] == "gzip")) { innerStream = requestStream; - requestStream = new GZipStream(innerStream, System.IO.Compression.CompressionMode.Decompress); + requestStream = new GZipStream(innerStream, CompressionMode.Decompress); } - - using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8)) - requestBody = reader.ReadToEnd(); } catch { - requestBody = null; - } - finally - { - if (innerStream != null && innerStream.CanRead) - innerStream.Dispose(); if (requestStream.CanRead) requestStream.Dispose(); - } + if (innerStream != null && innerStream.CanRead) + innerStream.Dispose(); - if (string.IsNullOrWhiteSpace(requestBody)) - { - response.StatusCode = (int)HttpStatusCode.NotFound; + response.StatusCode = (int)HttpStatusCode.BadRequest; response.KeepAlive = false; return; } - //m_log.Debug(requestBody); - requestBody = requestBody.Replace("", ""); - XmlRpcRequest xmlRprcRequest = null; try { - xmlRprcRequest = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(requestBody); - } - catch (XmlException e) - { - if (DebugLevel >= 1) + using (StreamReader reader = new StreamReader(requestStream, Encoding.UTF8)) { - if (DebugLevel >= 2) - m_log.Warn( - string.Format( - "[BASE HTTP SERVER]: Got XMLRPC request with invalid XML from {0}. XML was '{1}'. Sending blank response. Exception ", - request.RemoteIPEndPoint, requestBody), - e); - else - { - m_log.WarnFormat( - "[BASE HTTP SERVER]: Got XMLRPC request with invalid XML from {0}, length {1}. Sending blank response.", - request.RemoteIPEndPoint, requestBody.Length); - } + var xmlDes = new XmlRpcRequestDeserializer(); + xmlRprcRequest = (XmlRpcRequest)xmlDes.Deserialize(reader); } } + catch (Exception e) + { + m_log.WarnFormat( + "[BASE HTTP SERVER]: Fail to decode XMLRPC request {0}: {1}", + request.RemoteIPEndPoint, e.Message); + } + finally + { + if (requestStream.CanRead) + requestStream.Dispose(); + if (innerStream != null && innerStream.CanRead) + innerStream.Dispose(); + } if (xmlRprcRequest == null) { @@ -1437,8 +1401,7 @@ namespace OpenSim.Framework.Servers.HttpServer } catch (Exception e) { - string errorMessage - = String.Format( + string errorMessage = string.Format( "Requested method [{0}] from {1} threw exception: {2} {3}", methodName, request.RemoteIPEndPoint.Address, e.Message, e.StackTrace); @@ -1461,26 +1424,22 @@ namespace OpenSim.Framework.Servers.HttpServer String.Format("Requested method [{0}] not found", methodName)); } - string responseString = String.Empty; using (MemoryStream outs = new MemoryStream(64 * 1024)) { using (XmlTextWriter writer = new XmlTextWriter(outs, UTF8NoBOM)) { writer.Formatting = Formatting.None; - XmlRpcResponseSerializer.Singleton.Serialize(writer, xmlRpcResponse); + var xmlrpcSer = new XmlRpcResponseSerializer(); + xmlrpcSer.Serialize(writer, xmlRpcResponse); writer.Flush(); - //outs.Seek(0, SeekOrigin.Begin); - //using (StreamReader sr = new StreamReader(outs)) - // responseString = sr.ReadToEnd(); response.RawBuffer = outs.GetBuffer(); response.RawBufferLen = (int)outs.Length; } } response.StatusCode = (int)HttpStatusCode.OK; - response.ContentType = "text/xml"; response.KeepAlive = false; - //response.RawBuffer = Util.UTF8NBGetbytes(responseString); + response.ContentType = "text/xml"; } // JsonRpc (v2.0 only) diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs index c621c8365a..325cdea3a5 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpClientContext.cs @@ -143,7 +143,6 @@ namespace OSHttpServer basecontextID = 1; contextID = basecontextID; - sock.NoDelay = true; } public bool CanSend() diff --git a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpListener.cs b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpListener.cs index c51ccbeff9..8f5916d07b 100644 --- a/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpListener.cs +++ b/OpenSim/Framework/Servers/HttpServer/OSHttpServer/HttpListener.cs @@ -154,6 +154,7 @@ namespace OSHttpServer if(socket.Connected) { + socket.NoDelay = true; m_logWriter.Write(this, LogPrio.Debug, "Accepted connection from: " + socket.RemoteEndPoint);