Сокеты Java: HTTP / 1.1 505 Версия HTTP не поддерживается

Я создаю простой HTTP-клиент. Я последовал примеру кода из здесь, который работает для многих сайтов, кроме www.httbin.org. Когда я пробую www.httbin.org, я получаю следующую ошибку:

HTTP/1.1 505 HTTP Version Not Supported
Connection: close
Server: Cowboy
Date: Fri, 28 Sep 2018 16:28:50 GMT
Content-Length: 0

Я просмотрел другие ответы SO, но это не помогло.

Вот мой код для тестирования:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

public class Main {

    public static void main(String[] args) throws IOException {
        //Connection details
        InetAddress address =  InetAddress.getByName("www.httpbin.org");
        Socket mySocket = new Socket(address, 80);

        //Streams
        PrintWriter mySocketOutput = new PrintWriter(mySocket.getOutputStream(), true);

        InputStreamReader inputStreamReader = new InputStreamReader(mySocket.getInputStream());

        //Headers
        mySocketOutput.println("GET / HTTP/1.0");
        mySocketOutput.println("Host: www.httpbin.org");
        mySocketOutput.println("Connection: close");
        mySocketOutput.println();

        boolean loop = true;
        StringBuilder stringBuilder = new StringBuilder();

        //reading results from server
        while (loop) {
            if (inputStreamReader.ready()) {
                int currentChar = 0;
                while (currentChar != -1) {
                    currentChar =  inputStreamReader.read();
                    stringBuilder.append((char) currentChar);
                }
                loop = false;
            }
        }

        //print result
        System.out.println(stringBuilder.toString());
        mySocket.close();
    }
}

Кажется, вы делаете запрос HTTP / 1.0 на сервер, который поддерживает только HTTP / 1.1.

Julian Reschke 28.09.2018 19:29

@JulianReschke: интересная догадка, но неверная. Даже замена HTTP/1.0 на HTTP/1.1 не сработает - вместо \r\n в конце строки нужен \n (см. Мой ответ).

Steffen Ullrich 28.09.2018 19:52
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
509
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя ваш запрос похож на HTTP, это не так. Строка, оканчивающаяся на HTTP в соответствии со стандартом, - это \r\n, а не простой \n, как в случае с println. Если вы используете правильную строку, заканчивающуюся во всех местах (т.е. для каждой строки с содержимым, но также и для «пустой» строки, которая завершает заголовок запроса), она также будет работать с www.httpbin.org.

HTTP/1.1 505 HTTP Version Not Supported

Почему этот непонятный ответ сервера? Поскольку в вашем запросе нет надлежащего разделителя между заголовком HTTP и (пустым) телом HTTP, предполагается, что это запрос HTTP 0.9. Давно устаревший протокол HTTP 0.9 не требовал пустой строки, состоящей только из \r\n, в качестве конца заголовка запроса, поскольку в HTTP 0.9 вообще не было таких вещей, как заголовок и тело.

I'm creating a simple HTTP client.

Пожалуйста, не недооценивайте сложность написания правильного HTTP-клиента. Например, код, на который вы ссылались в качестве основы для вашего собственного клиента, не только использовал неправильный конец строки для запроса, но также утверждал, что поддерживает HTTP / 1.1, не имея возможности иметь дело с кодировкой фрагментированной передачи тела.

И, возможно, вам следует пропустить и другой код на этом веб-сайте, если вы действительно хотите изучить протоколы. По крайней мере, Тонкий SMTP-клиент также использует неработающую реализацию протокола.

Спасибо за ответ и время, мне удалось исправить код. После прочтения протокола HTTP я понял, что для него действительно требуется CLRF ("\r\n"). Мне было интересно, почему www.google.ca работает с моим текущим кодом, знаете ли? работает только с \n

Rana 28.09.2018 20:13

@Rana: Многие веб-серверы имеют дело со сломанными клиентами, которые используют неправильное окончание строки, поскольку достаточное количество самодельных клиентов не реализуют должным образом HTTP. Но не все серверы пытаются справиться с такими сломанными клиентами.

Steffen Ullrich 28.09.2018 20:15

Другие вопросы по теме