| 34 |
using System.Xml; |
using System.Xml; |
| 35 |
using ExtensionLoader; |
using ExtensionLoader; |
| 36 |
using OpenMetaverse; |
using OpenMetaverse; |
| 37 |
|
using HttpServer; |
| 38 |
|
|
| 39 |
namespace AssetServer.Extensions |
namespace AssetServer.Extensions |
| 40 |
{ |
{ |
| 51 |
this.server = server; |
this.server = server; |
| 52 |
|
|
| 53 |
// Asset request |
// Asset request |
| 54 |
server.HttpServer.AddHandler("get", null, @"^/assets/", |
server.HttpServer.AddHandler("get", null, @"^/assets/", AssetRequestHandler); |
|
AssetRequestHandler); |
|
| 55 |
|
|
| 56 |
// Asset creation |
// Asset creation |
| 57 |
server.HttpServer.AddHandler("post", null, @"^/assets/", |
server.HttpServer.AddHandler("post", null, @"^/assets/", AssetPostHandler); |
|
AssetPostHandler); |
|
| 58 |
} |
} |
| 59 |
|
|
| 60 |
public void Stop() |
public void Stop() |
| 61 |
{ |
{ |
| 62 |
} |
} |
| 63 |
|
|
| 64 |
void AssetRequestHandler(ref HttpListenerContext context) |
bool AssetRequestHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 65 |
{ |
{ |
| 66 |
UUID assetID; |
UUID assetID; |
| 67 |
// Split the URL up to get the asset ID out |
// Split the URL up to get the asset ID out |
| 68 |
string[] rawUrl = context.Request.RawUrl.Split('/'); |
string[] rawUrl = request.Uri.PathAndQuery.Split('/'); |
| 69 |
|
|
| 70 |
if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out assetID)) |
if (rawUrl.Length >= 3 && rawUrl[2].Length >= 36 && UUID.TryParse(rawUrl[2].Substring(0, 36), out assetID)) |
| 71 |
{ |
{ |
| 119 |
writer.Flush(); |
writer.Flush(); |
| 120 |
byte[] buffer = stream.GetBuffer(); |
byte[] buffer = stream.GetBuffer(); |
| 121 |
|
|
| 122 |
context.Response.StatusCode = (int)HttpStatusCode.OK; |
response.Status = HttpStatusCode.OK; |
| 123 |
context.Response.ContentType = "application/xml"; |
response.ContentType = "application/xml"; |
| 124 |
context.Response.ContentLength64 = (int)stream.Length; |
response.ContentLength = stream.Length; |
| 125 |
context.Response.OutputStream.Write(buffer, 0, (int)stream.Length); |
response.Body.Write(buffer, 0, (int)stream.Length); |
| 126 |
|
response.Body.Flush(); |
| 127 |
|
|
| 128 |
return; |
return true; |
| 129 |
} |
} |
| 130 |
else |
else |
| 131 |
{ |
{ |
| 138 |
} |
} |
| 139 |
} |
} |
| 140 |
|
|
| 141 |
context.Response.StatusCode = (int)HttpStatusCode.NotFound; |
response.Status = HttpStatusCode.NotFound; |
| 142 |
|
return true; |
| 143 |
} |
} |
| 144 |
|
|
| 145 |
void AssetPostHandler(ref HttpListenerContext context) |
bool AssetPostHandler(IHttpClientContext client, IHttpRequest request, IHttpResponse response) |
| 146 |
{ |
{ |
| 147 |
byte[] assetData = null; |
byte[] assetData = null; |
| 148 |
Metadata metadata = new Metadata(); |
Metadata metadata = new Metadata(); |
| 149 |
|
|
| 150 |
try |
try |
| 151 |
{ |
{ |
| 152 |
using (XmlReader reader = XmlReader.Create(context.Request.InputStream)) |
using (XmlReader reader = XmlReader.Create(request.Body)) |
| 153 |
{ |
{ |
| 154 |
reader.MoveToContent(); |
reader.MoveToContent(); |
| 155 |
reader.ReadStartElement("AssetBase"); |
reader.ReadStartElement("AssetBase"); |
| 187 |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(assetData); |
metadata.SHA1 = OpenMetaverse.Utils.SHA1(assetData); |
| 188 |
metadata.CreationDate = DateTime.Now; |
metadata.CreationDate = DateTime.Now; |
| 189 |
|
|
| 190 |
StorageResponse response = server.StorageProvider.TryCreateAsset(metadata, assetData, UUID.Zero); |
StorageResponse storageResponse = server.StorageProvider.TryCreateAsset(metadata, assetData, UUID.Zero); |
| 191 |
|
|
| 192 |
switch (response) |
switch (storageResponse) |
| 193 |
{ |
{ |
| 194 |
case StorageResponse.Success: |
case StorageResponse.Success: |
| 195 |
context.Response.StatusCode = (int)HttpStatusCode.Created; |
response.Status = HttpStatusCode.Created; |
| 196 |
break; |
break; |
| 197 |
case StorageResponse.NotFound: |
case StorageResponse.NotFound: |
| 198 |
context.Response.StatusCode = (int)HttpStatusCode.NotFound; |
response.Status = HttpStatusCode.NotFound; |
| 199 |
break; |
break; |
| 200 |
case StorageResponse.AuthNeeded: |
case StorageResponse.AuthNeeded: |
| 201 |
context.Response.StatusCode = (int)HttpStatusCode.Forbidden; |
response.Status = HttpStatusCode.Forbidden; |
| 202 |
break; |
break; |
| 203 |
case StorageResponse.Failure: |
case StorageResponse.Failure: |
| 204 |
default: |
default: |
| 205 |
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError; |
response.Status = HttpStatusCode.InternalServerError; |
| 206 |
break; |
break; |
| 207 |
} |
} |
| 208 |
} |
} |
| 209 |
else |
else |
| 210 |
{ |
{ |
| 211 |
Logger.Log.Warn("AssetPostHandler called with no asset data"); |
Logger.Log.Warn("AssetPostHandler called with no asset data"); |
| 212 |
context.Response.StatusCode = (int)HttpStatusCode.BadRequest; |
response.Status = HttpStatusCode.BadRequest; |
| 213 |
} |
} |
| 214 |
} |
} |
| 215 |
catch (Exception ex) |
catch (Exception ex) |
| 216 |
{ |
{ |
| 217 |
Logger.Log.Warn("Failed to parse POST data (expecting AssetBase): " + ex.Message); |
Logger.Log.Warn("Failed to parse POST data (expecting AssetBase): " + ex.Message); |
| 218 |
context.Response.StatusCode = (int)HttpStatusCode.BadRequest; |
response.Status = HttpStatusCode.BadRequest; |
| 219 |
} |
} |
| 220 |
|
|
| 221 |
|
return true; |
| 222 |
} |
} |
| 223 |
} |
} |
| 224 |
} |
} |