Ответ "301 Moved Permanently" при GET запросе через сокет java

Я отправляю GET запрос через Socket на Java таким образом:

        ip = InetAddress.getByName(new URL("https://habr.com/ru/post/215117/").getHost());
       
        socket = new Socket(ip, 80); //Создаю сокет
       
        PrintWriter wtr = new PrintWriter(socket.getOutputStream());

        wtr.print("GET /ru/post/215117/ HTTP/1.1\r\n");
        wtr.print("Host: habr.com\r\n");
        wtr.print("\r\n");
        wtr.flush();  //Отправляю запрос

К какому ресурсу я бы не обращался результат один:

HTTP/1.1 301 Moved Permanently
        Server: QRATOR
        Date: Tue, 15 Dec 2020 15:25:56 GMT               
        Content-Type: text/html
        Content-Length: 162
        Connection: keep-alive 
        Keep-Alive: timeout=15
        Location: https://habr.com/ru/post/215117/

В ответе ошибка 301 иногда 302, как я понимаю она указывает, что сайт или страница переехали на другой адрес, который указывается в поле "Location". Проблема в том, что адрес в поле Location совпадает с тем куда я отправляю запрос, в чем ошибка?


Ответы (1 шт):

Автор решения: Владимир Карсанов

Давайте для подключения по протоколу https использовать немного другой сокет и немного другой порт (443 обычно, а не 80, как у http). Ваш код должен выглядеть как-то так:

InetAddress ip = InetAddress.getByName(new URL("https://habr.com").getHost());

SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLSocket socket = (SSLSocket) factory.createSocket(ip, 443);

InputStream is = socket.getInputStream();

PrintWriter wtr = new PrintWriter(socket.getOutputStream());

wtr.print("GET /ru/post/215117/ HTTP/1.1\r\n");
wtr.print("Host: habr.com\r\n");
wtr.print("\r\n");
wtr.flush();  //Отправляю запрос

//Это вывод в консоль. У вас он, вероятно свой
byte[] buffer = new byte[1024];
int read;
while ((read = is.read(buffer)) != -1) {
    String output = new String(buffer, 0, read);
    System.out.print(output);
    System.out.flush();
};
socket.close();
→ Ссылка