internal void Reconfigure(TrivialWebServer tws)
		{
			lock (this)
			{
				tws.ClearHandlers();
				ConfigureProperties();
				ConfigurePaths(tws);
			}
		}
		internal TrivialWebServer Create()
		{
			lock (this)
			{
				ReloadConfig();
				TrivialWebServer server = new TrivialWebServer(new IPEndPoint(IPAddress.Any, Port), LocalOnly);
				server.HandleConnectionBegin += new EventHandler(server_HandleConnectionBegin);
				ConfigureProperties();
				ConfigurePaths(server);
				return server;
			}
		}
 public void Register(Regex pattern, TrivialWebServer tws)
 {
     tws.RegisterHandler(pattern, new RequestHandler(Handler));
 }
		private void ConfigurePaths(TrivialWebServer server)
		{
			foreach (XmlElement pathEl in _configRoot.SelectNodes("path"))
			{
				string pattern = XmlUtil.ReadString(pathEl, "@value", null);
				if (pattern != null)
					pattern = "^" + Regex.Escape(pattern) + "$";
				else
					pattern = XmlUtil.ReadString(pathEl, "@pattern", null);
				
				if (pattern == null)
					throw new ConfigurationException("Path element requires either 'value' or 'pattern'");

				HttpRequestPath path = new HttpRequestPath();
				path.Register(new Regex(pattern), server);
				
				bool hasSeenHandler = false;
				XmlNode childNode = pathEl.FirstChild;
				while (childNode != null)
				{
					XmlElement childEl = childNode as XmlElement;
					if (childEl == null)
					{
						childNode = childNode.NextSibling;
						continue;
					}

					bool isFilter;
					switch (childEl.Name)
					{
						case "filter":
							isFilter = true;
							if (hasSeenHandler)
								throw new ConfigurationException("All filters for a given path must come before all the handlers in that path");
							break;
						case "handler":
							isFilter = false;
							hasSeenHandler = true;
							break;
						default:
							throw new ConfigurationException("Element '" + childEl.Name + "' was not expected here");
					}

					string clazz = XmlUtil.ReadString(childEl, "@className", null);
					Type filterType = Type.GetType(clazz, true);
					ConstructorInfo constructor = filterType.GetConstructor(new Type[] {typeof(XmlElement)});
					if (constructor == null)
						throw new ConfigurationException("Class " + filterType.FullName + " does not have a constructor that takes XmlElement");
					object filterOrHandler = constructor.Invoke(new object[] {childEl});
					if (isFilter)
					{
						if (!(filterOrHandler is HttpRequestFilter))
							throw new ConfigurationException("Class " + filterType.FullName + " does not derive from HttpRequestFilter");
						path.AddFilter((HttpRequestFilter) filterOrHandler);
					}
					else
					{
						if (!(filterOrHandler is HttpRequestHandler))
							throw new ConfigurationException("Class " + filterType.FullName + " does not derive from HttpRequestHandler");
						path.AddHandler((HttpRequestHandler) filterOrHandler);
					}

					childNode = childNode.NextSibling;
				}
			}
		}
		public void Register(Regex pattern, TrivialWebServer tws)
		{
			tws.RegisterHandler(pattern, new RequestHandler(Handler));
		}