From 6a2588454a1ac4bb484ad0b9ee648e9ac156f8db Mon Sep 17 00:00:00 2001
From: lbsa71
Date: Wed, 4 Jul 2007 14:12:32 +0000
Subject: * Removed AssetHttpServer, using BaseHttpServer instead * Removed
legacy REST handling * Created two custom IStreamHandlers for asset
up/download * Removed quite a lot of double and triple encodings, trying to
work towards binary only and direct write into storage. * Introduced
BaseStreamHandler with GetParam() and some other goodies
---
OpenSim/Grid/AssetServer/AssetHttpServer.cs | 125 ---------------
OpenSim/Grid/AssetServer/Main.cs | 169 +++++++++++++++------
.../AssetServer/OpenSim.Grid.AssetServer.csproj | 3 -
.../AssetServer/OpenSim.Grid.AssetServer.exe.build | 1 -
OpenSim/Grid/GridServer/Main.cs | 29 ++--
OpenSim/Grid/UserServer/Main.cs | 4 +-
6 files changed, 136 insertions(+), 195 deletions(-)
delete mode 100644 OpenSim/Grid/AssetServer/AssetHttpServer.cs
(limited to 'OpenSim/Grid')
diff --git a/OpenSim/Grid/AssetServer/AssetHttpServer.cs b/OpenSim/Grid/AssetServer/AssetHttpServer.cs
deleted file mode 100644
index 9546891..0000000
--- a/OpenSim/Grid/AssetServer/AssetHttpServer.cs
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
-* Copyright (c) Contributors, http://www.openmetaverse.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 OpenSim 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.IO;
-using System.Net;
-using System.Text;
-using System.Text.RegularExpressions;
-using OpenSim.Framework.Servers;
-
-namespace OpenSim.Grid.AssetServer
-{
- ///
- /// An HTTP server for sending assets
- ///
- public class AssetHttpServer :BaseHttpServer
- {
- ///
- /// Creates the new asset server
- ///
- /// Port to initalise on
- public AssetHttpServer(int port)
- : base(port)
- {
- }
-
- ///
- /// Handles an HTTP request
- ///
- /// HTTP State Info
- public override void HandleRequest(Object stateinfo)
- {
- try
- {
- HttpListenerContext context = (HttpListenerContext)stateinfo;
-
- HttpListenerRequest request = context.Request;
- HttpListenerResponse response = context.Response;
-
- response.KeepAlive = false;
- response.SendChunked = false;
-
- Stream body = request.InputStream;
- Encoding encoding = Encoding.UTF8;
- StreamReader reader = new StreamReader(body, encoding);
-
- string requestBody = reader.ReadToEnd();
- body.Close();
- reader.Close();
-
- //Console.WriteLine(request.HttpMethod + " " + request.RawUrl + " Http/" + request.ProtocolVersion.ToString() + " content type: " + request.ContentType);
- //Console.WriteLine(requestBody);
-
- string responseString = "";
- switch (request.ContentType)
- {
- case "text/xml":
- // must be XML-RPC, so pass to the XML-RPC parser
-
- responseString = ParseXMLRPC(requestBody);
- responseString = Regex.Replace(responseString, "utf-16", "utf-8");
-
- response.AddHeader("Content-type", "text/xml");
- break;
-
- case "application/xml":
- // probably LLSD we hope, otherwise it should be ignored by the parser
- responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
- response.AddHeader("Content-type", "application/xml");
- break;
-
- case "application/x-www-form-urlencoded":
- // a form data POST so send to the REST parser
- responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
- response.AddHeader("Content-type", "text/plain");
- break;
-
- case null:
- // must be REST or invalid crap, so pass to the REST parser
- responseString = ParseREST(requestBody, request.RawUrl, request.HttpMethod);
- response.AddHeader("Content-type", "text/plain");
- break;
-
- }
-
- Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
- byte[] buffer = Windows1252Encoding.GetBytes(responseString);
- Stream output = response.OutputStream;
- response.SendChunked = false;
- response.ContentLength64 = buffer.Length;
- output.Write(buffer, 0, buffer.Length);
- output.Close();
- }
- catch (Exception e)
- {
- Console.WriteLine(e.ToString());
- }
- }
-
- }
-}
diff --git a/OpenSim/Grid/AssetServer/Main.cs b/OpenSim/Grid/AssetServer/Main.cs
index 112d72f..3e302d8 100644
--- a/OpenSim/Grid/AssetServer/Main.cs
+++ b/OpenSim/Grid/AssetServer/Main.cs
@@ -33,13 +33,14 @@ using Db4objects.Db4o;
using libsecondlife;
using OpenSim.Framework.Console;
using OpenSim.Framework.Types;
+using OpenSim.Framework.Servers;
namespace OpenSim.Grid.AssetServer
{
///
/// An asset server
///
- public class OpenAsset_Main : conscmd_callback
+ public class OpenAsset_Main : conscmd_callback
{
private IObjectContainer db;
@@ -76,58 +77,60 @@ namespace OpenSim.Grid.AssetServer
public void Startup()
{
- m_console.Verbose( "Main.cs:Startup() - Setting up asset DB");
+ m_console.Verbose("Main.cs:Startup() - Setting up asset DB");
setupDB();
- m_console.Verbose( "Main.cs:Startup() - Starting HTTP process");
- AssetHttpServer httpServer = new AssetHttpServer(8003);
+ m_console.Verbose("Main.cs:Startup() - Starting HTTP process");
+ BaseHttpServer httpServer = new BaseHttpServer(8003);
+ httpServer.AddStreamHandler( new GetAssetStreamHandler(this));
+ httpServer.AddStreamHandler(new PostAssetStreamHandler( this ));
- httpServer.AddRestHandler("GET", "/assets/", this.assetGetMethod);
- httpServer.AddRestHandler("POST", "/assets/", this.assetPostMethod);
+ //httpServer.AddRestHandler("GET", "/assets/", this.assetGetMethod);
+ //httpServer.AddRestHandler("POST", "/assets/", this.assetPostMethod);
httpServer.Start();
}
- public string assetPostMethod(string requestBody, string path, string param)
- {
- AssetBase asset = new AssetBase();
- asset.Name = "";
- asset.FullID = new LLUUID(param);
- Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
- byte[] buffer = Windows1252Encoding.GetBytes(requestBody);
- asset.Data = buffer;
- AssetStorage store = new AssetStorage();
- store.Data = asset.Data;
- store.Name = asset.Name;
- store.UUID = asset.FullID;
- db.Set(store);
- db.Commit();
- return "";
- }
-
- public string assetGetMethod(string request, string path, string param)
- {
- Console.WriteLine("got a request " + param);
- byte[] assetdata = getAssetData(new LLUUID(param), false);
- if (assetdata != null)
- {
- Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
- string ret = Windows1252Encoding.GetString(assetdata);
- //string ret = System.Text.Encoding.Unicode.GetString(assetdata);
-
- return ret;
-
- }
- else
- {
- return "";
- }
-
- }
-
- public byte[] getAssetData(LLUUID assetID, bool isTexture)
+ //public string AssetPostMethod(string requestBody, string path, string param)
+ //{
+ // AssetBase asset = new AssetBase();
+ // asset.Name = "";
+ // asset.FullID = new LLUUID(param);
+ // Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
+ // byte[] buffer = Windows1252Encoding.GetBytes(requestBody);
+ // asset.Data = buffer;
+ // AssetStorage store = new AssetStorage();
+ // store.Data = asset.Data;
+ // store.Name = asset.Name;
+ // store.UUID = asset.FullID;
+ // db.Set(store);
+ // db.Commit();
+ // return "";
+ //}
+
+ //public string AssetGetMethod(string request, string path, string param)
+ //{
+ // Console.WriteLine("got a request " + param);
+ // byte[] assetdata = GetAssetData(new LLUUID(param), false);
+ // if (assetdata != null)
+ // {
+ // Encoding Windows1252Encoding = Encoding.GetEncoding(1252);
+ // string ret = Windows1252Encoding.GetString(assetdata);
+ // //string ret = System.Text.Encoding.Unicode.GetString(assetdata);
+
+ // return ret;
+
+ // }
+ // else
+ // {
+ // return "";
+ // }
+
+ //}
+
+ public byte[] GetAssetData(LLUUID assetID, bool isTexture)
{
bool found = false;
AssetStorage foundAsset = null;
@@ -155,7 +158,7 @@ namespace OpenSim.Grid.AssetServer
try
{
db = Db4oFactory.OpenFile("assets.yap");
- MainLog.Instance.Verbose( "Main.cs:setupDB() - creation");
+ MainLog.Instance.Verbose("Main.cs:setupDB() - creation");
}
catch (Exception e)
{
@@ -305,6 +308,21 @@ namespace OpenSim.Grid.AssetServer
return config;
}*/
+ public void CreateAsset(LLUUID assetId, byte[] assetData)
+ {
+ AssetBase asset = new AssetBase();
+ asset.Name = "";
+ asset.FullID = assetId;
+ asset.Data = assetData;
+
+ AssetStorage store = new AssetStorage();
+ store.Data = asset.Data;
+ store.Name = asset.Name;
+ store.UUID = asset.FullID;
+ db.Set(store);
+ db.Commit();
+ }
+
public void RunCmd(string cmd, string[] cmdparams)
{
switch (cmd)
@@ -324,4 +342,65 @@ namespace OpenSim.Grid.AssetServer
{
}
}
+
+ public class GetAssetStreamHandler : BaseStreamHandler
+ {
+ OpenAsset_Main m_assetManager;
+
+ override public byte[] Handle(string path, Stream request)
+ {
+ string param = GetParam(path);
+
+ byte[] assetdata = m_assetManager.GetAssetData(new LLUUID(param), false);
+ if (assetdata != null)
+ {
+ return assetdata;
+ }
+ else
+ {
+ return new byte[]{};
+ }
+ }
+
+ public GetAssetStreamHandler(OpenAsset_Main assetManager):base( "/assets/", "GET")
+ {
+ m_assetManager = assetManager;
+ }
+ }
+
+ public class PostAssetStreamHandler : BaseStreamHandler
+ {
+ OpenAsset_Main m_assetManager;
+
+ override public byte[] Handle(string path, Stream request)
+ {
+ string param = GetParam(path);
+ LLUUID assetId = new LLUUID(param);
+ byte[] txBuffer = new byte[4096];
+
+ using( BinaryReader binReader = new BinaryReader( request ) )
+ {
+ using (MemoryStream memoryStream = new MemoryStream(4096))
+ {
+ int count;
+ while ((count = binReader.Read(txBuffer, 0, 4096)) > 0)
+ {
+ memoryStream.Write(txBuffer, 0, count);
+ }
+
+ byte[] assetData = memoryStream.ToArray();
+
+ m_assetManager.CreateAsset(assetId, assetData);
+ }
+ }
+
+ return new byte[]{};
+ }
+
+ public PostAssetStreamHandler( OpenAsset_Main assetManager )
+ : base("/assets/", "POST")
+ {
+ m_assetManager = assetManager;
+ }
+ }
}
diff --git a/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj
index caebca3..5ba4642 100644
--- a/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj
+++ b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.csproj
@@ -98,9 +98,6 @@
-
- Code
-
Code
diff --git a/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.exe.build b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.exe.build
index 88724f6..a922fe7 100644
--- a/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.exe.build
+++ b/OpenSim/Grid/AssetServer/OpenSim.Grid.AssetServer.exe.build
@@ -11,7 +11,6 @@
-
diff --git a/OpenSim/Grid/GridServer/Main.cs b/OpenSim/Grid/GridServer/Main.cs
index 2e76cee..a990ff7 100644
--- a/OpenSim/Grid/GridServer/Main.cs
+++ b/OpenSim/Grid/GridServer/Main.cs
@@ -127,25 +127,16 @@ namespace OpenSim.Grid.GridServer
httpServer.AddXmlRPCHandler("simulator_login", m_gridManager.XmlRpcSimulatorLoginMethod);
httpServer.AddXmlRPCHandler("map_block", m_gridManager.XmlRpcMapBlockMethod);
- httpServer.AddRestHandler("GET", "/sims/", m_gridManager.RestGetSimMethod);
- httpServer.AddRestHandler("POST", "/sims/", m_gridManager.RestSetSimMethod);
- httpServer.AddRestHandler("GET", "/regions/", m_gridManager.RestGetRegionMethod);
- httpServer.AddRestHandler("POST", "/regions/", m_gridManager.RestSetRegionMethod);
-
-
- // lbsa71 : This code snippet taken from old http server.
- // I have no idea what this was supposed to do - looks like an infinite recursion to me.
- // case "regions":
- //// DIRTY HACK ALERT
- //Console.Notice("/regions/ accessed");
- //TheSim = OpenGrid_Main.thegrid._regionmanager.GetProfileByHandle((ulong)Convert.ToUInt64(rest_params[1]));
- //respstring = ParseREST("/regions/" + rest_params[1], requestBody, HTTPmethod);
- //break;
-
- // lbsa71 : I guess these were never used?
- //Listener.Prefixes.Add("http://+:8001/gods/");
- //Listener.Prefixes.Add("http://+:8001/highestuuid/");
- //Listener.Prefixes.Add("http://+:8001/uuidblocks/");
+ httpServer.AddStreamHandler(new RestStreamHandler("GET", "/sims/", m_gridManager.RestGetSimMethod ));
+ httpServer.AddStreamHandler(new RestStreamHandler("POST", "/sims/", m_gridManager.RestSetSimMethod ));
+
+ httpServer.AddStreamHandler( new RestStreamHandler("GET", "/regions/", m_gridManager.RestGetRegionMethod ));
+ httpServer.AddStreamHandler( new RestStreamHandler("POST","/regions/", m_gridManager.RestSetRegionMethod ));
+
+ //httpServer.AddRestHandler("GET", "/sims/", m_gridManager.RestGetSimMethod);
+ //httpServer.AddRestHandler("POST", "/sims/", m_gridManager.RestSetSimMethod);
+ //httpServer.AddRestHandler("GET", "/regions/", m_gridManager.RestGetRegionMethod);
+ //httpServer.AddRestHandler("POST", "/regions/", m_gridManager.RestSetRegionMethod);
httpServer.Start();
diff --git a/OpenSim/Grid/UserServer/Main.cs b/OpenSim/Grid/UserServer/Main.cs
index 5560e7d..30465a3 100644
--- a/OpenSim/Grid/UserServer/Main.cs
+++ b/OpenSim/Grid/UserServer/Main.cs
@@ -105,8 +105,8 @@ namespace OpenSim.Grid.UserServer
httpServer.AddXmlRPCHandler("get_user_by_name", m_userManager.XmlRPCGetUserMethodName);
httpServer.AddXmlRPCHandler("get_user_by_uuid", m_userManager.XmlRPCGetUserMethodUUID);
- httpServer.AddRestHandler("DELETE", "/usersessions/", m_userManager.RestDeleteUserSessionMethod);
-
+ httpServer.AddStreamHandler( new RestStreamHandler("DELETE", "/usersessions/", m_userManager.RestDeleteUserSessionMethod ));
+
httpServer.Start();
m_console.Status("Userserver 0.3 - Startup complete");
}
--
cgit v1.1