diff --git a/OpenSim/Server/Handlers/BakedTextures/XBakes.cs b/OpenSim/Server/Handlers/BakedTextures/XBakes.cs index 4e554336ae..da9de3cd60 100644 --- a/OpenSim/Server/Handlers/BakedTextures/XBakes.cs +++ b/OpenSim/Server/Handlers/BakedTextures/XBakes.cs @@ -26,15 +26,10 @@ */ using System; -using System.Diagnostics; -using System.Collections.Generic; using System.IO; using System.Text; -using System.Threading; using System.Reflection; using OpenSim.Framework; -using OpenSim.Framework.Console; -using OpenSim.Server.Base; using OpenSim.Services.Base; using OpenSim.Services.Interfaces; using Nini.Config; @@ -45,15 +40,10 @@ namespace OpenSim.Server.Handlers.BakedTextures { public class XBakes : ServiceBase, IBakedTextureService { - private static readonly ILog m_log = - LogManager.GetLogger( - MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ILog m_log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); protected string m_FSBase; - private System.Text.UTF8Encoding utf8encoding = - new System.Text.UTF8Encoding(); - public XBakes(IConfigSource config) : base(config) { MainConsole.Instance.Commands.AddCommand("fs", false, @@ -67,8 +57,8 @@ namespace OpenSim.Server.Handlers.BakedTextures throw new Exception("No BakedTextureService configuration"); } - m_FSBase = assetConfig.GetString("BaseDirectory", String.Empty); - if (m_FSBase == String.Empty) + m_FSBase = assetConfig.GetString("BaseDirectory", string.Empty); + if (m_FSBase == string.Empty) { m_log.ErrorFormat("[BAKES]: BaseDirectory not specified"); throw new Exception("Configuration error"); @@ -77,24 +67,21 @@ namespace OpenSim.Server.Handlers.BakedTextures m_log.Info("[BAKES]: XBakes service enabled"); } - public string Get(string id) + public byte[] Get(string id) { string file = HashToFile(id); string diskFile = Path.Combine(m_FSBase, file); - if (File.Exists(diskFile)) + try { - try - { - byte[] content = File.ReadAllBytes(diskFile); + byte[] content = File.ReadAllBytes(diskFile); - return utf8encoding.GetString(content); - } - catch - { - } + return content; } - return String.Empty; + catch + { + } + return new byte[0]; } public void Store(string id, string sdata) @@ -106,7 +93,7 @@ namespace OpenSim.Server.Handlers.BakedTextures File.Delete(diskFile); - byte[] data = utf8encoding.GetBytes(sdata); + byte[] data = Encoding.UTF8.GetBytes(sdata); using (FileStream fs = File.Create(diskFile)) fs.Write(data, 0, data.Length); diff --git a/OpenSim/Server/Handlers/BakedTextures/XBakesGetHandler.cs b/OpenSim/Server/Handlers/BakedTextures/XBakesGetHandler.cs deleted file mode 100644 index 3c6167384f..0000000000 --- a/OpenSim/Server/Handlers/BakedTextures/XBakesGetHandler.cs +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using Nini.Config; -using log4net; -using System; -using System.IO; -using System.Reflection; -using System.Net; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using OpenSim.Server.Base; -using OpenSim.Services.Interfaces; -using OpenSim.Framework; -using OpenSim.Framework.ServiceAuth; -using OpenSim.Framework.Servers.HttpServer; - -namespace OpenSim.Server.Handlers.BakedTextures -{ - public class BakesServerGetHandler : BaseStreamHandler - { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private IBakedTextureService m_BakesService; - private System.Text.UTF8Encoding utf8 = - new System.Text.UTF8Encoding(); - - public BakesServerGetHandler(IBakedTextureService service, IServiceAuth auth) : - base("GET", "/bakes", auth) - { - m_BakesService = service; - } - - protected override byte[] ProcessRequest( - string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - string[] p = SplitParams(path); - - if (p.Length == 0) - return new byte[0]; - - return utf8.GetBytes(m_BakesService.Get(p[0])); - } - } -} diff --git a/OpenSim/Server/Handlers/BakedTextures/XBakesHandler.cs b/OpenSim/Server/Handlers/BakedTextures/XBakesHandler.cs index 4386a2d1b1..6090697a21 100644 --- a/OpenSim/Server/Handlers/BakedTextures/XBakesHandler.cs +++ b/OpenSim/Server/Handlers/BakedTextures/XBakesHandler.cs @@ -26,6 +26,9 @@ */ using System; +using System.IO; +using System.Text; +using System.Net; using Nini.Config; using OpenSim.Server.Base; using OpenSim.Services.Interfaces; @@ -37,33 +40,91 @@ namespace OpenSim.Server.Handlers.BakedTextures { public class XBakesConnector : ServiceConnector { - private IBakedTextureService m_BakesService; private string m_ConfigName = "BakedTextureService"; public XBakesConnector(IConfigSource config, IHttpServer server, string configName) : base(config, server, configName) { - if (configName != String.Empty) + if (configName != string.Empty) m_ConfigName = configName; IConfig serverConfig = config.Configs[m_ConfigName]; if (serverConfig == null) throw new Exception(String.Format("No section '{0}' in config file", m_ConfigName)); - string assetService = serverConfig.GetString("LocalServiceModule", - String.Empty); + string bakesServiceName = serverConfig.GetString("LocalServiceModule", string.Empty); - if (assetService == String.Empty) + if (string.IsNullOrWhiteSpace(bakesServiceName)) throw new Exception("No BakedTextureService in config file"); - Object[] args = new Object[] { config }; - m_BakesService = - ServerUtils.LoadPlugin(assetService, args); + object[] args = new object[] { config }; + IBakedTextureService bakesService = ServerUtils.LoadPlugin(bakesServiceName, args); IServiceAuth auth = ServiceAuth.Create(config, m_ConfigName); - server.AddStreamHandler(new BakesServerGetHandler(m_BakesService, auth)); - server.AddStreamHandler(new BakesServerPostHandler(m_BakesService, auth)); + server.AddSimpleStreamHandler(new BakesServerHandler(bakesService, auth), true); + } + } + + public class BakesServerHandler : SimpleStreamHandler + { + private IBakedTextureService m_BakesService; + + public BakesServerHandler(IBakedTextureService service, IServiceAuth auth) : + base("/bakes", auth) + { + m_BakesService = service; + } + + protected override void ProcessRequest(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + if(m_BakesService == null) + { + httpResponse.StatusCode = (int)HttpStatusCode.InternalServerError; + return; + } + switch (httpRequest.HttpMethod) + { + case "GET": + doGet(httpRequest, httpResponse); + break; + case "POST": + doPost(httpRequest, httpResponse); + break; + default: + httpResponse.StatusCode = (int)HttpStatusCode.MethodNotAllowed; + return; + } + httpResponse.StatusCode = (int)HttpStatusCode.OK; + } + + private void doGet(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + string[] p = SplitParams(httpRequest.UriPath); + httpRequest.InputStream.Dispose(); + + if (p.Length == 0) + return; + + httpResponse.RawBuffer = m_BakesService.Get(p[0]); + } + + private void doPost(IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) + { + string[] p = SplitParams(httpRequest.UriPath); + + if (p.Length == 0) + return; + + using (StreamReader sr = new StreamReader(httpRequest.InputStream)) + m_BakesService.Store(p[0], sr.ReadToEnd()); + httpRequest.InputStream.Dispose(); + } + + public string[] SplitParams(string path) + { + string param = GetParam(path); + return param.Split(new char[] { '/', '?', '&' }, StringSplitOptions.RemoveEmptyEntries); } } } diff --git a/OpenSim/Server/Handlers/BakedTextures/XBakesPostHandler.cs b/OpenSim/Server/Handlers/BakedTextures/XBakesPostHandler.cs deleted file mode 100644 index d16000d572..0000000000 --- a/OpenSim/Server/Handlers/BakedTextures/XBakesPostHandler.cs +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (c) Contributors, http://opensimulator.org/ - * See CONTRIBUTORS.TXT for a full list of copyright holders. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * * Neither the name of the OpenSimulator Project nor the - * names of its contributors may be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -using Nini.Config; -using log4net; -using System; -using System.Reflection; -using System.IO; -using System.Net; -using System.Text; -using System.Text.RegularExpressions; -using System.Xml; -using System.Xml.Serialization; -using OpenSim.Server.Base; -using OpenSim.Services.Interfaces; -using OpenSim.Framework; -using OpenSim.Framework.ServiceAuth; -using OpenSim.Framework.Servers.HttpServer; - -namespace OpenSim.Server.Handlers.BakedTextures -{ - public class BakesServerPostHandler : BaseStreamHandler - { -// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private IBakedTextureService m_BakesService; - - public BakesServerPostHandler(IBakedTextureService service, IServiceAuth auth) : - base("POST", "/bakes", auth) - { - m_BakesService = service; - } - - protected override byte[] ProcessRequest( - string path, Stream request, IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) - { - string[] p = SplitParams(path); - - if (p.Length == 0) - { - return new byte[0]; - } - - using(StreamReader sr = new StreamReader(request)) - m_BakesService.Store(p[0],sr.ReadToEnd()); - - return new byte[0]; - } - } -} diff --git a/OpenSim/Services/Interfaces/IBakedTextureService.cs b/OpenSim/Services/Interfaces/IBakedTextureService.cs index 69df4a0ec5..ee4eba3b98 100644 --- a/OpenSim/Services/Interfaces/IBakedTextureService.cs +++ b/OpenSim/Services/Interfaces/IBakedTextureService.cs @@ -32,7 +32,7 @@ namespace OpenSim.Services.Interfaces { public interface IBakedTextureService { - string Get(string id); + byte[] Get(string id); void Store(string id, string data); } }