diff options
4 files changed, 182 insertions, 95 deletions
diff --git a/OpenSim/Framework/WebUtil.cs b/OpenSim/Framework/WebUtil.cs index 6b8c3c0..55b38cd 100644 --- a/OpenSim/Framework/WebUtil.cs +++ b/OpenSim/Framework/WebUtil.cs | |||
@@ -141,6 +141,11 @@ namespace OpenSim.Framework | |||
141 | /// PUT JSON-encoded data to a web service that returns LLSD or | 141 | /// PUT JSON-encoded data to a web service that returns LLSD or |
142 | /// JSON data | 142 | /// JSON data |
143 | /// </summary> | 143 | /// </summary> |
144 | public static OSDMap PutToServiceCompressed(string url, OSDMap data, int timeout) | ||
145 | { | ||
146 | return ServiceOSDRequest(url,data, "PUT", timeout, true); | ||
147 | } | ||
148 | |||
144 | public static OSDMap PutToService(string url, OSDMap data, int timeout) | 149 | public static OSDMap PutToService(string url, OSDMap data, int timeout) |
145 | { | 150 | { |
146 | return ServiceOSDRequest(url,data, "PUT", timeout, false); | 151 | return ServiceOSDRequest(url,data, "PUT", timeout, false); |
diff --git a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs index 21b26df..379924f 100644 --- a/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs +++ b/OpenSim/Server/Handlers/Simulation/AgentHandlers.cs | |||
@@ -90,12 +90,7 @@ namespace OpenSim.Server.Handlers.Simulation | |||
90 | 90 | ||
91 | // Next, let's parse the verb | 91 | // Next, let's parse the verb |
92 | string method = (string)request["http-method"]; | 92 | string method = (string)request["http-method"]; |
93 | if (method.Equals("PUT")) | 93 | if (method.Equals("GET")) |
94 | { | ||
95 | DoAgentPut(request, responsedata); | ||
96 | return responsedata; | ||
97 | } | ||
98 | else if (method.Equals("GET")) | ||
99 | { | 94 | { |
100 | DoAgentGet(request, responsedata, agentID, regionID); | 95 | DoAgentGet(request, responsedata, agentID, regionID); |
101 | return responsedata; | 96 | return responsedata; |
@@ -121,94 +116,6 @@ namespace OpenSim.Server.Handlers.Simulation | |||
121 | 116 | ||
122 | } | 117 | } |
123 | 118 | ||
124 | protected void DoAgentPut(Hashtable request, Hashtable responsedata) | ||
125 | { | ||
126 | OSDMap args = Utils.GetOSDMap((string)request["body"]); | ||
127 | if (args == null) | ||
128 | { | ||
129 | responsedata["int_response_code"] = HttpStatusCode.BadRequest; | ||
130 | responsedata["str_response_string"] = "Bad request"; | ||
131 | return; | ||
132 | } | ||
133 | |||
134 | // retrieve the input arguments | ||
135 | int x = 0, y = 0; | ||
136 | UUID uuid = UUID.Zero; | ||
137 | string regionname = string.Empty; | ||
138 | if (args.ContainsKey("destination_x") && args["destination_x"] != null) | ||
139 | Int32.TryParse(args["destination_x"].AsString(), out x); | ||
140 | if (args.ContainsKey("destination_y") && args["destination_y"] != null) | ||
141 | Int32.TryParse(args["destination_y"].AsString(), out y); | ||
142 | if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) | ||
143 | UUID.TryParse(args["destination_uuid"].AsString(), out uuid); | ||
144 | if (args.ContainsKey("destination_name") && args["destination_name"] != null) | ||
145 | regionname = args["destination_name"].ToString(); | ||
146 | |||
147 | GridRegion destination = new GridRegion(); | ||
148 | destination.RegionID = uuid; | ||
149 | destination.RegionLocX = x; | ||
150 | destination.RegionLocY = y; | ||
151 | destination.RegionName = regionname; | ||
152 | |||
153 | string messageType; | ||
154 | if (args["message_type"] != null) | ||
155 | messageType = args["message_type"].AsString(); | ||
156 | else | ||
157 | { | ||
158 | m_log.Warn("[AGENT HANDLER]: Agent Put Message Type not found. "); | ||
159 | messageType = "AgentData"; | ||
160 | } | ||
161 | |||
162 | bool result = true; | ||
163 | if ("AgentData".Equals(messageType)) | ||
164 | { | ||
165 | AgentData agent = new AgentData(); | ||
166 | try | ||
167 | { | ||
168 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); | ||
169 | } | ||
170 | catch (Exception ex) | ||
171 | { | ||
172 | m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message); | ||
173 | responsedata["int_response_code"] = HttpStatusCode.BadRequest; | ||
174 | responsedata["str_response_string"] = "Bad request"; | ||
175 | return; | ||
176 | } | ||
177 | |||
178 | //agent.Dump(); | ||
179 | // This is one of the meanings of PUT agent | ||
180 | result = UpdateAgent(destination, agent); | ||
181 | |||
182 | } | ||
183 | else if ("AgentPosition".Equals(messageType)) | ||
184 | { | ||
185 | AgentPosition agent = new AgentPosition(); | ||
186 | try | ||
187 | { | ||
188 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); | ||
189 | } | ||
190 | catch (Exception ex) | ||
191 | { | ||
192 | m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message); | ||
193 | return; | ||
194 | } | ||
195 | //agent.Dump(); | ||
196 | // This is one of the meanings of PUT agent | ||
197 | result = m_SimulationService.UpdateAgent(destination, agent); | ||
198 | |||
199 | } | ||
200 | |||
201 | responsedata["int_response_code"] = HttpStatusCode.OK; | ||
202 | responsedata["str_response_string"] = result.ToString(); | ||
203 | //responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead | ||
204 | } | ||
205 | |||
206 | // subclasses can override this | ||
207 | protected virtual bool UpdateAgent(GridRegion destination, AgentData agent) | ||
208 | { | ||
209 | return m_SimulationService.UpdateAgent(destination, agent); | ||
210 | } | ||
211 | |||
212 | protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) | 119 | protected virtual void DoQueryAccess(Hashtable request, Hashtable responsedata, UUID id, UUID regionID) |
213 | { | 120 | { |
214 | if (m_SimulationService == null) | 121 | if (m_SimulationService == null) |
@@ -508,4 +415,173 @@ namespace OpenSim.Server.Handlers.Simulation | |||
508 | return m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason); | 415 | return m_SimulationService.CreateAgent(destination, aCircuit, teleportFlags, out reason); |
509 | } | 416 | } |
510 | } | 417 | } |
418 | |||
419 | public class AgentPutHandler : BaseStreamHandler | ||
420 | { | ||
421 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
422 | |||
423 | private ISimulationService m_SimulationService; | ||
424 | protected bool m_Proxy = false; | ||
425 | |||
426 | public AgentPutHandler(ISimulationService service) : | ||
427 | base("PUT", "/agent") | ||
428 | { | ||
429 | m_SimulationService = service; | ||
430 | } | ||
431 | |||
432 | public AgentPutHandler(string path) : | ||
433 | base("PUT", path) | ||
434 | { | ||
435 | m_SimulationService = null; | ||
436 | } | ||
437 | |||
438 | public override byte[] Handle(string path, Stream request, | ||
439 | OSHttpRequest httpRequest, OSHttpResponse httpResponse) | ||
440 | { | ||
441 | m_log.DebugFormat("[SIMULATION]: Stream handler called"); | ||
442 | |||
443 | Hashtable keysvals = new Hashtable(); | ||
444 | Hashtable headervals = new Hashtable(); | ||
445 | |||
446 | string[] querystringkeys = httpRequest.QueryString.AllKeys; | ||
447 | string[] rHeaders = httpRequest.Headers.AllKeys; | ||
448 | |||
449 | keysvals.Add("uri", httpRequest.RawUrl); | ||
450 | keysvals.Add("content-type", httpRequest.ContentType); | ||
451 | keysvals.Add("http-method", httpRequest.HttpMethod); | ||
452 | |||
453 | foreach (string queryname in querystringkeys) | ||
454 | keysvals.Add(queryname, httpRequest.QueryString[queryname]); | ||
455 | |||
456 | foreach (string headername in rHeaders) | ||
457 | headervals[headername] = httpRequest.Headers[headername]; | ||
458 | |||
459 | keysvals.Add("headers", headervals); | ||
460 | keysvals.Add("querystringkeys", querystringkeys); | ||
461 | |||
462 | Stream inputStream; | ||
463 | if (httpRequest.ContentType == "application/x-gzip") | ||
464 | inputStream = new GZipStream(request, CompressionMode.Decompress); | ||
465 | else | ||
466 | inputStream = request; | ||
467 | |||
468 | Encoding encoding = Encoding.UTF8; | ||
469 | StreamReader reader = new StreamReader(inputStream, encoding); | ||
470 | |||
471 | string requestBody = reader.ReadToEnd(); | ||
472 | keysvals.Add("body", requestBody); | ||
473 | |||
474 | httpResponse.StatusCode = 200; | ||
475 | httpResponse.ContentType = "text/html"; | ||
476 | httpResponse.KeepAlive = false; | ||
477 | |||
478 | Hashtable responsedata = new Hashtable(); | ||
479 | |||
480 | UUID agentID; | ||
481 | UUID regionID; | ||
482 | string action; | ||
483 | |||
484 | if (!Utils.GetParams((string)keysvals["uri"], out agentID, out regionID, out action)) | ||
485 | { | ||
486 | m_log.InfoFormat("[AGENT HANDLER]: Invalid parameters for agent message {0}", keysvals["uri"]); | ||
487 | |||
488 | httpResponse.StatusCode = 404; | ||
489 | |||
490 | return encoding.GetBytes("false"); | ||
491 | } | ||
492 | |||
493 | DoAgentPut(keysvals, responsedata); | ||
494 | |||
495 | httpResponse.StatusCode = (int)responsedata["int_response_code"]; | ||
496 | return encoding.GetBytes((string)responsedata["str_response_string"]); | ||
497 | } | ||
498 | |||
499 | protected void DoAgentPut(Hashtable request, Hashtable responsedata) | ||
500 | { | ||
501 | OSDMap args = Utils.GetOSDMap((string)request["body"]); | ||
502 | if (args == null) | ||
503 | { | ||
504 | responsedata["int_response_code"] = HttpStatusCode.BadRequest; | ||
505 | responsedata["str_response_string"] = "Bad request"; | ||
506 | return; | ||
507 | } | ||
508 | |||
509 | // retrieve the input arguments | ||
510 | int x = 0, y = 0; | ||
511 | UUID uuid = UUID.Zero; | ||
512 | string regionname = string.Empty; | ||
513 | if (args.ContainsKey("destination_x") && args["destination_x"] != null) | ||
514 | Int32.TryParse(args["destination_x"].AsString(), out x); | ||
515 | if (args.ContainsKey("destination_y") && args["destination_y"] != null) | ||
516 | Int32.TryParse(args["destination_y"].AsString(), out y); | ||
517 | if (args.ContainsKey("destination_uuid") && args["destination_uuid"] != null) | ||
518 | UUID.TryParse(args["destination_uuid"].AsString(), out uuid); | ||
519 | if (args.ContainsKey("destination_name") && args["destination_name"] != null) | ||
520 | regionname = args["destination_name"].ToString(); | ||
521 | |||
522 | GridRegion destination = new GridRegion(); | ||
523 | destination.RegionID = uuid; | ||
524 | destination.RegionLocX = x; | ||
525 | destination.RegionLocY = y; | ||
526 | destination.RegionName = regionname; | ||
527 | |||
528 | string messageType; | ||
529 | if (args["message_type"] != null) | ||
530 | messageType = args["message_type"].AsString(); | ||
531 | else | ||
532 | { | ||
533 | m_log.Warn("[AGENT HANDLER]: Agent Put Message Type not found. "); | ||
534 | messageType = "AgentData"; | ||
535 | } | ||
536 | |||
537 | bool result = true; | ||
538 | if ("AgentData".Equals(messageType)) | ||
539 | { | ||
540 | AgentData agent = new AgentData(); | ||
541 | try | ||
542 | { | ||
543 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); | ||
544 | } | ||
545 | catch (Exception ex) | ||
546 | { | ||
547 | m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message); | ||
548 | responsedata["int_response_code"] = HttpStatusCode.BadRequest; | ||
549 | responsedata["str_response_string"] = "Bad request"; | ||
550 | return; | ||
551 | } | ||
552 | |||
553 | //agent.Dump(); | ||
554 | // This is one of the meanings of PUT agent | ||
555 | result = UpdateAgent(destination, agent); | ||
556 | |||
557 | } | ||
558 | else if ("AgentPosition".Equals(messageType)) | ||
559 | { | ||
560 | AgentPosition agent = new AgentPosition(); | ||
561 | try | ||
562 | { | ||
563 | agent.Unpack(args, m_SimulationService.GetScene(destination.RegionHandle)); | ||
564 | } | ||
565 | catch (Exception ex) | ||
566 | { | ||
567 | m_log.InfoFormat("[AGENT HANDLER]: exception on unpacking ChildAgentUpdate message {0}", ex.Message); | ||
568 | return; | ||
569 | } | ||
570 | //agent.Dump(); | ||
571 | // This is one of the meanings of PUT agent | ||
572 | result = m_SimulationService.UpdateAgent(destination, agent); | ||
573 | |||
574 | } | ||
575 | |||
576 | responsedata["int_response_code"] = HttpStatusCode.OK; | ||
577 | responsedata["str_response_string"] = result.ToString(); | ||
578 | //responsedata["str_response_string"] = OSDParser.SerializeJsonString(resp); ??? instead | ||
579 | } | ||
580 | |||
581 | // subclasses can override this | ||
582 | protected virtual bool UpdateAgent(GridRegion destination, AgentData agent) | ||
583 | { | ||
584 | return m_SimulationService.UpdateAgent(destination, agent); | ||
585 | } | ||
586 | } | ||
511 | } | 587 | } |
diff --git a/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs b/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs index 42d8eca..0da08f8 100644 --- a/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs +++ b/OpenSim/Server/Handlers/Simulation/SimulationServiceInConnector.cs | |||
@@ -50,6 +50,7 @@ namespace OpenSim.Server.Handlers.Simulation | |||
50 | // are pure binary and shoehorning that into a string with UTF-8 | 50 | // are pure binary and shoehorning that into a string with UTF-8 |
51 | // encoding breaks it | 51 | // encoding breaks it |
52 | server.AddStreamHandler(new AgentPostHandler(m_LocalSimulationService)); | 52 | server.AddStreamHandler(new AgentPostHandler(m_LocalSimulationService)); |
53 | server.AddStreamHandler(new AgentPutHandler(m_LocalSimulationService)); | ||
53 | server.AddHTTPHandler("/agent/", new AgentHandler(m_LocalSimulationService).Handler); | 54 | server.AddHTTPHandler("/agent/", new AgentHandler(m_LocalSimulationService).Handler); |
54 | server.AddHTTPHandler("/object/", new ObjectHandler(m_LocalSimulationService).Handler); | 55 | server.AddHTTPHandler("/object/", new ObjectHandler(m_LocalSimulationService).Handler); |
55 | } | 56 | } |
diff --git a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs index 3a00c2b..f380873 100644 --- a/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs +++ b/OpenSim/Services/Connectors/Simulation/SimulationServiceConnector.cs | |||
@@ -216,7 +216,12 @@ namespace OpenSim.Services.Connectors.Simulation | |||
216 | args["destination_name"] = OSD.FromString(destination.RegionName); | 216 | args["destination_name"] = OSD.FromString(destination.RegionName); |
217 | args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); | 217 | args["destination_uuid"] = OSD.FromString(destination.RegionID.ToString()); |
218 | 218 | ||
219 | OSDMap result = WebUtil.PutToService(uri, args, timeout); | 219 | OSDMap result = WebUtil.PutToServiceCompressed(uri, args, timeout); |
220 | if (result["Success"].AsBoolean()) | ||
221 | return true; | ||
222 | |||
223 | result = WebUtil.PutToService(uri, args, timeout); | ||
224 | |||
220 | return result["Success"].AsBoolean(); | 225 | return result["Success"].AsBoolean(); |
221 | } | 226 | } |
222 | catch (Exception e) | 227 | catch (Exception e) |