diff --git a/OpenSim/Server/Handlers/Base/Utils.cs b/OpenSim/Server/Handlers/Base/Utils.cs index 48d923f9ba..c61fb8e108 100644 --- a/OpenSim/Server/Handlers/Base/Utils.cs +++ b/OpenSim/Server/Handlers/Base/Utils.cs @@ -26,13 +26,12 @@ */ using System; -using System.Collections; -using System.Net; +using System.IO; +using System.IO.Compression; -using OpenSim.Framework; using OpenSim.Framework.Servers.HttpServer; -using OpenSim.Services.Interfaces; using OpenMetaverse; +using OpenMetaverse.StructuredData; namespace OpenSim.Server.Handlers.Base { @@ -93,5 +92,28 @@ namespace OpenSim.Server.Handlers.Base return false; } + public static OSDMap DeserializeOSMap(IOSHttpRequest httpRequest) + { + Stream inputStream = httpRequest.InputStream; + Stream innerStream = null; + try + { + if ((httpRequest.ContentType == "application/x-gzip" || httpRequest.Headers["Content-Encoding"] == "gzip") || (httpRequest.Headers["X-Content-Encoding"] == "gzip")) + { + innerStream = inputStream; + inputStream = new GZipStream(innerStream, CompressionMode.Decompress); + } + return (OSDMap)OSDParser.DeserializeJson(inputStream); + } + catch + { + return null; + } + finally + { + if (innerStream != null) + innerStream.Dispose(); + } + } } } diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs index e3ee467a99..c36f85bf4f 100644 --- a/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs +++ b/OpenSim/Server/Handlers/Neighbour/NeighbourHandlers.cs @@ -40,66 +40,74 @@ using GridRegion = OpenSim.Services.Interfaces.GridRegion; using OpenMetaverse; using OpenMetaverse.StructuredData; -using Nini.Config; using log4net; namespace OpenSim.Server.Handlers.Neighbour { - public class NeighbourGetHandler : BaseStreamHandler - { - // TODO: unused: private ISimulationService m_SimulationService; - // TODO: unused: private IAuthenticationService m_AuthenticationService; - - public NeighbourGetHandler(INeighbourService service, IAuthenticationService authentication) : - base("GET", "/region") - { - // TODO: unused: m_SimulationService = service; - // TODO: unused: m_AuthenticationService = authentication; - } - - protected override byte[] ProcessRequest(string path, Stream request, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - // Not implemented yet - Console.WriteLine("--- Get region --- " + path); - httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; - return new byte[] { }; - } - } - - public class NeighbourPostHandler : BaseStreamHandler + public class NeighbourSimpleHandler : SimpleStreamHandler { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); private INeighbourService m_NeighbourService; private IAuthenticationService m_AuthenticationService; - // TODO: unused: private bool m_AllowForeignGuests; - public NeighbourPostHandler(INeighbourService service, IAuthenticationService authentication) : - base("POST", "/region") + public NeighbourSimpleHandler(INeighbourService service, IAuthenticationService authentication) : + base("/region") { m_NeighbourService = service; m_AuthenticationService = authentication; - // TODO: unused: m_AllowForeignGuests = foreignGuests; } - protected override byte[] ProcessRequest(string path, Stream request, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + protected override void ProcessRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + httpResponse.KeepAlive = false; + + if (m_NeighbourService == null) + { + httpResponse.StatusCode = (int)HttpStatusCode.InternalServerError; + return; + } + + switch (httpRequest.HttpMethod) + { + case "POST": + { + OSDMap args = RestHandlerUtils.DeserializeOSMap(httpRequest); + if (args == null) + { + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + httpResponse.RawBuffer = Util.UTF8.GetBytes("false"); + return; + } + + if (RestHandlerUtils.GetParams(httpRequest.UriPath, out UUID regionID, out ulong regionHandle, out string action) + || regionID == UUID.Zero) + { + m_log.InfoFormat("[RegionPostHandler]: Invalid parameters for neighbour message {0}", httpRequest.UriPath); + httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; + return; + } + ProcessPostRequest(args, httpRequest, httpResponse, regionID); + break; + } + case "GET": + case "PUT": + case "DELETE": + httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; + return; + default: + { + httpResponse.StatusCode = (int)HttpStatusCode.MethodNotAllowed; + return; + } + } + } + + // TODO: unused: private bool m_AllowForeignGuests; + protected void ProcessPostRequest(OSDMap args, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse, UUID regionID) { byte[] result = new byte[0]; - UUID regionID; - string action; - ulong regionHandle; - if (RestHandlerUtils.GetParams(path, out regionID, out regionHandle, out action)) - { - m_log.InfoFormat("[RegionPostHandler]: Invalid parameters for neighbour message {0}", path); - httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; - httpResponse.StatusDescription = "Invalid parameters for neighbour message " + path; - - return result; - } - if (m_AuthenticationService != null) { // Authentication @@ -107,9 +115,9 @@ namespace OpenSim.Server.Handlers.Neighbour string authToken = string.Empty; if (!RestHandlerUtils.GetAuthentication(httpRequest, out authority, out authToken)) { - m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message {0}", path); + m_log.InfoFormat("[RegionPostHandler]: Authentication failed for neighbour message"); httpResponse.StatusCode = (int)HttpStatusCode.Unauthorized; - return result; + return; } // TODO: Rethink this //if (!m_AuthenticationService.VerifyKey(regionID, authToken)) @@ -121,15 +129,6 @@ namespace OpenSim.Server.Handlers.Neighbour m_log.DebugFormat("[RegionPostHandler]: Authentication succeeded for {0}", regionID); } - OSDMap args = Util.GetOSDMap(request, (int)httpRequest.ContentLength); - if (args == null) - { - httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; - httpResponse.StatusDescription = "Unable to retrieve data"; - m_log.DebugFormat("[RegionPostHandler]: Unable to retrieve data for post {0}", path); - return result; - } - // retrieve the regionhandle ulong regionhandle = 0; if (args["destination_handle"] != null) @@ -144,8 +143,7 @@ namespace OpenSim.Server.Handlers.Neighbour { m_log.InfoFormat("[RegionPostHandler]: exception on unpacking region info {0}", ex.Message); httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; - httpResponse.StatusDescription = "Problems with data deserialization"; - return result; + return; } // Finally! @@ -158,51 +156,9 @@ namespace OpenSim.Server.Handlers.Neighbour else resp["success"] = OSD.FromBoolean(false); + httpResponse.RawBuffer = Util.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); httpResponse.StatusCode = (int)HttpStatusCode.OK; - - return Util.UTF8.GetBytes(OSDParser.SerializeJsonString(resp)); - } - } - - public class NeighbourPutHandler : BaseStreamHandler - { - // TODO: unused: private ISimulationService m_SimulationService; - // TODO: unused: private IAuthenticationService m_AuthenticationService; - - public NeighbourPutHandler(INeighbourService service, IAuthenticationService authentication) : - base("PUT", "/region") - { - // TODO: unused: m_SimulationService = service; - // TODO: unused: m_AuthenticationService = authentication; - } - - protected override byte[] ProcessRequest(string path, Stream request, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - // Not implemented yet - httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; - return new byte[] { }; - } - } - - public class NeighbourDeleteHandler : BaseStreamHandler - { - // TODO: unused: private ISimulationService m_SimulationService; - // TODO: unused: private IAuthenticationService m_AuthenticationService; - - public NeighbourDeleteHandler(INeighbourService service, IAuthenticationService authentication) : - base("DELETE", "/region") - { - // TODO: unused: m_SimulationService = service; - // TODO: unused: m_AuthenticationService = authentication; - } - - protected override byte[] ProcessRequest(string path, Stream request, - IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - // Not implemented yet - httpResponse.StatusCode = (int)HttpStatusCode.NotImplemented; - return new byte[] { }; } } } + diff --git a/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs index 65ac4e6c22..33b9727afa 100644 --- a/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs +++ b/OpenSim/Server/Handlers/Neighbour/NeighbourServiceInConnector.cs @@ -60,9 +60,7 @@ namespace OpenSim.Server.Handlers.Neighbour //if (authentication) // m_AuthenticationService = scene.RequestModuleInterface(); - - server.AddStreamHandler(new NeighbourPostHandler(m_NeighbourService, m_AuthenticationService)); - server.AddStreamHandler(new NeighbourGetHandler(m_NeighbourService, m_AuthenticationService)); + server.AddSimpleStreamHandler(new NeighbourSimpleHandler(m_NeighbourService, m_AuthenticationService)); } } } diff --git a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs index 733f10d239..9fab82727c 100644 --- a/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/ObjectHandlers.cs @@ -26,15 +26,8 @@ */ using System; -using System.Collections; -using System.IO; -using System.IO.Compression; using System.Reflection; using System.Net; -using System.Text; - -using OpenSim.Server.Base; -using OpenSim.Server.Handlers.Base; using OpenSim.Services.Interfaces; using GridRegion = OpenSim.Services.Interfaces.GridRegion; using OpenSim.Framework; @@ -42,7 +35,6 @@ using OpenSim.Framework.Servers.HttpServer; using OpenMetaverse; using OpenMetaverse.StructuredData; -using Nini.Config; using log4net; @@ -71,7 +63,7 @@ namespace OpenSim.Server.Handlers.Simulation return; } - /* this things are ignored + /*this things are ignored if (!Utils.GetParams(httpRequest.UriPath, out UUID objectID, out UUID regionID, out string action)) { m_log.InfoFormat("[OBJECT HANDLER]: Invalid parameters for object message {0}", httpRequest.UriPath); @@ -84,7 +76,7 @@ namespace OpenSim.Server.Handlers.Simulation { case "POST": { - OSDMap args = Deserialize(httpRequest); + OSDMap args = Utils.DeserializeOSMap(httpRequest); if (args == null) { httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; @@ -101,32 +93,8 @@ namespace OpenSim.Server.Handlers.Simulation return; } } - } - private OSDMap Deserialize(IOSHttpRequest httpRequest) - { - Stream inputStream = httpRequest.InputStream; - Stream innerStream = null; - try - { - if ((httpRequest.ContentType == "application/x-gzip" || httpRequest.Headers["Content-Encoding"] == "gzip") || (httpRequest.Headers["X-Content-Encoding"] == "gzip")) - { - innerStream = inputStream; - inputStream = new GZipStream(innerStream, CompressionMode.Decompress); - } - return (OSDMap)OSDParser.DeserializeJson(inputStream); - } - catch - { - return null; - } - finally - { - if (innerStream != null) - innerStream.Dispose(); - } - } protected void DoObjectPost(OSDMap args, IOSHttpResponse httpResponse) { // retrieve the input arguments diff --git a/OpenSim/Server/Handlers/Simulation/Utils.cs b/OpenSim/Server/Handlers/Simulation/Utils.cs index ed379da92d..a8d6dc8807 100644 --- a/OpenSim/Server/Handlers/Simulation/Utils.cs +++ b/OpenSim/Server/Handlers/Simulation/Utils.cs @@ -26,11 +26,13 @@ */ using System; -using System.Collections.Generic; +using System.IO; +using System.IO.Compression; using System.Reflection; using OpenMetaverse; using OpenMetaverse.StructuredData; +using OpenSim.Framework.Servers.HttpServer; using log4net; @@ -99,5 +101,28 @@ namespace OpenSim.Server.Handlers.Simulation } } + public static OSDMap DeserializeOSMap(IOSHttpRequest httpRequest) + { + Stream inputStream = httpRequest.InputStream; + Stream innerStream = null; + try + { + if ((httpRequest.ContentType == "application/x-gzip" || httpRequest.Headers["Content-Encoding"] == "gzip") || (httpRequest.Headers["X-Content-Encoding"] == "gzip")) + { + innerStream = inputStream; + inputStream = new GZipStream(innerStream, CompressionMode.Decompress); + } + return (OSDMap)OSDParser.DeserializeJson(inputStream); + } + catch + { + return null; + } + finally + { + if (innerStream != null) + innerStream.Dispose(); + } + } } }