Почему я получаю ошибку «301 перемещен навсегда» при выполнении HTTP-запроса с помощью TcpClient?

#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