diff --git a/Bot-Utils.csproj b/Bot-Utils.csproj index 3d8b4df..e5f2241 100644 --- a/Bot-Utils.csproj +++ b/Bot-Utils.csproj @@ -62,6 +62,7 @@ + diff --git a/Webserver.cs b/Webserver.cs new file mode 100644 index 0000000..bb86a46 --- /dev/null +++ b/Webserver.cs @@ -0,0 +1,98 @@ +using BlubbFish.Utils.IoT.Connector; +using BlubbFish.Utils.IoT.Events; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace BlubbFish.Utils.IoT.Bots +{ + public abstract class Webserver + { + protected Dictionary config; + protected InIReader requests; + protected HttpListener httplistener; + + public Webserver(ABackend backend, Dictionary settings, InIReader requests) { + this.config = settings; + this.requests = requests; + backend.MessageIncomming += this.Backend_MessageIncomming; + this.httplistener = new HttpListener(); + this.httplistener.Prefixes.Add(this.config["prefix"]); + this.httplistener.Start(); + ThreadPool.QueueUserWorkItem((o) => { + Console.WriteLine("Webserver is Running..."); + try { + while (this.httplistener.IsListening) { + ThreadPool.QueueUserWorkItem((state) => { + HttpListenerContext httplistenercontext = state as HttpListenerContext; + try { + this.SendResponse(httplistenercontext); + } catch { } finally { + httplistenercontext.Response.OutputStream.Close(); + } + }, this.httplistener.GetContext()); + } + } catch { }; + }); + } + + protected virtual void SendResponse(HttpListenerContext cont) { + String restr = cont.Request.Url.PathAndQuery; + if (restr.StartsWith("/")) { + if(restr.IndexOf("?") != -1) { + restr = restr.Substring(1, restr.IndexOf("?")-1); + } else { + restr = restr.Substring(1); + } + if(restr == "") { + restr = "index.html"; + } + String end = restr.IndexOf('.') != -1 ? restr.Substring(restr.IndexOf('.')+1) : ""; + if (File.Exists("resources/"+ restr)) { + try { + if (end == "png" || end == ".jpg" || end == ".jpeg" || end == ".ico") { + Byte[] output = File.ReadAllBytes("resources/" + restr); + cont.Response.OutputStream.Write(output, 0, output.Length); + cont.Response.ContentType = "image/"+end; + return; + } else { + String file = File.ReadAllText("resources/" + restr); + if (this.requests.GetSections(false).Contains(restr)) { + Dictionary vars = this.requests.GetSection(restr); + foreach (KeyValuePair item in vars) { + file = file.Replace("{%" + item.Key.ToUpper() + "%}", item.Value); + } + } + file = file.Replace("{%REQUEST_URL_HOST%}", cont.Request.Url.Host); + Byte[] buf = Encoding.UTF8.GetBytes(file); + cont.Response.ContentLength64 = buf.Length; + cont.Response.OutputStream.Write(buf, 0, buf.Length); + Console.WriteLine("200 - " + cont.Request.Url.PathAndQuery); + return; + } + } catch(Exception e) { + Helper.WriteError("500 - " + e.Message); + cont.Response.StatusCode = 500; + return; + } + } + Helper.WriteError("404 - " + cont.Request.Url.PathAndQuery + " not found!"); + cont.Response.StatusCode = 404; + return; + } + return; + } + + public void Dispose() { + this.httplistener.Stop(); + this.httplistener.Close(); + } + + protected abstract void Backend_MessageIncomming(Object sender, BackendEvent e); + } +}