Http клиент-сервер с прокси
Всем привет, решил я значит сделать прогу для фильтрации трафика, чтобы была возможность блокировать загрузку сайтов, которые я внёс в ЧС, а открывать вместо них сайты-аналоги, так вот, сделал установку проксей в систему, чтобы браузеры хватали и использовали именно их(прокси - localhost), так вот перешёл я к самой реализации клиента и сервера, но что-то не получается, возможно из-за того, что я не до конца понимаю, как это должно работать, но я смог поднять простейшие Tcp сервер, использую TcpListener, оттуда я могу спокойно выводить запросы, которые идут на нужный мне прокси(локалхост), но далее я не могу никак работать с этими запросами, пытался поднять сервер с помощью HttpListener, да и в общем пространства имён System.Net, использую различные методы Http, но, не выходит, вот код, в котором я пытался что-то делать, помогите, пожалуйста, кто чем сможет. Мне нужно, чтобы сервер принимал пакеты от клиента(браузера), обрабатывал их, если нужно, подменял ссылку, но я так думаю, что там дело не столько в сервере, сколько в клиенте, потому что мне изначально нужно принимать пакеты клиента(браезура), а потом сервером отвечать на них(т.е. делать так, чтобы страница открывалась в браузере). (В урле много комментариев, так как это всё неудачные попытки реализации клиент-сервера).
Сразу скажу, что пользователь @aepot предлагал мне готовые решения, точнее, библиотеку для работы с запросами и вообще клиент-серверным взаимодействием, скидывал ссылки на на темы, где были готовые решения, но я так не хочу, хочу разобраться и иметь понимание в этом, я, конечно, мог взять код с некоторых тем, но там не было комментариев, следовательно, я мог что-то неправильно понять, а далее не иметь правильного понимания структуры программы, но я делаю это для своего понимая, опыта, а не для галочки, та же история с библиотекой TitaniumWebProxy, которая сделала бы всё за меня.
public static void Server(string message)
{
//var Listener = new HttpListener();
//Console.WriteLine($"http://{ip}:{port}/");
//Listener.Prefixes.Add($"http://{ip}:{port}/");
//Listener.Start();
Console.WriteLine("Сервер пошёл!");
while (true)
{
//HttpListenerContext context = Listener.GetContext();
//HttpListenerRequest req = context.Request;
//Console.WriteLine($"Полученный пакет от: {req.Url}");
//HttpListenerResponse resp = context.Response;
//resp.Headers.Set("Content-Type", "text/plain");
//string data = "Hello there!";
//byte[] buffer = Encoding.UTF8.GetBytes(data);
//resp.ContentLength64 = buffer.Length;
//Stream ros = resp.OutputStream;
//ros.Write(buffer, 0, buffer.Length);
}
}
public static void ServerClient()
{
TcpListener server = new TcpListener(IPAddress.Parse(ip), port);
try
{
server.Start();
Console.WriteLine("Сервер пошёл!");
while (true)
{
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Входящее подключение " + client.Client.RemoteEndPoint);
while (true)
{
//WaitMessage(client);
var stream = client.GetStream(); //Создаём сетевой поток для работы с клиентом
byte[] data = new byte[1024];
int bytes = stream.Read(data, 0, data.Length);
string message = Encoding.UTF8.GetString(data, 0, bytes);
string method = message.Split(' ')[0];
Console.WriteLine($"Сообщение: {message}, {method}");
//Server(message);
Thread.Sleep(1000);
//Prinyatie_command(message, client);
}
//client.Close();
}
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
} //доделать
public async Task ReceivePacket(string RemoteEndPoint)
{
//HttpMethod _method = method;
//var PrefixToListen = "http://"
try
{
HttpClient httpClient = new HttpClient();
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");
HttpResponseMessage response = httpClient.SendAsync(request).Result;
Console.WriteLine(response.Content);
Console.WriteLine(response.StatusCode.ToString());
//HttpClient httpClient = new HttpClient();
//HttpRequestMessage request = new HttpRequestMessage(_method, url);
//var headers = request.Headers;
//if (headers.Count() != 3)
//{
// Console.WriteLine("Бэд реквест");
// return;
//}
//HttpMethod __method = request.Method;
//Uri RequestUri = request.RequestUri;
//Version vewrsion = request.Version;
//MemoryStream ms = new MemoryStream();
//HttpContent content = new StreamContent(ms);
//HttpResponseMessage response = await httpClient.SendAsync(request);
//Console.WriteLine(response.StatusCode.ToString());
// await SendResponse(response);
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
}