aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs')
-rw-r--r--OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs113
1 files changed, 64 insertions, 49 deletions
diff --git a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
index 17febf9..79e49a1 100644
--- a/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
+++ b/OpenSim/Services/Connectors/SimianGrid/SimianAssetServiceConnector.cs
@@ -112,59 +112,23 @@ namespace OpenSim.Services.Connectors.SimianGrid
112 112
113 public AssetBase Get(string id) 113 public AssetBase Get(string id)
114 { 114 {
115 AssetBase asset = null;
116
117 // Cache fetch 115 // Cache fetch
118 if (m_cache != null) 116 if (m_cache != null)
119 { 117 {
120 asset = m_cache.Get(id); 118 AssetBase asset = m_cache.Get(id);
121 if (asset != null) 119 if (asset != null)
122 return asset; 120 return asset;
123 } 121 }
124 122
125 Uri url; 123 return GetRemote(id);
126 124 }
127 // Determine if id is an absolute URL or a grid-relative UUID
128 if (!Uri.TryCreate(id, UriKind.Absolute, out url))
129 url = new Uri(m_serverUrl + id);
130
131 try
132 {
133 HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
134
135 using (WebResponse response = request.GetResponse())
136 {
137 using (Stream responseStream = response.GetResponseStream())
138 {
139 string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty;
140
141 // Create the asset object
142 asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID);
143
144 UUID assetID;
145 if (UUID.TryParse(id, out assetID))
146 asset.FullID = assetID;
147
148 // Grab the asset data from the response stream
149 using (MemoryStream stream = new MemoryStream())
150 {
151 responseStream.CopyTo(stream, Int32.MaxValue);
152 asset.Data = stream.ToArray();
153 }
154 }
155 }
156 125
157 // Cache store 126 public AssetBase GetCached(string id)
158 if (m_cache != null && asset != null) 127 {
159 m_cache.Cache(asset); 128 if (m_cache != null)
129 return m_cache.Get(id);
160 130
161 return asset; 131 return null;
162 }
163 catch (Exception ex)
164 {
165 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message);
166 return null;
167 }
168 } 132 }
169 133
170 /// <summary> 134 /// <summary>
@@ -245,10 +209,21 @@ namespace OpenSim.Services.Connectors.SimianGrid
245 /// <returns>True if the id was parseable, false otherwise</returns> 209 /// <returns>True if the id was parseable, false otherwise</returns>
246 public bool Get(string id, Object sender, AssetRetrieved handler) 210 public bool Get(string id, Object sender, AssetRetrieved handler)
247 { 211 {
212 // Cache fetch
213 if (m_cache != null)
214 {
215 AssetBase asset = m_cache.Get(id);
216 if (asset != null)
217 {
218 handler(id, sender, asset);
219 return true;
220 }
221 }
222
248 Util.FireAndForget( 223 Util.FireAndForget(
249 delegate(object o) 224 delegate(object o)
250 { 225 {
251 AssetBase asset = Get(id); 226 AssetBase asset = GetRemote(id);
252 handler(id, sender, asset); 227 handler(id, sender, asset);
253 } 228 }
254 ); 229 );
@@ -407,12 +382,52 @@ namespace OpenSim.Services.Connectors.SimianGrid
407 382
408 #endregion IAssetService 383 #endregion IAssetService
409 384
410 public AssetBase GetCached(string id) 385 private AssetBase GetRemote(string id)
411 { 386 {
412 if (m_cache != null) 387 AssetBase asset = null;
413 return m_cache.Get(id); 388 Uri url;
414 389
415 return null; 390 // Determine if id is an absolute URL or a grid-relative UUID
391 if (!Uri.TryCreate(id, UriKind.Absolute, out url))
392 url = new Uri(m_serverUrl + id);
393
394 try
395 {
396 HttpWebRequest request = UntrustedHttpWebRequest.Create(url);
397
398 using (WebResponse response = request.GetResponse())
399 {
400 using (Stream responseStream = response.GetResponseStream())
401 {
402 string creatorID = response.Headers.GetOne("X-Asset-Creator-Id") ?? String.Empty;
403
404 // Create the asset object
405 asset = new AssetBase(id, String.Empty, SLUtil.ContentTypeToSLAssetType(response.ContentType), creatorID);
406
407 UUID assetID;
408 if (UUID.TryParse(id, out assetID))
409 asset.FullID = assetID;
410
411 // Grab the asset data from the response stream
412 using (MemoryStream stream = new MemoryStream())
413 {
414 responseStream.CopyTo(stream, Int32.MaxValue);
415 asset.Data = stream.ToArray();
416 }
417 }
418 }
419
420 // Cache store
421 if (m_cache != null && asset != null)
422 m_cache.Cache(asset);
423
424 return asset;
425 }
426 catch (Exception ex)
427 {
428 m_log.Warn("[SIMIAN ASSET CONNECTOR]: Asset GET from " + url + " failed: " + ex.Message);
429 return null;
430 }
416 } 431 }
417 } 432 }
418} 433}