{0}", ex);
- var tokens = TemplateHelper.GetTokenReplacements(_cityName, "Error", _requestHandlers, errorBody);
- var template = TemplateHelper.PopulateTemplate("index", tokens);
+ var tokens = TemplateHelper.GetTokenReplacements(_cityName, "Error", this.Mods, errorBody);
+ var template = TemplateHelper.PopulateTemplate("content", _wwwroot, tokens);
IResponseFormatter errorResponseFormatter = new HtmlResponseFormatter(template);
errorResponseFormatter.WriteContent(response);
@@ -246,222 +263,148 @@ private void HandleRequest(HttpListenerRequest request, HttpListenerResponse res
}
}
- var wwwroot = GetWebRoot();
+ if (handled) { return; } // something handled it, great
// At this point, we can guarantee that we don't need any game data, so we can safely start a new thread to perform the remaining tasks.
- ServiceFileRequest(wwwroot, request, response);
+ if (ServiceFileRequest(wwwroot, request, response, slug)) { return; } // check for static files
+
+ String body = String.Format("No resource is available at the specified filepath: {0}", url);
+ IResponseFormatter notFoundResponseFormatter = new PlainTextResponseFormatter(body, HttpStatusCode.NotFound);
+ notFoundResponseFormatter.WriteContent(response);
+ return;
}
+
+ private static Boolean ServiceFileRequest(String wwwroot, HttpListenerRequest request, HttpListenerResponse response, String slug) {
+ if (wwwroot == null || wwwroot.IsNullOrWhiteSpace()) { return false; }
- private static void ServiceFileRequest(String wwwroot, HttpListenerRequest request, HttpListenerResponse response)
- {
- var relativePath = request.Url.AbsolutePath.Substring(1);
+ var relativePath = request.Url.AbsolutePath;
+ if (!slug.Equals("root"))
+ {
+ relativePath = relativePath.Replace(String.Format("/{0}/", slug), "");
+ }
+ else
+ {
+ relativePath = relativePath.Substring(1);
+ }
relativePath = relativePath.Replace("/", Path.DirectorySeparatorChar.ToString());
var absolutePath = Path.Combine(wwwroot, relativePath);
-
- if (File.Exists(absolutePath))
+ if (!File.Exists(absolutePath)) { return false; }
+
+ var extension = Path.GetExtension(absolutePath);
+ response.ContentType = Apache.GetMime(extension);
+ response.StatusCode = 200; // HTTP 200 - SUCCESS
+
+ // Open file, read bytes into buffer and write them to the output stream.
+ using (FileStream fileReader = File.OpenRead(absolutePath))
{
- var extension = Path.GetExtension(absolutePath);
- response.ContentType = Apache.GetMime(extension);
- response.StatusCode = 200; // HTTP 200 - SUCCESS
-
- // Open file, read bytes into buffer and write them to the output stream.
- using (FileStream fileReader = File.OpenRead(absolutePath))
+ byte[] buffer = new byte[4096];
+ int read;
+ while ((read = fileReader.Read(buffer, 0, buffer.Length)) > 0)
{
- byte[] buffer = new byte[4096];
- int read;
- while ((read = fileReader.Read(buffer, 0, buffer.Length)) > 0)
- {
- response.OutputStream.Write(buffer, 0, read);
- }
+ response.OutputStream.Write(buffer, 0, read);
}
}
- else
- {
- String body = String.Format("No resource is available at the specified filepath: {0}", absolutePath);
- IResponseFormatter notFoundResponseFormatter = new PlainTextResponseFormatter(body, HttpStatusCode.NotFound);
- notFoundResponseFormatter.WriteContent(response);
- }
+ return true;
}
/// {0}", String.Join("", _logLines.ToArray()));
- var tokens = TemplateHelper.GetTokenReplacements(_cityName, "Log", _requestHandlers, body);
- var template = TemplateHelper.PopulateTemplate("index", tokens);
-
- IResponseFormatter htmlResponseFormatter = new HtmlResponseFormatter(template);
- htmlResponseFormatter.WriteContent(response);
-
- return true;
+ // hey it's me! get our web root
+ um.isMe = true;
+ String testPath = Path.Combine(um.PluginInfo.modPath, "wwwroot");
+ if (Directory.Exists(testPath))
+ {
+ LogMessage(String.Format("Setting server wwwroot location: {0}", testPath));
+ _wwwroot = testPath;
+ }
+ break;
}
}
- return false;
+ LogMessage("adding default CityWebMods");
+ _cwMods = new Dictionary{0}", String.Join("", _server.LogLines.ToArray()));
+ var tokens = TemplateHelper.GetTokenReplacements(_server.CityName, "Log", _server.Mods, body);
+ var template = TemplateHelper.PopulateTemplate("content", wwwroot, tokens);
+
+ return new HtmlResponseFormatter(template);
+ }
+ }
+
+ }
+}
diff --git a/CityWebServer/RequestHandlers/MessageRequestHandler.cs b/CityWebServer/RequestHandlers/MessageRequestHandler.cs
index 1fa060b..4802c7f 100644
--- a/CityWebServer/RequestHandlers/MessageRequestHandler.cs
+++ b/CityWebServer/RequestHandlers/MessageRequestHandler.cs
@@ -12,13 +12,13 @@ public class MessageRequestHandler : RequestHandlerBase
private readonly ChirpRetriever _chirpRetriever;
public MessageRequestHandler(IWebServer server)
- : base(server, new Guid("b4efeced-1dbb-435a-8999-9f8adaa5036e"), "Chirper Messages", "Rychard", 100, "/Messages")
+ : base(server, "/Messages")
{
_chirpRetriever = new ChirpRetriever();
_chirpRetriever.LogMessage += (sender, args) => { OnLogMessage(args.LogLine); };
}
- public override IResponseFormatter Handle(HttpListenerRequest request)
+ public override IResponseFormatter Handle(HttpListenerRequest request, String slug, String wwwroot)
{
// TODO: Customize request handling.
var messages = _chirpRetriever.Messages;
diff --git a/CityWebServer/RequestHandlers/RootCWM.cs b/CityWebServer/RequestHandlers/RootCWM.cs
new file mode 100644
index 0000000..621f9c5
--- /dev/null
+++ b/CityWebServer/RequestHandlers/RootCWM.cs
@@ -0,0 +1,50 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.IO;
+using System.Net;
+using CityWebServer.Helpers;
+using CityWebServer.Extensibility;
+using CityWebServer.Extensibility.Responses;
+
+namespace CityWebServer.RequestHandlers
+{
+ public class RootCWM : CityWebMod
+ {
+ public RootCWM(IWebServer server)
+ {
+ _ID = "root";
+ _name = "Index Page";
+ _author = "Rychard";
+ _isEnabled = true;
+ _wwwroot = server.WebRoot;
+ _topMenu = false;
+
+ _handlers = new List