using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using HttpServer; using HttpServer.Headers; using Newtonsoft.Json; using HttpListener = HttpServer.HttpListener; namespace TShockAPI { /// /// Rest command delegate /// /// Parameters in the url /// Http request /// Response object or null to not handle request public delegate object RestCommandD(IParameterCollection parameters, RequestEventArgs request); public class Rest : IDisposable { List commands = new List(); HttpListener listener; public Rest(IPAddress ip, int port) { listener = HttpListener.Create(ip, port); listener.RequestReceived += OnRequest; } public void Start() { listener.Start(int.MaxValue); } public void Stop() { listener.Stop(); } public void Register(string path, RestCommandD callback) { Register(new RestCommand(path, callback)); } public void Register(RestCommand com) { commands.Add(com); } void OnRequest(object sender, RequestEventArgs e) { var obj = Process(sender, e); if (obj == null) throw new NullReferenceException("obj"); var str = JsonConvert.SerializeObject(obj, Formatting.Indented); e.Response.Connection.Type = ConnectionType.Close; e.Response.Body.Write(Encoding.ASCII.GetBytes(str), 0, str.Length); e.Response.Status = HttpStatusCode.OK; return; } protected virtual object Process(object sender, RequestEventArgs e) { var coms = commands.Where(r => r.Path.ToLower().Equals(e.Request.Uri.AbsolutePath.ToLower())); foreach (var com in coms) { var obj = com.Callback(e.Request.Parameters, e); if (obj != null) return obj; } return new Dictionary { { "Error", "Invalid request" } }; } #region Dispose public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (disposing) { if (listener != null) { listener.Stop(); listener = null; } } } ~Rest() { Dispose(false); } #endregion } public class RestCommand { public string Path { get; protected set; } public RestCommandD Callback { get; protected set; } public RestCommand(string path, RestCommandD callback) { Path = path; Callback = callback; } } }