using System;
using System.
Collections.
Generic;
using System.
Text;
using System.
Net.
Sockets;
using System.
Net;
using System.
Text.
RegularExpressions;
using System.
Threading;
using System.
Web;
using System.
Collections.
Specialized;
namespace http
{
public class FakeWebServer
{
private const string URL_REPLACE = "{URL}";
private static readonly Regex urlRegex = new Regex(@"^(GET|POST) /(.*?) (HTTP[^\s]+)",
RegexOptions.Compiled | RegexOptions.IgnoreCase);
// Almacena las URLs verdaderas y falsas
public static readonly Dictionary<string, string> FakeUrls;
static FakeWebServer()
{
FakeUrls = new Dictionary<string, string>();
}
private TcpListener listener;
string contents;
public FakeWebServer(int port, string responseContents)
{
this.contents = responseContents;
// 'Escuchar' en cualquier dirección
listener = new TcpListener(IPAddress.Any, port);
listener.Start();
Thread t = new Thread(delegate()
{
AcceptClients();
});
t.Start();
}
public void AcceptClients()
{
while (true)
{
using (TcpClient client = listener.AcceptTcpClient())
{
if (client.Connected) // Nuevo cliente
{
// Leer los datos enviados
NetworkStream stream = client.GetStream();
byte[] data = new byte[1024];
stream.Read(data, 0, data.Length);
string request = Encoding.UTF8.GetString(data);
// Sólo tomar en cuenta los datos presentes en el QueryString
// Obtener la versión del protocolo y la URL del 'Request'
MatchCollection matches = urlRegex.Matches(request);
string qs = matches[0].Groups[2].Value.TrimStart('?');
NameValueCollection paramArray = HttpUtility.ParseQueryString(qs);
foreach (string key in paramArray.AllKeys)
{
if (FakeUrls.TryGetValue(paramArray[key], out qs))
break;
}
System.Diagnostics.Debug.WriteLine("Query String: " + matches[0].Groups[2].Value);
// Reemplazar las URLs
if (!string.IsNullOrEmpty(qs) && !string.IsNullOrEmpty(contents))
contents = contents.Replace(URL_REPLACE, qs);
// Enviar las cabeceras necesarias y el contenido
SendHeaders(matches[0].Groups[3].Value, null, contents.Length, "200 OK", client);
SendToBrowser(Encoding.UTF8.GetBytes(contents), client);
}
}
}
}
public void SendHeaders(string httpVersion, string mimeHeader, int totalBytes, string statusCode, TcpClient tcpClient)
{
StringBuilder responseBuilder = new StringBuilder();
if (string.IsNullOrEmpty(mimeHeader))
mimeHeader = "text/html";
responseBuilder.Append(httpVersion);
responseBuilder.Append(' ');
responseBuilder.AppendLine(statusCode);
responseBuilder.AppendLine("Server: Fake Web Server");
responseBuilder.Append("Content-Type: ");
responseBuilder.AppendLine(mimeHeader);
responseBuilder.AppendLine("Accept-Ranges: bytes");
responseBuilder.Append("Content-Length: ");
responseBuilder.AppendLine(totalBytes.ToString());
responseBuilder.AppendLine("");
Byte[] bSendData = Encoding.UTF8.GetBytes(responseBuilder.ToString());
SendToBrowser(bSendData, tcpClient);
System.Diagnostics.Debug.WriteLine("Total Bytes : " + totalBytes.ToString());
}
public void SendToBrowser(Byte[] data, TcpClient tcpClient)
{
if (tcpClient.Connected)
{
NetworkStream stream = tcpClient.GetStream();
stream.Write(data, 0, data.Length);
stream.Flush();
}
else
{
System.Diagnostics.Debug.WriteLine("Connection Dropped....");
}
}
}
}