C# Получение сайта с изображениями и css с веб-запросами. - PullRequest
0 голосов
/ 06 февраля 2020

Я написал базовый 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. Как можно восстановить весь сайт.

...