diff options
-rw-r--r-- | OpenSim/Framework/Servers/CachedGetAssetStreamHandler.cs | 434 |
1 files changed, 217 insertions, 217 deletions
diff --git a/OpenSim/Framework/Servers/CachedGetAssetStreamHandler.cs b/OpenSim/Framework/Servers/CachedGetAssetStreamHandler.cs index 7a9030c..d7150e0 100644 --- a/OpenSim/Framework/Servers/CachedGetAssetStreamHandler.cs +++ b/OpenSim/Framework/Servers/CachedGetAssetStreamHandler.cs | |||
@@ -1,217 +1,217 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSimulator Project nor the | 12 | * * Neither the name of the OpenSimulator Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.IO; | 29 | using System.IO; |
30 | using System.Reflection; | 30 | using System.Reflection; |
31 | using System.Text; | 31 | using System.Text; |
32 | using System.Text.RegularExpressions; | 32 | using System.Text.RegularExpressions; |
33 | using System.Xml; | 33 | using System.Xml; |
34 | using System.Xml.Serialization; | 34 | using System.Xml.Serialization; |
35 | using log4net; | 35 | using log4net; |
36 | using OpenMetaverse; | 36 | using OpenMetaverse; |
37 | using OpenSim.Data; | 37 | using OpenSim.Data; |
38 | using OpenSim.Framework; | 38 | using OpenSim.Framework; |
39 | using OpenSim.Framework.Servers; | 39 | using OpenSim.Framework.Servers; |
40 | using OpenSim.Framework.Statistics; | 40 | using OpenSim.Framework.Statistics; |
41 | using System.Net; | 41 | using System.Net; |
42 | 42 | ||
43 | namespace OpenSim.Framework.Servers | 43 | namespace OpenSim.Framework.Servers |
44 | { | 44 | { |
45 | public class CachedGetAssetStreamHandler : BaseStreamHandler | 45 | public class CachedGetAssetStreamHandler : BaseStreamHandler |
46 | { | 46 | { |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 48 | ||
49 | // private OpenAsset_Main m_assetManager; | 49 | // private OpenAsset_Main m_assetManager; |
50 | private IAssetCache m_assetProvider; | 50 | private IAssetCache m_assetProvider; |
51 | 51 | ||
52 | /// <summary> | 52 | /// <summary> |
53 | /// Constructor. | 53 | /// Constructor. |
54 | /// </summary> | 54 | /// </summary> |
55 | /// <param name="assetManager"></param> | 55 | /// <param name="assetManager"></param> |
56 | /// <param name="assetProvider"></param> | 56 | /// <param name="assetProvider"></param> |
57 | public CachedGetAssetStreamHandler(IAssetCache assetProvider) | 57 | public CachedGetAssetStreamHandler(IAssetCache assetProvider) |
58 | : base("GET", "/assets") | 58 | : base("GET", "/assets") |
59 | { | 59 | { |
60 | m_log.Info("[REST]: In Get Request"); | 60 | m_log.Info("[REST]: In Get Request"); |
61 | // m_assetManager = assetManager; | 61 | // m_assetManager = assetManager; |
62 | m_assetProvider = assetProvider; | 62 | m_assetProvider = assetProvider; |
63 | } | 63 | } |
64 | 64 | ||
65 | public override byte[] Handle(string path, Stream request, | 65 | public override byte[] Handle(string path, Stream request, |
66 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) | 66 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) |
67 | { | 67 | { |
68 | string param = GetParam(path); | 68 | string param = GetParam(path); |
69 | byte[] result = new byte[] { }; | 69 | byte[] result = new byte[] { }; |
70 | 70 | ||
71 | string[] p = param.Split(new char[] { '/', '?', '&' }, StringSplitOptions.RemoveEmptyEntries); | 71 | string[] p = param.Split(new char[] { '/', '?', '&' }, StringSplitOptions.RemoveEmptyEntries); |
72 | 72 | ||
73 | if (p.Length > 0) | 73 | if (p.Length > 0) |
74 | { | 74 | { |
75 | UUID assetID = UUID.Zero; | 75 | UUID assetID = UUID.Zero; |
76 | 76 | ||
77 | if (!UUID.TryParse(p[0], out assetID)) | 77 | if (!UUID.TryParse(p[0], out assetID)) |
78 | { | 78 | { |
79 | m_log.InfoFormat( | 79 | m_log.InfoFormat( |
80 | "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]); | 80 | "[REST]: GET:/asset ignoring request with malformed UUID {0}", p[0]); |
81 | return result; | 81 | return result; |
82 | } | 82 | } |
83 | 83 | ||
84 | if (StatsManager.AssetStats != null) | 84 | if (StatsManager.AssetStats != null) |
85 | StatsManager.AssetStats.AddRequest(); | 85 | StatsManager.AssetStats.AddRequest(); |
86 | 86 | ||
87 | AssetBase asset = m_assetProvider.GetAsset(assetID,true); // TODO IsTexture should be deduced from loaded asset. It is not used in this case. | 87 | AssetBase asset = m_assetProvider.GetAsset(assetID,true); // TODO IsTexture should be deduced from loaded asset. It is not used in this case. |
88 | 88 | ||
89 | if (asset != null) | 89 | if (asset != null) |
90 | { | 90 | { |
91 | // if (asset.ContainsReferences) | 91 | // if (asset.ContainsReferences) |
92 | // { | 92 | // { |
93 | // asset.Data = ProcessOutgoingAssetData(asset.Data); | 93 | // asset.Data = ProcessOutgoingAssetData(asset.Data); |
94 | // } | 94 | // } |
95 | if (p.Length > 1 && p[1] == "data") | 95 | if (p.Length > 1 && p[1] == "data") |
96 | { | 96 | { |
97 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | 97 | httpResponse.StatusCode = (int)HttpStatusCode.OK; |
98 | httpResponse.ContentType = SLAssetTypeToContentType(asset.Type); | 98 | httpResponse.ContentType = SLAssetTypeToContentType(asset.Type); |
99 | result = asset.Data; | 99 | result = asset.Data; |
100 | } | 100 | } |
101 | else | 101 | else |
102 | { | 102 | { |
103 | XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); | 103 | XmlSerializer xs = new XmlSerializer(typeof(AssetBase)); |
104 | MemoryStream ms = new MemoryStream(); | 104 | MemoryStream ms = new MemoryStream(); |
105 | XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); | 105 | XmlTextWriter xw = new XmlTextWriter(ms, Encoding.UTF8); |
106 | xw.Formatting = Formatting.Indented; | 106 | xw.Formatting = Formatting.Indented; |
107 | xs.Serialize(xw, asset); | 107 | xs.Serialize(xw, asset); |
108 | xw.Flush(); | 108 | xw.Flush(); |
109 | 109 | ||
110 | ms.Seek(0, SeekOrigin.Begin); | 110 | ms.Seek(0, SeekOrigin.Begin); |
111 | //StreamReader sr = new StreamReader(ms); | 111 | //StreamReader sr = new StreamReader(ms); |
112 | 112 | ||
113 | result = ms.GetBuffer(); | 113 | result = ms.GetBuffer(); |
114 | 114 | ||
115 | Array.Resize<byte>(ref result, (int)ms.Length); | 115 | Array.Resize<byte>(ref result, (int)ms.Length); |
116 | } | 116 | } |
117 | } | 117 | } |
118 | else | 118 | else |
119 | { | 119 | { |
120 | if (StatsManager.AssetStats != null) | 120 | if (StatsManager.AssetStats != null) |
121 | StatsManager.AssetStats.AddNotFoundRequest(); | 121 | StatsManager.AssetStats.AddNotFoundRequest(); |
122 | 122 | ||
123 | m_log.InfoFormat("[REST]: GET:/asset failed to find {0}", assetID); | 123 | m_log.InfoFormat("[REST]: GET:/asset failed to find {0}", assetID); |
124 | } | 124 | } |
125 | } | 125 | } |
126 | 126 | ||
127 | return result; | 127 | return result; |
128 | } | 128 | } |
129 | 129 | ||
130 | // private byte[] ProcessOutgoingAssetData(byte[] assetData) | 130 | // private byte[] ProcessOutgoingAssetData(byte[] assetData) |
131 | // { | 131 | // { |
132 | // string data = Encoding.ASCII.GetString(assetData); | 132 | // string data = Encoding.ASCII.GetString(assetData); |
133 | 133 | ||
134 | // data = ProcessAssetDataString(data); | 134 | // data = ProcessAssetDataString(data); |
135 | 135 | ||
136 | // return Encoding.ASCII.GetBytes(data); | 136 | // return Encoding.ASCII.GetBytes(data); |
137 | // } | 137 | // } |
138 | 138 | ||
139 | public string ProcessAssetDataString(string data) | 139 | public string ProcessAssetDataString(string data) |
140 | { | 140 | { |
141 | Regex regex = new Regex("(creator_id|owner_id)\\s+(\\S+)"); | 141 | Regex regex = new Regex("(creator_id|owner_id)\\s+(\\S+)"); |
142 | 142 | ||
143 | // IUserService userService = null; | 143 | // IUserService userService = null; |
144 | 144 | ||
145 | data = regex.Replace(data, delegate(Match m) | 145 | data = regex.Replace(data, delegate(Match m) |
146 | { | 146 | { |
147 | string result = String.Empty; | 147 | string result = String.Empty; |
148 | 148 | ||
149 | // string key = m.Groups[1].Captures[0].Value; | 149 | // string key = m.Groups[1].Captures[0].Value; |
150 | // | 150 | // |
151 | // string value = m.Groups[2].Captures[0].Value; | 151 | // string value = m.Groups[2].Captures[0].Value; |
152 | // | 152 | // |
153 | // Guid userUri; | 153 | // Guid userUri; |
154 | // | 154 | // |
155 | // switch (key) | 155 | // switch (key) |
156 | // { | 156 | // { |
157 | // case "creator_id": | 157 | // case "creator_id": |
158 | // userUri = new Guid(value); | 158 | // userUri = new Guid(value); |
159 | // // result = "creator_url " + userService(userService, userUri); | 159 | // // result = "creator_url " + userService(userService, userUri); |
160 | // break; | 160 | // break; |
161 | // | 161 | // |
162 | // case "owner_id": | 162 | // case "owner_id": |
163 | // userUri = new Guid(value); | 163 | // userUri = new Guid(value); |
164 | // // result = "owner_url " + ResolveUserUri(userService, userUri); | 164 | // // result = "owner_url " + ResolveUserUri(userService, userUri); |
165 | // break; | 165 | // break; |
166 | // } | 166 | // } |
167 | 167 | ||
168 | return result; | 168 | return result; |
169 | }); | 169 | }); |
170 | 170 | ||
171 | return data; | 171 | return data; |
172 | } | 172 | } |
173 | 173 | ||
174 | private string SLAssetTypeToContentType(int assetType) | 174 | private string SLAssetTypeToContentType(int assetType) |
175 | { | 175 | { |
176 | switch (assetType) | 176 | switch (assetType) |
177 | { | 177 | { |
178 | case 0: | 178 | case 0: |
179 | return "image/jp2"; | 179 | return "image/jp2"; |
180 | case 1: | 180 | case 1: |
181 | return "application/ogg"; | 181 | return "application/ogg"; |
182 | case 2: | 182 | case 2: |
183 | return "application/x-metaverse-callingcard"; | 183 | return "application/x-metaverse-callingcard"; |
184 | case 3: | 184 | case 3: |
185 | return "application/x-metaverse-landmark"; | 185 | return "application/x-metaverse-landmark"; |
186 | case 5: | 186 | case 5: |
187 | return "application/x-metaverse-clothing"; | 187 | return "application/x-metaverse-clothing"; |
188 | case 6: | 188 | case 6: |
189 | return "application/x-metaverse-primitive"; | 189 | return "application/x-metaverse-primitive"; |
190 | case 7: | 190 | case 7: |
191 | return "application/x-metaverse-notecard"; | 191 | return "application/x-metaverse-notecard"; |
192 | case 8: | 192 | case 8: |
193 | return "application/x-metaverse-folder"; | 193 | return "application/x-metaverse-folder"; |
194 | case 10: | 194 | case 10: |
195 | return "application/x-metaverse-lsl"; | 195 | return "application/x-metaverse-lsl"; |
196 | case 11: | 196 | case 11: |
197 | return "application/x-metaverse-lso"; | 197 | return "application/x-metaverse-lso"; |
198 | case 12: | 198 | case 12: |
199 | return "image/tga"; | 199 | return "image/tga"; |
200 | case 13: | 200 | case 13: |
201 | return "application/x-metaverse-bodypart"; | 201 | return "application/x-metaverse-bodypart"; |
202 | case 17: | 202 | case 17: |
203 | return "audio/x-wav"; | 203 | return "audio/x-wav"; |
204 | case 19: | 204 | case 19: |
205 | return "image/jpeg"; | 205 | return "image/jpeg"; |
206 | case 20: | 206 | case 20: |
207 | return "application/x-metaverse-animation"; | 207 | return "application/x-metaverse-animation"; |
208 | case 21: | 208 | case 21: |
209 | return "application/x-metaverse-gesture"; | 209 | return "application/x-metaverse-gesture"; |
210 | case 22: | 210 | case 22: |
211 | return "application/x-metaverse-simstate"; | 211 | return "application/x-metaverse-simstate"; |
212 | default: | 212 | default: |
213 | return "application/octet-stream"; | 213 | return "application/octet-stream"; |
214 | } | 214 | } |
215 | } | 215 | } |
216 | } | 216 | } |
217 | } | 217 | } |