2
0
mirror of https://github.com/esiur/esiur-dotnet.git synced 2025-06-27 13:33:13 +00:00
This commit is contained in:
2020-10-05 00:46:51 +03:00
parent 8c2d616d62
commit ba084b79e6
29 changed files with 1135 additions and 843 deletions

View File

@ -43,13 +43,11 @@ namespace Esyur.Net.HTTP
public class HTTPConnection : NetworkConnection
{
public void SetParent(HTTPServer Parent)
{
Server = Parent;
}
public bool WSMode { get; internal set; }
private HTTPServer Server;
public HTTPServer Server { get; internal set; }
public WebsocketPacket WSRequest { get; set; }
public HTTPRequestPacket Request { get; set; }
public HTTPResponsePacket Response { get; } = new HTTPResponsePacket();
@ -100,7 +98,7 @@ namespace Esyur.Net.HTTP
public void Flush()
{
// close the connection
if (Request.Headers["connection"].ToLower() != "keep-alive" & Connected)
if (Request.Headers["connection"].ToLower() != "keep-alive" & IsConnected)
Close();
}
@ -232,6 +230,102 @@ namespace Esyur.Net.HTTP
}
}
protected override void DataReceived(NetworkBuffer data)
{
byte[] msg = data.Read();
var BL = Parse(msg);
if (BL == 0)
{
if (Request.Method == HTTPRequestPacket.HTTPMethod.UNKNOWN)
{
Close();
return;
}
if (Request.URL == "")
{
Close();
return;
}
}
else if (BL == -1)
{
data.HoldForNextWrite(msg);
return;
}
else if (BL < 0)
{
data.HoldFor(msg, (uint)(msg.Length - BL));
return;
}
else if (BL > 0)
{
if (BL > Server.MaxPost)
{
Send(
"<html><body>POST method content is larger than "
+ Server.MaxPost
+ " bytes.</body></html>");
Close();
}
else
{
data.HoldFor(msg, (uint)(msg.Length + BL));
}
return;
}
else if (BL < 0) // for security
{
Close();
return;
}
if (IsWebsocketRequest() & !WSMode)
{
Upgrade();
//return;
}
//return;
try
{
if (!Server.Execute(this))
{
Response.Number = HTTPResponsePacket.ResponseCode.InternalServerError;
Send("Bad Request");
Close();
}
}
catch (Exception ex)
{
if (ex.Message != "Thread was being aborted.")
{
Global.Log("HTTPServer", LogType.Error, ex.ToString());
//Console.WriteLine(ex.ToString());
//EventLog.WriteEntry("HttpServer", ex.ToString(), EventLogEntryType.Error);
Send(Error500(ex.Message));
}
}
}
private string Error500(string msg)
{
return "<html><head><title>500 Internal Server Error</title></head><br>\r\n"
+ "<body><br>\r\n"
+ "<b>500</b> Internal Server Error<br>" + msg + "\r\n"
+ "</body><br>\r\n"
+ "</html><br>\r\n";
}
public async AsyncReply<bool> SendFile(string filename)
{
@ -329,5 +423,15 @@ namespace Esyur.Net.HTTP
return false;
}
}
protected override void Connected()
{
// do nothing
}
protected override void Disconencted()
{
// do nothing
}
}
}

View File

@ -62,7 +62,7 @@ namespace Esyur.Net.HTTP
}
*/
public abstract bool Execute(HTTPConnection sender);
public abstract AsyncReply<bool> Execute(HTTPConnection sender);
public virtual void ClientConnected(HTTPConnection HTTP)
{

View File

@ -140,113 +140,23 @@ namespace Esyur.Net.HTTP
return Cookie;
}
protected override void ClientDisconnected(HTTPConnection sender)
protected override void ClientDisconnected(HTTPConnection connection)
{
//Console.WriteLine("OUT: " + this.Connections.Count);
foreach (var filter in filters)
filter.ClientDisconnected(sender);
filter.ClientDisconnected(connection);
}
protected override void DataReceived(HTTPConnection sender, NetworkBuffer data)
internal bool Execute(HTTPConnection sender)
{
byte[] msg = data.Read();
var BL = sender.Parse(msg);
if (BL == 0)
{
if (sender.Request.Method == HTTPRequestPacket.HTTPMethod.UNKNOWN)
{
sender.Close();
return;
}
if (sender.Request.URL == "")
{
sender.Close();
return;
}
}
else if (BL == -1)
{
data.HoldForNextWrite(msg);
return;
}
else if (BL < 0)
{
data.HoldFor(msg, (uint) (msg.Length - BL));
return;
}
else if (BL > 0)
{
if (BL > MaxPost)
{
sender.Send(
"<html><body>POST method content is larger than "
+ MaxPost
+ " bytes.</body></html>");
sender.Close();
}
else
{
data.HoldFor(msg, (uint)(msg.Length + BL));
}
return;
}
else if (BL < 0) // for security
{
sender.Close();
return;
}
if (sender.IsWebsocketRequest() & !sender.WSMode)
{
sender.Upgrade();
//return;
}
//return;
try
{
foreach (var resource in filters)
if (resource.Execute(sender))
return;
sender.Response.Number = HTTPResponsePacket.ResponseCode.InternalServerError;
sender.Send("Bad Request");
sender.Close();
}
catch (Exception ex)
{
if (ex.Message != "Thread was being aborted.")
{
Global.Log("HTTPServer", LogType.Error, ex.ToString());
//Console.WriteLine(ex.ToString());
//EventLog.WriteEntry("HttpServer", ex.ToString(), EventLogEntryType.Error);
sender.Send(Error500(ex.Message));
}
}
foreach (var resource in filters)
if (resource.Execute(sender).Wait(30000))
return true;
return false;
}
private string Error500(string msg)
{
return "<html><head><title>500 Internal Server Error</title></head><br>\r\n"
+ "<body><br>\r\n"
+ "<b>500</b> Internal Server Error<br>" + msg + "\r\n"
+ "</body><br>\r\n"
+ "</html><br>\r\n";
}
/*
@ -283,7 +193,7 @@ namespace Esyur.Net.HTTP
return Timeout;// mTimeout;
}
}
*/
*/
public async AsyncReply<bool> Trigger(ResourceTrigger trigger)
@ -298,7 +208,7 @@ namespace Esyur.Net.HTTP
//if (ip == null) ip = IPAddress.Any;
ISocket listener;
Sockets.ISocket listener;
IPAddress ipAdd;
if (IP == null)
@ -330,30 +240,34 @@ namespace Esyur.Net.HTTP
return true;
}
protected override void ClientConnected(HTTPConnection sender)
{
//sender.SessionModified += SessionModified;
//sender.SessionEnded += SessionExpired;
sender.SetParent(this);
//Console.WriteLine("IN: " + this.Connections.Count);
public override void Add(HTTPConnection connection)
{
connection.Server = this;
base.Add(connection);
}
public override void Remove(HTTPConnection connection)
{
connection.Server = null;
base.Remove(connection);
}
protected override void ClientConnected(HTTPConnection connection)
{
if (filters.Length == 0)
{
sender.Close();
connection.Close();
return;
}
foreach (var resource in filters)
{
resource.ClientConnected(sender);
resource.ClientConnected(connection);
}
}
public void Destroy()
{
}
/*
public int LocalPort

View File

@ -13,7 +13,7 @@ namespace Esyur.Net.HTTP
[Attribute]
EntryPoint EntryPoint { get; set; }
public override bool Execute(HTTPConnection sender)
public async override AsyncReply<bool> Execute(HTTPConnection sender)
{
if (sender.Request.URL != "iip")
return false;

View File

@ -43,7 +43,7 @@ namespace Esyur.Net.HTTP
set;
}
public override bool Execute(HTTPConnection sender)
public async override AsyncReply<bool> Execute(HTTPConnection sender)
{
if (sender.IsWebsocketRequest())
@ -58,11 +58,11 @@ namespace Esyur.Net.HTTP
var httpServer = sender.Parent;
var wsSocket = new WSSocket(tcpSocket);
httpServer.RemoveConnection(sender);
httpServer.Remove(sender);
var iipConnection = new DistributedConnection();
Server.AddConnection(iipConnection);
Server.Add(iipConnection);
iipConnection.Assign(wsSocket);
wsSocket.Begin();