* Extracted common superclass for GetAssetStreamHandler and CachedGetAssetStreamHandler
* Added some more tests0.6.5-rc1
							parent
							
								
									6b88a205d6
								
							
						
					
					
						commit
						54b5346f16
					
				| 
						 | 
				
			
			@ -0,0 +1,196 @@
 | 
			
		|||
/*
 | 
			
		||||
 * 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 System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Net;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
using System.Xml;
 | 
			
		||||
using System.Xml.Serialization;
 | 
			
		||||
using log4net;
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
using OpenSim.Framework.Servers.HttpServer;
 | 
			
		||||
using OpenSim.Framework.Statistics;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Framework.Servers
 | 
			
		||||
{
 | 
			
		||||
    public abstract class BaseGetAssetStreamHandler : BaseStreamHandler
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        protected BaseGetAssetStreamHandler(string httpMethod, string path) : base(httpMethod, path)
 | 
			
		||||
        {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected abstract AssetBase GetAsset(UUID assetID);
 | 
			
		||||
 | 
			
		||||
        public override byte[] Handle(string path, Stream request,
 | 
			
		||||
                                      OSHttpRequest httpRequest, OSHttpResponse httpResponse)
 | 
			
		||||
        {
 | 
			
		||||
            byte[] result = new byte[] { };
 | 
			
		||||
 | 
			
		||||
            string[] p = SplitParams(path);
 | 
			
		||||
 | 
			
		||||
            if (p.Length > 0)
 | 
			
		||||
            {
 | 
			
		||||
                UUID assetID = UUID.Zero;
 | 
			
		||||
 | 
			
		||||
                if (!UUID.TryParse(p[0], out assetID))
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat(
 | 
			
		||||
                        "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]);
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (StatsManager.AssetStats != null)
 | 
			
		||||
                    StatsManager.AssetStats.AddRequest();
 | 
			
		||||
 | 
			
		||||
                AssetBase asset = GetAsset(assetID); 
 | 
			
		||||
 | 
			
		||||
                if (asset != null)
 | 
			
		||||
                {
 | 
			
		||||
//                    if (asset.ContainsReferences)
 | 
			
		||||
//                    {                       
 | 
			
		||||
//                        asset.Data = ProcessOutgoingAssetData(asset.Data);
 | 
			
		||||
//                    }
 | 
			
		||||
                    if (p.Length > 1 && p[1] == "data")
 | 
			
		||||
                    {
 | 
			
		||||
                        httpResponse.StatusCode = (int)HttpStatusCode.OK;
 | 
			
		||||
                        httpResponse.ContentType = SLAssetTypeToContentType(asset.Type);
 | 
			
		||||
                        result = asset.Data;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        XmlSerializer xs = new XmlSerializer(typeof(AssetBase));
 | 
			
		||||
                        MemoryStream ms = new MemoryStream();
 | 
			
		||||
                        XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8);
 | 
			
		||||
                        xw.Formatting = Formatting.Indented;
 | 
			
		||||
                        xs.Serialize(xw, asset);
 | 
			
		||||
                        xw.Flush();
 | 
			
		||||
 | 
			
		||||
                        ms.Seek(0, SeekOrigin.Begin);
 | 
			
		||||
                        //StreamReader sr = new StreamReader(ms);
 | 
			
		||||
 | 
			
		||||
                        result = ms.GetBuffer();
 | 
			
		||||
 | 
			
		||||
                        Array.Resize<byte>(ref result, (int)ms.Length);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (StatsManager.AssetStats != null)
 | 
			
		||||
                        StatsManager.AssetStats.AddNotFoundRequest();
 | 
			
		||||
 | 
			
		||||
                    m_log.InfoFormat("[REST]: GET:/asset failed to find {0}", assetID);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public string ProcessAssetDataString(string data)
 | 
			
		||||
        {
 | 
			
		||||
            Regex regex = new Regex("(creator_id|owner_id)\\s+(\\S+)");
 | 
			
		||||
 | 
			
		||||
            // IUserService userService = null;
 | 
			
		||||
 | 
			
		||||
            data = regex.Replace(data, delegate(Match m)
 | 
			
		||||
                                           {
 | 
			
		||||
                                               string result = String.Empty;
 | 
			
		||||
 | 
			
		||||
//                string key = m.Groups[1].Captures[0].Value;
 | 
			
		||||
//
 | 
			
		||||
//                string value = m.Groups[2].Captures[0].Value;
 | 
			
		||||
//
 | 
			
		||||
//                Guid userUri;
 | 
			
		||||
//
 | 
			
		||||
//                switch (key)
 | 
			
		||||
//                {
 | 
			
		||||
//                    case "creator_id":
 | 
			
		||||
//                        userUri = new Guid(value);
 | 
			
		||||
//                        //         result = "creator_url " + userService(userService, userUri);
 | 
			
		||||
//                        break;
 | 
			
		||||
//
 | 
			
		||||
//                    case "owner_id":
 | 
			
		||||
//                        userUri = new Guid(value);
 | 
			
		||||
//                        //       result = "owner_url " + ResolveUserUri(userService, userUri);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
                                               return result;
 | 
			
		||||
                                           });
 | 
			
		||||
 | 
			
		||||
            return data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string SLAssetTypeToContentType(int assetType)
 | 
			
		||||
        {
 | 
			
		||||
            switch (assetType)
 | 
			
		||||
            {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    return "image/jp2";
 | 
			
		||||
                case 1:
 | 
			
		||||
                    return "application/ogg";
 | 
			
		||||
                case 2:
 | 
			
		||||
                    return "application/x-metaverse-callingcard";
 | 
			
		||||
                case 3:
 | 
			
		||||
                    return "application/x-metaverse-landmark";
 | 
			
		||||
                case 5:
 | 
			
		||||
                    return "application/x-metaverse-clothing";
 | 
			
		||||
                case 6:
 | 
			
		||||
                    return "application/x-metaverse-primitive";
 | 
			
		||||
                case 7:
 | 
			
		||||
                    return "application/x-metaverse-notecard";
 | 
			
		||||
                case 8:
 | 
			
		||||
                    return "application/x-metaverse-folder";
 | 
			
		||||
                case 10:
 | 
			
		||||
                    return "application/x-metaverse-lsl";
 | 
			
		||||
                case 11:
 | 
			
		||||
                    return "application/x-metaverse-lso";
 | 
			
		||||
                case 12:
 | 
			
		||||
                    return "image/tga";
 | 
			
		||||
                case 13:
 | 
			
		||||
                    return "application/x-metaverse-bodypart";
 | 
			
		||||
                case 17:
 | 
			
		||||
                    return "audio/x-wav";
 | 
			
		||||
                case 19:
 | 
			
		||||
                    return "image/jpeg";
 | 
			
		||||
                case 20:
 | 
			
		||||
                    return "application/x-metaverse-animation";
 | 
			
		||||
                case 21:
 | 
			
		||||
                    return "application/x-metaverse-gesture";
 | 
			
		||||
                case 22:
 | 
			
		||||
                    return "application/x-metaverse-simstate";
 | 
			
		||||
                default:
 | 
			
		||||
                    return "application/octet-stream";
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -25,194 +25,27 @@
 | 
			
		|||
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
using System;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Reflection;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using System.Text.RegularExpressions;
 | 
			
		||||
using System.Xml;
 | 
			
		||||
using System.Xml.Serialization;
 | 
			
		||||
using log4net;
 | 
			
		||||
using OpenMetaverse;
 | 
			
		||||
using OpenSim.Data;
 | 
			
		||||
using OpenSim.Framework;
 | 
			
		||||
using OpenSim.Framework.Servers;
 | 
			
		||||
using OpenSim.Framework.Servers.HttpServer;
 | 
			
		||||
using OpenSim.Framework.Statistics;
 | 
			
		||||
using System.Net;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Framework.Servers
 | 
			
		||||
{
 | 
			
		||||
    public class CachedGetAssetStreamHandler : BaseStreamHandler
 | 
			
		||||
    public class CachedGetAssetStreamHandler : BaseGetAssetStreamHandler
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        // private OpenAsset_Main m_assetManager;
 | 
			
		||||
        private readonly IAssetCache m_assetProvider;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Constructor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="assetManager"></param>
 | 
			
		||||
        /// <param name="assetProvider"></param>
 | 
			
		||||
        public CachedGetAssetStreamHandler(IAssetCache assetProvider)
 | 
			
		||||
            : base("GET", "/assets")
 | 
			
		||||
        {
 | 
			
		||||
            // m_log.Info("[REST]: In Get Request");
 | 
			
		||||
            // m_assetManager = assetManager;
 | 
			
		||||
            m_assetProvider = assetProvider;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override byte[] Handle(string path, Stream request,
 | 
			
		||||
                                      OSHttpRequest httpRequest, OSHttpResponse httpResponse)
 | 
			
		||||
        protected override AssetBase GetAsset(UUID assetID)
 | 
			
		||||
        {
 | 
			
		||||
            string param = GetParam(path);
 | 
			
		||||
            byte[] result = new byte[] { };
 | 
			
		||||
 | 
			
		||||
            string[] p = param.Split(new char[] { '/', '?', '&' }, StringSplitOptions.RemoveEmptyEntries);
 | 
			
		||||
 | 
			
		||||
            if (p.Length > 0)
 | 
			
		||||
            {
 | 
			
		||||
                UUID assetID = UUID.Zero;
 | 
			
		||||
 | 
			
		||||
                if (!UUID.TryParse(p[0], out assetID))
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat(
 | 
			
		||||
                        "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]);
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (StatsManager.AssetStats != null)
 | 
			
		||||
                    StatsManager.AssetStats.AddRequest();
 | 
			
		||||
 | 
			
		||||
                AssetBase asset = m_assetProvider.GetAsset(assetID,true); // TODO IsTexture should be deduced from loaded asset. It is not used in this case.
 | 
			
		||||
 | 
			
		||||
                if (asset != null)
 | 
			
		||||
                {
 | 
			
		||||
//                    if (asset.ContainsReferences)
 | 
			
		||||
//                    {                       
 | 
			
		||||
//                        asset.Data = ProcessOutgoingAssetData(asset.Data);
 | 
			
		||||
//                    }
 | 
			
		||||
                    if (p.Length > 1 && p[1] == "data")
 | 
			
		||||
                    {
 | 
			
		||||
                        httpResponse.StatusCode = (int)HttpStatusCode.OK;
 | 
			
		||||
                        httpResponse.ContentType = SLAssetTypeToContentType(asset.Type);
 | 
			
		||||
                        result = asset.Data;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        XmlSerializer xs = new XmlSerializer(typeof(AssetBase));
 | 
			
		||||
                        MemoryStream ms = new MemoryStream();
 | 
			
		||||
                        XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8);
 | 
			
		||||
                        xw.Formatting = Formatting.Indented;
 | 
			
		||||
                        xs.Serialize(xw, asset);
 | 
			
		||||
                        xw.Flush();
 | 
			
		||||
 | 
			
		||||
                        ms.Seek(0, SeekOrigin.Begin);
 | 
			
		||||
                        //StreamReader sr = new StreamReader(ms);
 | 
			
		||||
 | 
			
		||||
                        result = ms.GetBuffer();
 | 
			
		||||
 | 
			
		||||
                        Array.Resize<byte>(ref result, (int)ms.Length);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (StatsManager.AssetStats != null)
 | 
			
		||||
                        StatsManager.AssetStats.AddNotFoundRequest();
 | 
			
		||||
 | 
			
		||||
                    m_log.InfoFormat("[REST]: GET:/asset failed to find {0}", assetID);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // private byte[] ProcessOutgoingAssetData(byte[] assetData)
 | 
			
		||||
        // {
 | 
			
		||||
        //     string data = Encoding.ASCII.GetString(assetData);
 | 
			
		||||
 | 
			
		||||
        //     data = ProcessAssetDataString(data);
 | 
			
		||||
 | 
			
		||||
        //     return Encoding.ASCII.GetBytes(data);
 | 
			
		||||
        // }
 | 
			
		||||
 | 
			
		||||
        public string ProcessAssetDataString(string data)
 | 
			
		||||
        {
 | 
			
		||||
            Regex regex = new Regex("(creator_id|owner_id)\\s+(\\S+)");
 | 
			
		||||
 | 
			
		||||
            // IUserService userService = null;
 | 
			
		||||
 | 
			
		||||
            data = regex.Replace(data, delegate(Match m)
 | 
			
		||||
            {
 | 
			
		||||
                string result = String.Empty;
 | 
			
		||||
 | 
			
		||||
//                string key = m.Groups[1].Captures[0].Value;
 | 
			
		||||
//
 | 
			
		||||
//                string value = m.Groups[2].Captures[0].Value;
 | 
			
		||||
//
 | 
			
		||||
//                Guid userUri;
 | 
			
		||||
//
 | 
			
		||||
//                switch (key)
 | 
			
		||||
//                {
 | 
			
		||||
//                    case "creator_id":
 | 
			
		||||
//                        userUri = new Guid(value);
 | 
			
		||||
//                        //         result = "creator_url " + userService(userService, userUri);
 | 
			
		||||
//                        break;
 | 
			
		||||
//
 | 
			
		||||
//                    case "owner_id":
 | 
			
		||||
//                        userUri = new Guid(value);
 | 
			
		||||
//                        //       result = "owner_url " + ResolveUserUri(userService, userUri);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
                return result;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string SLAssetTypeToContentType(int assetType)
 | 
			
		||||
        {
 | 
			
		||||
            switch (assetType)
 | 
			
		||||
            {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    return "image/jp2";
 | 
			
		||||
                case 1:
 | 
			
		||||
                    return "application/ogg";
 | 
			
		||||
                case 2:
 | 
			
		||||
                    return "application/x-metaverse-callingcard";
 | 
			
		||||
                case 3:
 | 
			
		||||
                    return "application/x-metaverse-landmark";
 | 
			
		||||
                case 5:
 | 
			
		||||
                    return "application/x-metaverse-clothing";
 | 
			
		||||
                case 6:
 | 
			
		||||
                    return "application/x-metaverse-primitive";
 | 
			
		||||
                case 7:
 | 
			
		||||
                    return "application/x-metaverse-notecard";
 | 
			
		||||
                case 8:
 | 
			
		||||
                    return "application/x-metaverse-folder";
 | 
			
		||||
                case 10:
 | 
			
		||||
                    return "application/x-metaverse-lsl";
 | 
			
		||||
                case 11:
 | 
			
		||||
                    return "application/x-metaverse-lso";
 | 
			
		||||
                case 12:
 | 
			
		||||
                    return "image/tga";
 | 
			
		||||
                case 13:
 | 
			
		||||
                    return "application/x-metaverse-bodypart";
 | 
			
		||||
                case 17:
 | 
			
		||||
                    return "audio/x-wav";
 | 
			
		||||
                case 19:
 | 
			
		||||
                    return "image/jpeg";
 | 
			
		||||
                case 20:
 | 
			
		||||
                    return "application/x-metaverse-animation";
 | 
			
		||||
                case 21:
 | 
			
		||||
                    return "application/x-metaverse-gesture";
 | 
			
		||||
                case 22:
 | 
			
		||||
                    return "application/x-metaverse-simstate";
 | 
			
		||||
                default:
 | 
			
		||||
                    return "application/octet-stream";
 | 
			
		||||
            }
 | 
			
		||||
            return m_assetProvider.GetAsset(assetID, true); // TODO IsTexture should be deduced from loaded asset. It is not used in this case.
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,174 +43,21 @@ using System.Net;
 | 
			
		|||
 | 
			
		||||
namespace OpenSim.Framework.Servers
 | 
			
		||||
{
 | 
			
		||||
    public class GetAssetStreamHandler : BaseStreamHandler
 | 
			
		||||
    public class GetAssetStreamHandler : BaseGetAssetStreamHandler
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        // private OpenAsset_Main m_assetManager;
 | 
			
		||||
        private readonly IAssetDataPlugin m_assetProvider;
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Constructor.
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        /// <param name="assetManager"></param>
 | 
			
		||||
        /// <param name="assetProvider"></param>
 | 
			
		||||
        public GetAssetStreamHandler(IAssetDataPlugin assetProvider)
 | 
			
		||||
            : base("GET", "/assets")
 | 
			
		||||
        {
 | 
			
		||||
            // m_log.Info("[REST]: In Get Request");
 | 
			
		||||
            // m_assetManager = assetManager;
 | 
			
		||||
            m_assetProvider = assetProvider;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override byte[] Handle(string path, Stream request,
 | 
			
		||||
                                      OSHttpRequest httpRequest, OSHttpResponse httpResponse)
 | 
			
		||||
        protected override AssetBase GetAsset(UUID assetID)
 | 
			
		||||
        {
 | 
			
		||||
            byte[] result = new byte[] { };
 | 
			
		||||
 | 
			
		||||
            string[] p = SplitParams(path);
 | 
			
		||||
 | 
			
		||||
            if (p.Length > 0)
 | 
			
		||||
            {
 | 
			
		||||
                UUID assetID = UUID.Zero;
 | 
			
		||||
 | 
			
		||||
                if (!UUID.TryParse(p[0], out assetID))
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat(
 | 
			
		||||
                        "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]);
 | 
			
		||||
                    return result;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                if (StatsManager.AssetStats != null)
 | 
			
		||||
                    StatsManager.AssetStats.AddRequest();
 | 
			
		||||
 | 
			
		||||
                AssetBase asset = m_assetProvider.FetchAsset(assetID);
 | 
			
		||||
                if (asset != null)
 | 
			
		||||
                {
 | 
			
		||||
//                    if (asset.ContainsReferences)
 | 
			
		||||
//                    {                       
 | 
			
		||||
//                        asset.Data = ProcessOutgoingAssetData(asset.Data);
 | 
			
		||||
//                    }
 | 
			
		||||
                    if (p.Length > 1 && p[1] == "data")
 | 
			
		||||
                    {
 | 
			
		||||
                        httpResponse.StatusCode = (int)HttpStatusCode.OK;
 | 
			
		||||
                        httpResponse.ContentType = SLAssetTypeToContentType(asset.Type);
 | 
			
		||||
                        result = asset.Data;
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        XmlSerializer xs = new XmlSerializer(typeof(AssetBase));
 | 
			
		||||
                        MemoryStream ms = new MemoryStream();
 | 
			
		||||
                        XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8);
 | 
			
		||||
                        xw.Formatting = Formatting.Indented;
 | 
			
		||||
                        xs.Serialize(xw, asset);
 | 
			
		||||
                        xw.Flush();
 | 
			
		||||
 | 
			
		||||
                        ms.Seek(0, SeekOrigin.Begin);
 | 
			
		||||
                        //StreamReader sr = new StreamReader(ms);
 | 
			
		||||
 | 
			
		||||
                        result = ms.GetBuffer();
 | 
			
		||||
 | 
			
		||||
                        Array.Resize<byte>(ref result, (int)ms.Length);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                else
 | 
			
		||||
                {
 | 
			
		||||
                    if (StatsManager.AssetStats != null)
 | 
			
		||||
                        StatsManager.AssetStats.AddNotFoundRequest();
 | 
			
		||||
 | 
			
		||||
                    m_log.InfoFormat("[REST]: GET:/asset failed to find {0}", assetID);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            return result;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // private byte[] ProcessOutgoingAssetData(byte[] assetData)
 | 
			
		||||
        // {
 | 
			
		||||
        //     string data = Encoding.ASCII.GetString(assetData);
 | 
			
		||||
 | 
			
		||||
        //     data = ProcessAssetDataString(data);
 | 
			
		||||
 | 
			
		||||
        //     return Encoding.ASCII.GetBytes(data);
 | 
			
		||||
        // }
 | 
			
		||||
 | 
			
		||||
        public string ProcessAssetDataString(string data)
 | 
			
		||||
        {
 | 
			
		||||
            Regex regex = new Regex("(creator_id|owner_id)\\s+(\\S+)");
 | 
			
		||||
 | 
			
		||||
            // IUserService userService = null;
 | 
			
		||||
 | 
			
		||||
            data = regex.Replace(data, delegate(Match m)
 | 
			
		||||
            {
 | 
			
		||||
                string result = String.Empty;
 | 
			
		||||
 | 
			
		||||
//                string key = m.Groups[1].Captures[0].Value;
 | 
			
		||||
//
 | 
			
		||||
//                string value = m.Groups[2].Captures[0].Value;
 | 
			
		||||
//
 | 
			
		||||
//                Guid userUri;
 | 
			
		||||
//
 | 
			
		||||
//                switch (key)
 | 
			
		||||
//                {
 | 
			
		||||
//                    case "creator_id":
 | 
			
		||||
//                        userUri = new Guid(value);
 | 
			
		||||
//                        //         result = "creator_url " + userService(userService, userUri);
 | 
			
		||||
//                        break;
 | 
			
		||||
//
 | 
			
		||||
//                    case "owner_id":
 | 
			
		||||
//                        userUri = new Guid(value);
 | 
			
		||||
//                        //       result = "owner_url " + ResolveUserUri(userService, userUri);
 | 
			
		||||
//                        break;
 | 
			
		||||
//                }
 | 
			
		||||
 | 
			
		||||
                return result;
 | 
			
		||||
            });
 | 
			
		||||
 | 
			
		||||
            return data;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private string SLAssetTypeToContentType(int assetType)
 | 
			
		||||
        {
 | 
			
		||||
            switch (assetType)
 | 
			
		||||
            {
 | 
			
		||||
                case 0:
 | 
			
		||||
                    return "image/jp2";
 | 
			
		||||
                case 1:
 | 
			
		||||
                    return "application/ogg";
 | 
			
		||||
                case 2:
 | 
			
		||||
                    return "application/x-metaverse-callingcard";
 | 
			
		||||
                case 3:
 | 
			
		||||
                    return "application/x-metaverse-landmark";
 | 
			
		||||
                case 5:
 | 
			
		||||
                    return "application/x-metaverse-clothing";
 | 
			
		||||
                case 6:
 | 
			
		||||
                    return "application/x-metaverse-primitive";
 | 
			
		||||
                case 7:
 | 
			
		||||
                    return "application/x-metaverse-notecard";
 | 
			
		||||
                case 8:
 | 
			
		||||
                    return "application/x-metaverse-folder";
 | 
			
		||||
                case 10:
 | 
			
		||||
                    return "application/x-metaverse-lsl";
 | 
			
		||||
                case 11:
 | 
			
		||||
                    return "application/x-metaverse-lso";
 | 
			
		||||
                case 12:
 | 
			
		||||
                    return "image/tga";
 | 
			
		||||
                case 13:
 | 
			
		||||
                    return "application/x-metaverse-bodypart";
 | 
			
		||||
                case 17:
 | 
			
		||||
                    return "audio/x-wav";
 | 
			
		||||
                case 19:
 | 
			
		||||
                    return "image/jpeg";
 | 
			
		||||
                case 20:
 | 
			
		||||
                    return "application/x-metaverse-animation";
 | 
			
		||||
                case 21:
 | 
			
		||||
                    return "application/x-metaverse-gesture";
 | 
			
		||||
                case 22:
 | 
			
		||||
                    return "application/x-metaverse-simstate";
 | 
			
		||||
                default:
 | 
			
		||||
                    return "application/octet-stream";
 | 
			
		||||
            }
 | 
			
		||||
            return m_assetProvider.FetchAsset(assetID);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,72 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Collections.Generic;
 | 
			
		||||
using System.Text;
 | 
			
		||||
using NUnit.Framework;
 | 
			
		||||
using OpenSim.Data;
 | 
			
		||||
using OpenSim.Framework.Servers.HttpServer;
 | 
			
		||||
using OpenSim.Tests.Common;
 | 
			
		||||
 | 
			
		||||
namespace OpenSim.Framework.Servers.Tests
 | 
			
		||||
{
 | 
			
		||||
    [TestFixture]
 | 
			
		||||
    public class CachedGetAssetStreamHandlerTests
 | 
			
		||||
    {
 | 
			
		||||
        private const string ASSETS_PATH = "/assets";
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestConstructor()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelper.InMethod();
 | 
			
		||||
 | 
			
		||||
            CachedGetAssetStreamHandler handler = new CachedGetAssetStreamHandler(null);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestGetParams()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelper.InMethod();
 | 
			
		||||
 | 
			
		||||
            CachedGetAssetStreamHandler handler = new CachedGetAssetStreamHandler(null);
 | 
			
		||||
            BaseRequestHandlerTestHelper.BaseTestGetParams(handler, ASSETS_PATH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestSplitParams()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelper.InMethod();
 | 
			
		||||
 | 
			
		||||
            CachedGetAssetStreamHandler handler = new CachedGetAssetStreamHandler(null);
 | 
			
		||||
            BaseRequestHandlerTestHelper.BaseTestSplitParams(handler, ASSETS_PATH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestHandleNoParams()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelper.InMethod();
 | 
			
		||||
 | 
			
		||||
            CachedGetAssetStreamHandler handler = new CachedGetAssetStreamHandler(null);
 | 
			
		||||
 | 
			
		||||
            BaseRequestHandlerTestHelper.BaseTestHandleNoParams(handler, ASSETS_PATH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
        public void TestHandleMalformedGuid()
 | 
			
		||||
        {
 | 
			
		||||
            TestHelper.InMethod();
 | 
			
		||||
 | 
			
		||||
            CachedGetAssetStreamHandler handler = new CachedGetAssetStreamHandler(null);
 | 
			
		||||
 | 
			
		||||
            BaseRequestHandlerTestHelper.BaseTestHandleMalformedGuid(handler, ASSETS_PATH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //[Test]
 | 
			
		||||
        //public void TestHandleFetchMissingAsset()
 | 
			
		||||
        //{
 | 
			
		||||
 | 
			
		||||
        //    byte[] emptyResult = new byte[] { };
 | 
			
		||||
        //    CachedGetAssetStreamHandler handler = new CachedGetAssetStreamHandler(null);
 | 
			
		||||
 | 
			
		||||
        //    Assert.AreEqual(new string[] { }, handler.Handle("/assets/badGuid", null, null, null), "Failed on bad guid.");
 | 
			
		||||
        //}
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -11,7 +11,6 @@ namespace OpenSim.Framework.Servers.Tests
 | 
			
		|||
    [TestFixture]
 | 
			
		||||
    public class GetAssetStreamHandlerTests
 | 
			
		||||
    {
 | 
			
		||||
        private static byte[] EmptyByteArray = new byte[] {};
 | 
			
		||||
        private const string ASSETS_PATH = "/assets";
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
| 
						 | 
				
			
			@ -47,8 +46,7 @@ namespace OpenSim.Framework.Servers.Tests
 | 
			
		|||
 | 
			
		||||
            GetAssetStreamHandler handler = new GetAssetStreamHandler(null);
 | 
			
		||||
 | 
			
		||||
            Assert.AreEqual(EmptyByteArray, handler.Handle(ASSETS_PATH, null, null, null), "Failed on empty params.");
 | 
			
		||||
            Assert.AreEqual(EmptyByteArray, handler.Handle(ASSETS_PATH + "/", null, null, null), "Failed on single slash.");
 | 
			
		||||
            BaseRequestHandlerTestHelper.BaseTestHandleNoParams(handler, ASSETS_PATH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Test]
 | 
			
		||||
| 
						 | 
				
			
			@ -58,13 +56,12 @@ namespace OpenSim.Framework.Servers.Tests
 | 
			
		|||
 | 
			
		||||
            GetAssetStreamHandler handler = new GetAssetStreamHandler(null);
 | 
			
		||||
 | 
			
		||||
            Assert.AreEqual(EmptyByteArray, handler.Handle(ASSETS_PATH + "/badGuid", null, null, null), "Failed on bad guid.");
 | 
			
		||||
            BaseRequestHandlerTestHelper.BaseTestHandleMalformedGuid(handler, ASSETS_PATH);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //[Test]
 | 
			
		||||
        //public void TestHandleFetchMissingAsset()
 | 
			
		||||
        //{
 | 
			
		||||
 | 
			
		||||
        //    byte[] emptyResult = new byte[] { };
 | 
			
		||||
        //    GetAssetStreamHandler handler = new GetAssetStreamHandler(null);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,5 +40,18 @@ namespace OpenSim.Tests.Common
 | 
			
		|||
            Assert.AreEqual(new string[] { "c", "d" }, handler.SplitParams(assetsPath + "/c/d"), "Failed on second segment.");
 | 
			
		||||
            Assert.AreEqual(new string[] { "e", "f" }, handler.SplitParams(assetsPath + "/e/f/"), "Failed on trailing slash.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static byte[] EmptyByteArray = new byte[] {};
 | 
			
		||||
 | 
			
		||||
        public static void BaseTestHandleNoParams(BaseGetAssetStreamHandler handler, string assetsPath)
 | 
			
		||||
        {
 | 
			
		||||
            Assert.AreEqual(EmptyByteArray, handler.Handle(assetsPath, null, null, null), "Failed on empty params.");
 | 
			
		||||
            Assert.AreEqual(EmptyByteArray, handler.Handle(assetsPath + "/", null, null, null), "Failed on single slash.");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static void BaseTestHandleMalformedGuid(BaseGetAssetStreamHandler handler, string assetsPath)
 | 
			
		||||
        {
 | 
			
		||||
            Assert.AreEqual(EmptyByteArray, handler.Handle(assetsPath + "/badGuid", null, null, null), "Failed on bad guid.");
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue