using System;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
class WebServer {
HttpListener _listener;
string _baseFolder;
public WebServer(string uriPrefix, string baseFolder) {
System.Threading.ThreadPool.SetMaxThreads(50, 1000);
System.Threading.ThreadPool.SetMinThreads(50, 50);
_listener = new HttpListener();
_listener.Prefixes.Add(uriPrefix);
_baseFolder = baseFolder;
}
public void Start() {
_listener.Start();
while (true)
try {
HttpListenerContext request = _listener.GetContext();
ThreadPool.QueueUserWorkItem(ProcessRequest, request);
} catch (HttpListenerException) { break; }
catch (InvalidOperationException) { break; }
}
public void Stop() { _listener.Stop(); }
void ProcessRequest(object listenerContext) {
try {
var context = (HttpListenerContext)listenerContext;
string filename = Path.GetFileName(context.Request.RawUrl);
string path = Path.Combine(_baseFolder, filename);
byte[] msg;
if (!File.Exists(path)) {
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
msg = Encoding.UTF8.GetBytes("Sorry, that page does not exist");
} else {
context.Response.StatusCode = (int)HttpStatusCode.OK;
msg = File.ReadAllBytes(path);
}
context.Response.ContentLength64 = msg.Length;
using (Stream s = context.Response.OutputStream)
s.Write(msg, 0, msg.Length);
} catch (Exception ex) { Console.WriteLine("Request error: " + ex); }
}
}