#c# #http #tcpclient
#c# #http #tcpclient
Вопрос:
По сути, я создаю HTTP-библиотеку, поэтому я использую TcpClient для создания сокет-соединения и отправки HTTP-заголовков и прочего.
Теперь я могу получить HTML-код google.com , но я не могу для pastebin.com и stackoverflow.com например, когда я пытаюсь это сделать, я продолжаю получать ошибку «301 перемещен навсегда», несмотря ни на что. Кроме того, раздел «Местоположение» совпадает с входным URL-адресом, поэтому я не понимаю: почему он так сломан?
Вот код, который выполняет запрос :
var parsedUrl = ParseUrl();
var array = parsedUrl.Split('/');
var host = array[0];
var subpages = array[1];
Socket = new TcpClient(host, 80)
{
ReceiveBufferSize = BufferSize
};
var buffer = new byte[BufferSize];
var headers = new StringBuilder();
headers.AppendLine("GET /" subpages " HTTP/1.1");
headers.AppendLine("Host: " host);
foreach (var header in Headers) headers.AppendLine(header);
headers.AppendLine();
headers.AppendLine();
Socket.SendBufferSize = headers.Length;
var sent = Socket.Client.Send(Encoding.ASCII.GetBytes(headers.ToString()));
var received = Socket.Client.Receive(buffer);
var response = new RawResponseNET()
{
Url = parsedUrl,
BufferSize = BufferSize,
BytesSent = sent,
BytesReceived = received,
Request = this,
Buffer = buffer,
SocketStream = Socket.GetStream(),
BufferIndex = BinaryMatch(buffer, Encoding.ASCII.GetBytes("rnrn")) 4
};
response.ResponseHeaders = Encoding.UTF8.GetString(buffer, 0, response.BufferIndex);
Socket.Close();
return response;
RawResponseNET
Класс просто содержит метод с именем ToString()
, который будет просто анализировать ответ в виде строки.
Заголовки, которые я добавляю (исключая Host), являются Accept: text/html, charset=utf-8
и Connection: close
. Я попытался добавить еще несколько заголовков (в том числе некоторые, когда мой веб-браузер выполняет запрос), но безуспешно.
Вот как выглядят заголовки ответов для pastebin.com :
HTTP/1.1 301 Moved Permanently
Date: Sat, 03 Oct 2020 12:50:09 GMT
Transfer-Encoding: chunked
Connection: close
Cache-Control: max-age=3600
Expires: Sat, 03 Oct 2020 13:50:09 GMT
Location: https://www.pastebin.com/
cf-request-id: 05901c48e80000ee2ffca20200000001
Server: cloudflare
CF-RAY: 5dc6c987ddcbee2f-CDG
Итак, мой последний вопрос: как мне решить эту проблему?
Комментарии:
1. Из интереса, почему вы создаете HTTP-библиотеку с нуля? Это просто упражнение, чтобы узнать, как все работает на более низком уровне?
2. Почему вы не используете WebClient вместо этого?
3. @John это для того, чтобы знать, как все работает на более низком уровне, как вы сказали.
4. Ваш первоначальный запрос направлен
http://
в илиhttps://
? Перенаправление для pastebin заключается вhttps://
5. 443 — это порт для https, вам нужно будет установить соединение через TLS