You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
128 lines
3.8 KiB
128 lines
3.8 KiB
using System; |
|
using System.Collections.Generic; |
|
using System.Net; |
|
|
|
namespace ET |
|
{ |
|
public class HttpComponentAwakeSystem : AwakeSystem<HttpComponent, string> |
|
{ |
|
public override void Awake(HttpComponent self, string address) |
|
{ |
|
try |
|
{ |
|
self.Load(); |
|
|
|
self.Listener = new HttpListener(); |
|
|
|
foreach (string s in address.Split(';')) |
|
{ |
|
if (s.Trim() == "") |
|
{ |
|
continue; |
|
} |
|
self.Listener.Prefixes.Add(s); |
|
} |
|
|
|
self.Listener.Start(); |
|
|
|
self.Accept().Coroutine(); |
|
} |
|
catch (HttpListenerException e) |
|
{ |
|
throw new Exception($"请现在cmd中运行: netsh http add urlacl url=http://*:你的address中的端口/ user=Everyone, address: {address}", e); |
|
} |
|
} |
|
} |
|
|
|
[ObjectSystem] |
|
public class HttpComponentLoadSystem: LoadSystem<HttpComponent> |
|
{ |
|
public override void Load(HttpComponent self) |
|
{ |
|
self.Load(); |
|
} |
|
} |
|
|
|
[ObjectSystem] |
|
public class HttpComponentDestroySystem: DestroySystem<HttpComponent> |
|
{ |
|
public override void Destroy(HttpComponent self) |
|
{ |
|
self.Listener.Stop(); |
|
self.Listener.Close(); |
|
} |
|
} |
|
|
|
[FriendClass(typeof(HttpComponent))] |
|
public static class HttpComponentSystem |
|
{ |
|
public static void Load(this HttpComponent self) |
|
{ |
|
self.dispatcher = new Dictionary<string, IHttpHandler>(); |
|
|
|
List<Type> types = EventSystem.Instance.GetTypes(typeof (HttpHandlerAttribute)); |
|
|
|
SceneType sceneType = self.GetParent<Scene>().SceneType; |
|
|
|
foreach (Type type in types) |
|
{ |
|
object[] attrs = type.GetCustomAttributes(typeof(HttpHandlerAttribute), false); |
|
if (attrs.Length == 0) |
|
{ |
|
continue; |
|
} |
|
|
|
HttpHandlerAttribute httpHandlerAttribute = (HttpHandlerAttribute)attrs[0]; |
|
|
|
if (httpHandlerAttribute.SceneType != sceneType) |
|
{ |
|
continue; |
|
} |
|
|
|
object obj = Activator.CreateInstance(type); |
|
|
|
IHttpHandler ihttpHandler = obj as IHttpHandler; |
|
if (ihttpHandler == null) |
|
{ |
|
throw new Exception($"HttpHandler handler not inherit IHttpHandler class: {obj.GetType().FullName}"); |
|
} |
|
self.dispatcher.Add(httpHandlerAttribute.Path, ihttpHandler); |
|
} |
|
} |
|
|
|
public static async ETTask Accept(this HttpComponent self) |
|
{ |
|
long instanceId = self.InstanceId; |
|
while (self.InstanceId == instanceId) |
|
{ |
|
try |
|
{ |
|
HttpListenerContext context = await self.Listener.GetContextAsync(); |
|
self.Handle(context).Coroutine(); |
|
} |
|
catch (Exception e) |
|
{ |
|
Log.Error(e); |
|
} |
|
} |
|
} |
|
|
|
public static async ETTask Handle(this HttpComponent self, HttpListenerContext context) |
|
{ |
|
try |
|
{ |
|
IHttpHandler handler; |
|
if (self.dispatcher.TryGetValue(context.Request.Url.AbsolutePath, out handler)) |
|
{ |
|
await handler.Handle(self.Domain, context); |
|
} |
|
} |
|
catch (Exception e) |
|
{ |
|
Log.Error(e); |
|
} |
|
context.Request.InputStream.Dispose(); |
|
context.Response.OutputStream.Dispose(); |
|
} |
|
} |
|
} |