ForgeCore/WebHookServer/HookCmds.cs

58 lines
1.9 KiB
C#

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
namespace Bot.WebHookServer
{
class HookCmds
{
public HttpListener listener;
public void OnWebHook(IAsyncResult ar)
{
HttpListenerContext CTX = null;
try
{
CTX = listener.EndGetContext(ar);
}
catch (Exception e)
{
BotSession.Instance.Logger.info(log: "ERROR: Getting the end context for the listener failed");
return;
}
listener.BeginGetContext(OnWebHook, null);
Stream body = CTX.Request.InputStream;
StreamReader SR = new StreamReader(body, CTX.Request.ContentEncoding);
string Response = SR.ReadToEnd();
if (!Directory.Exists("request_log")) Directory.CreateDirectory("request_log");
string RequestPath = CTX.Request.RawUrl;
if (RequestPath.EndsWith("/")) RequestPath = RequestPath.Substring(0, RequestPath.Length - 1);
string CustomReplyStr = "";
WebhookRegistry.HTTPResponseData reply = WebhookRegistry.Instance.RunCommand(RequestPath, Response, CTX.Request.Headers, CTX.Request.HttpMethod);
CustomReplyStr = reply.ReplyString;
byte[] buffer = Encoding.UTF8.GetBytes("\n" + CustomReplyStr);
CTX.Response.ContentLength64 = buffer.Length;
CTX.Response.AddHeader("Server", "1.6");
CTX.Response.StatusCode = reply.Status;
if (reply.ReturnContentType != "" && reply.ReturnContentType != null)
{
CTX.Response.ContentType = reply.ReturnContentType;
}
Stream output = CTX.Response.OutputStream;
output.Write(buffer, 0, buffer.Length);
output.Close();
}
}
}