OpenSim
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros
RegionLoaderWebServer.cs
Go to the documentation of this file.
1 /*
2  * Copyright (c) Contributors, http://opensimulator.org/
3  * See CONTRIBUTORS.TXT for a full list of copyright holders.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the OpenSimulator Project nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
17  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 using System;
29 using System.IO;
30 using System.Net;
31 using System.Reflection;
32 using System.Xml;
33 using log4net;
34 using Nini.Config;
35 using OpenSim.Framework;
36 
37 namespace OpenSim.ApplicationPlugins.LoadRegions
38 {
40  {
41  private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
42 
43  private IConfigSource m_configSource;
44 
45  public void SetIniConfigSource(IConfigSource configSource)
46  {
47  m_configSource = configSource;
48  }
49 
51  {
52  int tries = 3;
53  int wait = 2000;
54 
55  if (m_configSource == null)
56  {
57  m_log.Error("[WEBLOADER]: Unable to load configuration source!");
58  return null;
59  }
60  else
61  {
62  IConfig startupConfig = (IConfig)m_configSource.Configs["Startup"];
63  string url = startupConfig.GetString("regionload_webserver_url", String.Empty).Trim();
64  bool allowRegionless = startupConfig.GetBoolean("allow_regionless", false);
65 
66  if (url == String.Empty)
67  {
68  m_log.Error("[WEBLOADER]: Unable to load webserver URL - URL was empty.");
69  return null;
70  }
71  else
72  {
73  while (tries > 0)
74  {
75  RegionInfo[] regionInfos = new RegionInfo[] { };
76  int regionCount = 0;
77  HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
78  webRequest.Timeout = 30000; //30 Second Timeout
79  m_log.DebugFormat("[WEBLOADER]: Sending download request to {0}", url);
80 
81  try
82  {
83  HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
84  m_log.Debug("[WEBLOADER]: Downloading region information...");
85  StreamReader reader = new StreamReader(webResponse.GetResponseStream());
86  string xmlSource = String.Empty;
87  string tempStr = reader.ReadLine();
88  while (tempStr != null)
89  {
90  xmlSource = xmlSource + tempStr;
91  tempStr = reader.ReadLine();
92  }
93  m_log.Debug("[WEBLOADER]: Done downloading region information from server. Total Bytes: " +
94  xmlSource.Length);
95  XmlDocument xmlDoc = new XmlDocument();
96  xmlDoc.LoadXml(xmlSource);
97  if (xmlDoc.FirstChild.Name == "Nini")
98  {
99  regionCount = xmlDoc.FirstChild.ChildNodes.Count;
100 
101  if (regionCount > 0)
102  {
103  regionInfos = new RegionInfo[regionCount];
104  int i;
105  for (i = 0; i < xmlDoc.FirstChild.ChildNodes.Count; i++)
106  {
107  m_log.Debug(xmlDoc.FirstChild.ChildNodes[i].OuterXml);
108  regionInfos[i] =
109  new RegionInfo("REGION CONFIG #" + (i + 1), xmlDoc.FirstChild.ChildNodes[i], false, m_configSource);
110  }
111  }
112  }
113  }
114  catch (WebException ex)
115  {
116  if (((HttpWebResponse)ex.Response).StatusCode == HttpStatusCode.NotFound)
117  {
118  if (!allowRegionless)
119  throw ex;
120  }
121  else
122  throw ex;
123  }
124 
125  if (regionCount > 0 | allowRegionless)
126  return regionInfos;
127 
128  m_log.Debug("[WEBLOADER]: Request yielded no regions.");
129  tries--;
130  if (tries > 0)
131  {
132  m_log.Debug("[WEBLOADER]: Retrying");
133  System.Threading.Thread.Sleep(wait);
134  }
135  }
136 
137  m_log.Error("[WEBLOADER]: No region configs were available.");
138  return null;
139  }
140  }
141  }
142  }
143 }
OpenSim.Framework.RegionInfo RegionInfo
static RegionInfo Create(UUID regionID, string regionName, uint regX, uint regY, string externalHostName, uint httpPort, uint simPort, uint remotingPort, string serverURI)
Definition: RegionInfo.cs:1228