Also compress the actual fatpacks
							parent
							
								
									e345f03895
								
							
						
					
					
						commit
						c8b9558039
					
				| 
						 | 
				
			
			@ -141,6 +141,11 @@ namespace OpenSim.Framework
 | 
			
		|||
        /// PUT JSON-encoded data to a web service that returns LLSD or
 | 
			
		||||
        /// JSON data
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public static OSDMap PutToServiceCompressed(string url, OSDMap data, int timeout)
 | 
			
		||||
        {
 | 
			
		||||
            return ServiceOSDRequest(url,data, "PUT", timeout, true);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static OSDMap PutToService(string url, OSDMap data, int timeout)
 | 
			
		||||
        {
 | 
			
		||||
            return ServiceOSDRequest(url,data, "PUT", timeout, false);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -90,12 +90,7 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
 | 
			
		||||
            // Next, let's parse the verb
 | 
			
		||||
            string method = (string)request["http-method"];
 | 
			
		||||
            if (method.Equals("PUT"))
 | 
			
		||||
            {
 | 
			
		||||
                DoAgentPut(request, responsedata);
 | 
			
		||||
                return responsedata;
 | 
			
		||||
            }
 | 
			
		||||
            else if (method.Equals("GET"))
 | 
			
		||||
            if (method.Equals("GET"))
 | 
			
		||||
            {
 | 
			
		||||
                DoAgentGet(request, responsedata, agentID, regionID);
 | 
			
		||||
                return responsedata;
 | 
			
		||||
| 
						 | 
				
			
			@ -121,94 +116,6 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void DoAgentPut(Hashtable request, Hashtable responsedata)
 | 
			
		||||
        {
 | 
			
		||||
            OSDMap args = Utils.GetOSDMap((string)request["body"]);
 | 
			
		||||
            if (args == null)
 | 
			
		||||
            {
 | 
			
		||||
                responsedata["int_response_code"] = HttpStatusCode.BadRequest;
 | 
			
		||||
                responsedata["str_response_string"] = "Bad request";
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // retrieve the input arguments
 | 
			
		||||
            int x = 0, y = 0;
 | 
			
		||||
            UUID uuid = UUID.Zero;
 | 
			
		||||
            string regionname = string.Empty;
 | 
			
		||||
            if (args.ContainsKey("destination_x") && args["destination_x"] != null)
 | 
			
		||||
                Int32.TryParse(args["destination_x"].AsString(), out x);
 | 
			
		||||
            if (args.ContainsKey("destination_y") && args["destination_y"] != null)
 | 
			
		||||
                Int32.TryParse(args["destination_y"].AsString(), out y);
 | 
			
		||||
            if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
 | 
			
		||||
                UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
 | 
			
		||||
            if (args.ContainsKey("destination_name") && args["destination_name"] != null)
 | 
			
		||||
                regionname = args["destination_name"].ToString();
 | 
			
		||||
 | 
			
		||||
            GridRegion destination = new GridRegion();
 | 
			
		||||
            destination.RegionID = uuid;
 | 
			
		||||
            destination.RegionLocX = x;
 | 
			
		||||
            destination.RegionLocY = y;
 | 
			
		||||
            destination.RegionName = regionname;
 | 
			
		||||
 | 
			
		||||
            string messageType;
 | 
			
		||||
            if (args["message_type"] != null)
 | 
			
		||||
                messageType = args["message_type"].AsString();
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.Warn("[AGENT HANDLER]: Agent Put Message Type not found. ");
 | 
			
		||||
                messageType = "AgentData";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            bool result = true;
 | 
			
		||||
            if ("AgentData".Equals(messageType))
 | 
			
		||||
            {
 | 
			
		||||
                AgentData agent = new AgentData();
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle));
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message);
 | 
			
		||||
                    responsedata["int_response_code"] = HttpStatusCode.BadRequest;
 | 
			
		||||
                    responsedata["str_response_string"] = "Bad request";
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                //agent.Dump();
 | 
			
		||||
                // This is one of the meanings of PUT agent
 | 
			
		||||
                result = UpdateAgent(destination, agent);
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            else if ("AgentPosition".Equals(messageType))
 | 
			
		||||
            {
 | 
			
		||||
                AgentPosition agent = new AgentPosition();
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle));
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                //agent.Dump();
 | 
			
		||||
                // This is one of the meanings of PUT agent
 | 
			
		||||
                result = m_SimulationService.UpdateAgent(destination, agent);
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            responsedata["int_response_code"] = HttpStatusCode.OK;
 | 
			
		||||
            responsedata["str_response_string"] = result.ToString();
 | 
			
		||||
            //responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // subclasses can override this
 | 
			
		||||
        protected virtual bool UpdateAgent(GridRegion destination, AgentData agent)
 | 
			
		||||
        {
 | 
			
		||||
            return m_SimulationService.UpdateAgent(destination, agent);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID id, UUID regionID)
 | 
			
		||||
        {
 | 
			
		||||
            if (m_SimulationService == null)
 | 
			
		||||
| 
						 | 
				
			
			@ -508,4 +415,173 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
            return m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public class AgentPutHandler : BaseStreamHandler
 | 
			
		||||
    {
 | 
			
		||||
        private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 | 
			
		||||
 | 
			
		||||
        private ISimulationService m_SimulationService;
 | 
			
		||||
        protected bool m_Proxy = false;
 | 
			
		||||
 | 
			
		||||
        public AgentPutHandler(ISimulationService service) :
 | 
			
		||||
                base("PUT", "/agent")
 | 
			
		||||
        {
 | 
			
		||||
            m_SimulationService = service;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public AgentPutHandler(string path) :
 | 
			
		||||
                base("PUT", path)
 | 
			
		||||
        {
 | 
			
		||||
            m_SimulationService = null;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public override byte[] Handle(string path, Stream request,
 | 
			
		||||
                OSHttpRequest httpRequest, OSHttpResponse httpResponse)
 | 
			
		||||
        {
 | 
			
		||||
            m_log.DebugFormat("[SIMULATION]: Stream handler called");
 | 
			
		||||
 | 
			
		||||
            Hashtable keysvals = new Hashtable();
 | 
			
		||||
            Hashtable headervals = new Hashtable();
 | 
			
		||||
 | 
			
		||||
            string[] querystringkeys = httpRequest.QueryString.AllKeys;
 | 
			
		||||
            string[] rHeaders = httpRequest.Headers.AllKeys;
 | 
			
		||||
 | 
			
		||||
            keysvals.Add("uri", httpRequest.RawUrl);
 | 
			
		||||
            keysvals.Add("content-type", httpRequest.ContentType);
 | 
			
		||||
            keysvals.Add("http-method", httpRequest.HttpMethod);
 | 
			
		||||
 | 
			
		||||
            foreach (string queryname in querystringkeys)
 | 
			
		||||
                keysvals.Add(queryname, httpRequest.QueryString[queryname]);
 | 
			
		||||
 | 
			
		||||
            foreach (string headername in rHeaders)
 | 
			
		||||
                headervals[headername] = httpRequest.Headers[headername];
 | 
			
		||||
 | 
			
		||||
            keysvals.Add("headers", headervals);
 | 
			
		||||
            keysvals.Add("querystringkeys", querystringkeys);
 | 
			
		||||
 | 
			
		||||
            Stream inputStream;
 | 
			
		||||
            if (httpRequest.ContentType == "application/x-gzip")
 | 
			
		||||
                inputStream = new GZipStream(request, CompressionMode.Decompress);
 | 
			
		||||
            else
 | 
			
		||||
                inputStream = request;
 | 
			
		||||
 | 
			
		||||
            Encoding encoding = Encoding.UTF8;
 | 
			
		||||
            StreamReader reader = new StreamReader(inputStream, encoding);
 | 
			
		||||
 | 
			
		||||
            string requestBody = reader.ReadToEnd();
 | 
			
		||||
            keysvals.Add("body", requestBody);
 | 
			
		||||
 | 
			
		||||
            httpResponse.StatusCode = 200;
 | 
			
		||||
            httpResponse.ContentType = "text/html";
 | 
			
		||||
            httpResponse.KeepAlive = false;
 | 
			
		||||
 | 
			
		||||
            Hashtable responsedata = new Hashtable();
 | 
			
		||||
 | 
			
		||||
            UUID agentID;
 | 
			
		||||
            UUID regionID;
 | 
			
		||||
            string action;
 | 
			
		||||
 | 
			
		||||
            if (!Utils.GetParams((string)keysvals["uri"], out agentID, out regionID, out action))
 | 
			
		||||
            {
 | 
			
		||||
                m_log.InfoFormat("[AGENT HANDLER]: Invalid parameters for agent message {0}", keysvals["uri"]);
 | 
			
		||||
 | 
			
		||||
                httpResponse.StatusCode = 404;
 | 
			
		||||
 | 
			
		||||
                return encoding.GetBytes("false");
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            DoAgentPut(keysvals, responsedata);
 | 
			
		||||
 | 
			
		||||
            httpResponse.StatusCode = (int)responsedata["int_response_code"];
 | 
			
		||||
            return encoding.GetBytes((string)responsedata["str_response_string"]);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected void DoAgentPut(Hashtable request, Hashtable responsedata)
 | 
			
		||||
        {
 | 
			
		||||
            OSDMap args = Utils.GetOSDMap((string)request["body"]);
 | 
			
		||||
            if (args == null)
 | 
			
		||||
            {
 | 
			
		||||
                responsedata["int_response_code"] = HttpStatusCode.BadRequest;
 | 
			
		||||
                responsedata["str_response_string"] = "Bad request";
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // retrieve the input arguments
 | 
			
		||||
            int x = 0, y = 0;
 | 
			
		||||
            UUID uuid = UUID.Zero;
 | 
			
		||||
            string regionname = string.Empty;
 | 
			
		||||
            if (args.ContainsKey("destination_x") && args["destination_x"] != null)
 | 
			
		||||
                Int32.TryParse(args["destination_x"].AsString(), out x);
 | 
			
		||||
            if (args.ContainsKey("destination_y") && args["destination_y"] != null)
 | 
			
		||||
                Int32.TryParse(args["destination_y"].AsString(), out y);
 | 
			
		||||
            if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null)
 | 
			
		||||
                UUID.TryParse(args["destination_uuid"].AsString(), out uuid);
 | 
			
		||||
            if (args.ContainsKey("destination_name") && args["destination_name"] != null)
 | 
			
		||||
                regionname = args["destination_name"].ToString();
 | 
			
		||||
 | 
			
		||||
            GridRegion destination = new GridRegion();
 | 
			
		||||
            destination.RegionID = uuid;
 | 
			
		||||
            destination.RegionLocX = x;
 | 
			
		||||
            destination.RegionLocY = y;
 | 
			
		||||
            destination.RegionName = regionname;
 | 
			
		||||
 | 
			
		||||
            string messageType;
 | 
			
		||||
            if (args["message_type"] != null)
 | 
			
		||||
                messageType = args["message_type"].AsString();
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                m_log.Warn("[AGENT HANDLER]: Agent Put Message Type not found. ");
 | 
			
		||||
                messageType = "AgentData";
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            bool result = true;
 | 
			
		||||
            if ("AgentData".Equals(messageType))
 | 
			
		||||
            {
 | 
			
		||||
                AgentData agent = new AgentData();
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle));
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message);
 | 
			
		||||
                    responsedata["int_response_code"] = HttpStatusCode.BadRequest;
 | 
			
		||||
                    responsedata["str_response_string"] = "Bad request";
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                //agent.Dump();
 | 
			
		||||
                // This is one of the meanings of PUT agent
 | 
			
		||||
                result = UpdateAgent(destination, agent);
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
            else if ("AgentPosition".Equals(messageType))
 | 
			
		||||
            {
 | 
			
		||||
                AgentPosition agent = new AgentPosition();
 | 
			
		||||
                try
 | 
			
		||||
                {
 | 
			
		||||
                    agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle));
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception ex)
 | 
			
		||||
                {
 | 
			
		||||
                    m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
                //agent.Dump();
 | 
			
		||||
                // This is one of the meanings of PUT agent
 | 
			
		||||
                result = m_SimulationService.UpdateAgent(destination, agent);
 | 
			
		||||
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            responsedata["int_response_code"] = HttpStatusCode.OK;
 | 
			
		||||
            responsedata["str_response_string"] = result.ToString();
 | 
			
		||||
            //responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // subclasses can override this
 | 
			
		||||
        protected virtual bool UpdateAgent(GridRegion destination, AgentData agent)
 | 
			
		||||
        {
 | 
			
		||||
            return m_SimulationService.UpdateAgent(destination, agent);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,7 @@ namespace OpenSim.Server.Handlers.Simulation
 | 
			
		|||
            // are pure binary and shoehorning that into a string with UTF-8
 | 
			
		||||
            // encoding breaks it
 | 
			
		||||
            server.AddStreamHandler(new AgentPostHandler(m_LocalSimulationService));
 | 
			
		||||
            server.AddStreamHandler(new AgentPutHandler(m_LocalSimulationService));
 | 
			
		||||
            server.AddHTTPHandler("/agent/", new AgentHandler(m_LocalSimulationService).Handler);
 | 
			
		||||
            server.AddHTTPHandler("/object/", new ObjectHandler(m_LocalSimulationService).Handler);
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -216,7 +216,12 @@ namespace OpenSim.Services.Connectors.Simulation
 | 
			
		|||
                args["destination_name"] = OSD.FromString(destination.RegionName);
 | 
			
		||||
                args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString());
 | 
			
		||||
 | 
			
		||||
                OSDMap result = WebUtil.PutToService(uri, args, timeout);
 | 
			
		||||
                OSDMap result = WebUtil.PutToServiceCompressed(uri, args, timeout);
 | 
			
		||||
                if (result["Success"].AsBoolean())
 | 
			
		||||
                    return true;
 | 
			
		||||
 | 
			
		||||
                result = WebUtil.PutToService(uri, args, timeout);
 | 
			
		||||
 | 
			
		||||
                return result["Success"].AsBoolean();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue