2023-10-31 11:47:27 -04:00

106 lines
2.9 KiB
C#
Executable File

//
// WebApplication.cs
//
// Author:
// beckermj <>
//
// Copyright (c) 2023 ${CopyrightHolder}
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
using System;
using System.Configuration;
namespace Mocha.Web.Server.Sys
{
public class WebApplication : MBS.Framework.Application
{
private System.Net.Sockets.TcpListener listener = null;
protected override int StartInternal()
{
string strport = ConfigurationManager.AppSettings["Mocha.Web.Server.Port"];
if (Int32.TryParse(strport, out int port))
{
listener = new System.Net.Sockets.TcpListener(new System.Net.IPEndPoint(System.Net.IPAddress.Any, port));
listener.Start();
while (true)
{
System.Net.Sockets.TcpClient client = listener.AcceptTcpClient();
System.Threading.Thread tClient = new System.Threading.Thread(tClient_ParameterizedThreadStart);
tClient.Start(client);
}
}
else
{
Console.Error.WriteLine("can't start listener: appSetting 'Mocha.Web.Server.Port' must be an integer (got '{0}')", strport);
return -1;
}
}
private void tClient_ParameterizedThreadStart(object parm)
{
try
{
System.Net.Sockets.TcpClient client = (System.Net.Sockets.TcpClient)parm;
System.IO.Stream stream = client.GetStream();
System.IO.StreamReader sr = new System.IO.StreamReader(stream);
string line = sr.ReadLine();
if (String.IsNullOrEmpty(line))
{
return;
}
Sys.HttpRequest req = Sys.HttpRequest.Parse(line);
Sys.HttpResponse resp = new HttpResponse(stream);
System.Collections.Generic.Dictionary<string, string> headers = new System.Collections.Generic.Dictionary<string, string>();
while (true)
{
string line2 = sr.ReadLine();
if (line2.Contains(":"))
{
string[] kvp1 = line2.Split(new char[] { ':' }, 2);
if (kvp1.Length == 2)
{
headers[kvp1[0]] = kvp1[1];
}
}
if (String.IsNullOrEmpty(line2))
break;
}
OnRequestReceived(new RequestEventArgs(req, resp, stream, headers));
}
catch (System.Net.Sockets.SocketException ex)
{
// silently drop it
}
catch (System.IO.IOException ex)
{
// silently drop it
}
}
public event EventHandler<RequestEventArgs> RequestReceived;
protected virtual void OnRequestReceived(RequestEventArgs e)
{
RequestReceived?.Invoke(this, e);
}
}
}