Я написал базовый c веб-сервер. Действительно базовый c один. Я подумал, может быть, я смогу превратить его в веб-прокси-сервер. Мой HTTP веб-сервер может только принимать запросы и отправлять ответы на них. Поэтому, когда программа получает запрос, я делаю следующее. Например, пользователь вводит
(My webserver IP):(port)/www.google.com
Я получаю www.google.com из заголовка моего запроса и отправляю запрос на www.google.com, использую потоковую программу чтения сайта и отправляю его обратно в качестве ответа. Тем не менее, я не получаю некоторые вещи, такие как изображения или css.
Вот код
using System;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Web;
using HtmlAgilityPack;
namespace WebServerTry
{
class Program
{
static void Main(string[] args)
{
Server s = new Server(37463);
s.Start();
Console.Read();
}
}
// Server
class Server
{
int port = 0;
public Server(int port)
{
this.port = port;
}
Socket sock;
IPEndPoint ip;
public void Start()
{
sock = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
string str = Dns.GetHostName();
Console.WriteLine(str);
ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);
sock.Bind(ip);
Console.WriteLine("Bound");
sock.Listen(65535);
sock.BeginAccept(0, new AsyncCallback(OnAccept), sock);
}
byte[] byt;
byte[] byt1;
Socket s;
public void OnAccept(IAsyncResult res)
{
try
{
int z = 0;
res.AsyncWaitHandle.WaitOne();
s = sock.EndAccept(out byt1, out z, res);
Console.WriteLine("Transferred initial data {0}", z);
Console.WriteLine("Accepted Connection to " + s.RemoteEndPoint.ToString() + "::::" + s.LocalEndPoint.ToString());
byt = new byte[4096];
if (s.Connected == true)
{
Console.WriteLine("Connection established.");
s.BeginReceive(byt, 0, byt.Length,
SocketFlags.None, new AsyncCallback(OnReceive), 0);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void OnReceive(IAsyncResult res)
{
try
{
res.AsyncWaitHandle.WaitOne();
s.EndReceive(res);
string bytstr = Encoding.ASCII.GetString(byt);
Console.WriteLine(bytstr);
string sb1 = bytstr.Split('\n')[0].Split(' ')[1].Substring(1);
string strResponse = "HTTP/1.1 200 OK\r\n";
string responseHeader = "Content-Type: text/html\r\n\r\n";
string downloadString = "";
Console.WriteLine(sb1);
downloadString = getWebsiteAsHTML("http://" + sb1);
Console.WriteLine("Response acquired.");
//
// Somehow manipulate downloadString to get css and Images
//
if (downloadString == "") downloadString = File.ReadAllText("./404.htm");
string responseBody = downloadString;
var full = Encoding.ASCII.GetBytes(strResponse + responseHeader + responseBody);
s.BeginSend(full, 0, full.Length, 0, new AsyncCallback(OnSend), sock);
byt = new byte[4096];
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public bool checkWebsite(string URL)
{
try
{
WebClient wc = new WebClient();
string HTMLSource = wc.DownloadString(URL);
return true;
}
catch (Exception)
{
return false;
}
}
public string getWebsiteAsHTML(string url)
{
WebClient client = new WebClient();
WebRequest req = WebRequest.Create(url);
WebResponse response = req.GetResponse();
var stream = response.GetResponseStream();
StreamReader strr = new StreamReader(stream);
return strr.ReadToEnd();
}
public void OnSend(IAsyncResult res)
{
s.EndSend(res);
s.Disconnect(true);
s.Close();
s.Dispose();
sock.BeginAccept(new AsyncCallback(OnAccept), 0);
}
}
}
Проблема: я не могу получить связанные вещи, такие как изображения или css. Как можно восстановить весь сайт.