diff options
Diffstat (limited to 'OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs')
-rw-r--r-- | OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs | 100 |
1 files changed, 73 insertions, 27 deletions
diff --git a/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs b/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs index 8f7412b..91c5c54 100644 --- a/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs +++ b/OpenSim/Server/Handlers/Asset/AssetServerGetHandler.cs | |||
@@ -38,23 +38,34 @@ using System.Xml.Serialization; | |||
38 | using OpenSim.Server.Base; | 38 | using OpenSim.Server.Base; |
39 | using OpenSim.Services.Interfaces; | 39 | using OpenSim.Services.Interfaces; |
40 | using OpenSim.Framework; | 40 | using OpenSim.Framework; |
41 | using OpenSim.Framework.ServiceAuth; | ||
41 | using OpenSim.Framework.Servers.HttpServer; | 42 | using OpenSim.Framework.Servers.HttpServer; |
42 | 43 | ||
43 | namespace OpenSim.Server.Handlers.Asset | 44 | namespace OpenSim.Server.Handlers.Asset |
44 | { | 45 | { |
45 | public class AssetServerGetHandler : BaseStreamHandler | 46 | public class AssetServerGetHandler : BaseStreamHandler |
46 | { | 47 | { |
47 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | 49 | ||
49 | private IAssetService m_AssetService; | 50 | private IAssetService m_AssetService; |
51 | private string m_RedirectURL; | ||
50 | 52 | ||
51 | public AssetServerGetHandler(IAssetService service) : | 53 | public AssetServerGetHandler(IAssetService service) : |
52 | base("GET", "/assets") | 54 | base("GET", "/assets") |
53 | { | 55 | { |
56 | m_AssetService = service; | ||
57 | } | ||
58 | |||
59 | public AssetServerGetHandler(IAssetService service, IServiceAuth auth, string redirectURL) : | ||
60 | base("GET", "/assets", auth) | ||
61 | { | ||
54 | m_AssetService = service; | 62 | m_AssetService = service; |
63 | m_RedirectURL = redirectURL; | ||
64 | if (!m_RedirectURL.EndsWith("/")) | ||
65 | m_RedirectURL = m_RedirectURL.TrimEnd('/'); | ||
55 | } | 66 | } |
56 | 67 | ||
57 | public override byte[] Handle(string path, Stream request, | 68 | protected override byte[] ProcessRequest(string path, Stream request, |
58 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) | 69 | IOSHttpRequest httpRequest, IOSHttpResponse httpResponse) |
59 | { | 70 | { |
60 | byte[] result = new byte[0]; | 71 | byte[] result = new byte[0]; |
@@ -64,45 +75,62 @@ namespace OpenSim.Server.Handlers.Asset | |||
64 | if (p.Length == 0) | 75 | if (p.Length == 0) |
65 | return result; | 76 | return result; |
66 | 77 | ||
67 | if (p.Length > 1 && p[1] == "data") | 78 | string id = string.Empty; |
79 | if (p.Length > 1) | ||
68 | { | 80 | { |
69 | result = m_AssetService.GetData(p[0]); | 81 | id = p[0]; |
70 | if (result == null) | 82 | string cmd = p[1]; |
83 | |||
84 | if (cmd == "data") | ||
71 | { | 85 | { |
72 | httpResponse.StatusCode = (int)HttpStatusCode.NotFound; | 86 | result = m_AssetService.GetData(id); |
73 | httpResponse.ContentType = "text/plain"; | 87 | if (result == null) |
74 | result = new byte[0]; | 88 | { |
89 | httpResponse.StatusCode = (int)HttpStatusCode.NotFound; | ||
90 | httpResponse.ContentType = "text/plain"; | ||
91 | result = new byte[0]; | ||
92 | } | ||
93 | else | ||
94 | { | ||
95 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | ||
96 | httpResponse.ContentType = "application/octet-stream"; | ||
97 | } | ||
75 | } | 98 | } |
76 | else | 99 | else if (cmd == "metadata") |
77 | { | 100 | { |
78 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | 101 | AssetMetadata metadata = m_AssetService.GetMetadata(id); |
79 | httpResponse.ContentType = "application/octet-stream"; | ||
80 | } | ||
81 | } | ||
82 | else if (p.Length > 1 && p[1] == "metadata") | ||
83 | { | ||
84 | AssetMetadata metadata = m_AssetService.GetMetadata(p[0]); | ||
85 | 102 | ||
86 | if (metadata != null) | 103 | if (metadata != null) |
87 | { | 104 | { |
88 | XmlSerializer xs = | 105 | XmlSerializer xs = |
89 | new XmlSerializer(typeof(AssetMetadata)); | 106 | new XmlSerializer(typeof(AssetMetadata)); |
90 | result = ServerUtils.SerializeResult(xs, metadata); | 107 | result = ServerUtils.SerializeResult(xs, metadata); |
91 | 108 | ||
92 | httpResponse.StatusCode = (int)HttpStatusCode.OK; | 109 | httpResponse.StatusCode = (int)HttpStatusCode.OK; |
93 | httpResponse.ContentType = | 110 | httpResponse.ContentType = |
94 | SLUtil.SLAssetTypeToContentType(metadata.Type); | 111 | SLUtil.SLAssetTypeToContentType(metadata.Type); |
112 | } | ||
113 | else | ||
114 | { | ||
115 | httpResponse.StatusCode = (int)HttpStatusCode.NotFound; | ||
116 | httpResponse.ContentType = "text/plain"; | ||
117 | result = new byte[0]; | ||
118 | } | ||
95 | } | 119 | } |
96 | else | 120 | else |
97 | { | 121 | { |
98 | httpResponse.StatusCode = (int)HttpStatusCode.NotFound; | 122 | // Unknown request |
123 | httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; | ||
99 | httpResponse.ContentType = "text/plain"; | 124 | httpResponse.ContentType = "text/plain"; |
100 | result = new byte[0]; | 125 | result = new byte[0]; |
101 | } | 126 | } |
102 | } | 127 | } |
103 | else | 128 | else if (p.Length == 1) |
104 | { | 129 | { |
105 | AssetBase asset = m_AssetService.Get(p[0]); | 130 | // Get the entire asset (metadata + data) |
131 | |||
132 | id = p[0]; | ||
133 | AssetBase asset = m_AssetService.Get(id); | ||
106 | 134 | ||
107 | if (asset != null) | 135 | if (asset != null) |
108 | { | 136 | { |
@@ -120,6 +148,24 @@ namespace OpenSim.Server.Handlers.Asset | |||
120 | result = new byte[0]; | 148 | result = new byte[0]; |
121 | } | 149 | } |
122 | } | 150 | } |
151 | else | ||
152 | { | ||
153 | // Unknown request | ||
154 | httpResponse.StatusCode = (int)HttpStatusCode.BadRequest; | ||
155 | httpResponse.ContentType = "text/plain"; | ||
156 | result = new byte[0]; | ||
157 | } | ||
158 | |||
159 | if (httpResponse.StatusCode == (int)HttpStatusCode.NotFound && !string.IsNullOrEmpty(m_RedirectURL) && !string.IsNullOrEmpty(id)) | ||
160 | { | ||
161 | httpResponse.StatusCode = (int)HttpStatusCode.Redirect; | ||
162 | string rurl = m_RedirectURL; | ||
163 | if (!path.StartsWith("/")) | ||
164 | rurl += "/"; | ||
165 | rurl += path; | ||
166 | httpResponse.AddHeader("Location", rurl); | ||
167 | m_log.DebugFormat("[ASSET GET HANDLER]: Asset not found, redirecting to {0} ({1})", rurl, httpResponse.StatusCode); | ||
168 | } | ||
123 | return result; | 169 | return result; |
124 | } | 170 | } |
125 | } | 171 | } |