Heroku: code = H18 «Запрос к серверу прерван» с минимальным Java-сервером - PullRequest
0 голосов
/ 11 июня 2019

http-сервер работает локально с 'heroku local web', но не в облаке heroku. Я всегда получаю сообщение об ошибке: code = H18 desc = Метод запроса сервера прерван = GET

Вот класс, это в основном сервер hello world. Не так много может пойти не так здесь:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Optional;

public class Server {

    public static void main(String[] args) throws Exception {
        int port = Integer.parseInt(Optional.ofNullable(System.getenv("PORT")).orElse("8080"));

        System.out.println("Server started: http://localhost:" + port);
        ServerSocket serverSocket = new ServerSocket(port);
        while (true) {
            Socket socket = serverSocket.accept();
            System.out.println("client connected: " + socket);
            new Thread(new ClientConnector(socket)).start();
        }
    }

    public static class ClientConnector implements Runnable {
        Socket socket;

        ClientConnector(Socket socket) {
            this.socket = socket;
        }

        public void run() {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
                OutputStreamWriter os = new OutputStreamWriter(socket.getOutputStream());
                PrintWriter printwriter = new PrintWriter(os);

                // Read request
                String line = reader.readLine();
                while (line != null && !line.isEmpty()) {
                    System.out.println("< " + line);

                    line = reader.readLine();
                }

                // print response
                String response = "HTTP/1.1 200 OK\n"
                        + "Content-Type: text/html\n"
                        + "Content-Length: 11\n"
                        + "\n"
                        + "hello world";
                printwriter.println(response);

                System.out.println("sent response");
                os.flush();
                socket.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

Вот полный пример журнала, запрос прочитан и ответ отправлен:

:00 heroku[router]: sock=backend at=error code=H18 desc="Server Request Interrupted" method=GET path="/" host=hidden-brook-63920.herokuapp.com request_id=936ffe14-adc2-4773-966e-44b1ce4b60d0 fwd="202.58.193.226" dyno=web.1 connect=0ms service=2ms status=503 bytes=72 protocol=https
app[web.1]: client connected: Socket[addr=/10.41.207.114,port=17962,localport=9405]
app[web.1]: < GET / HTTP/1.1
app[web.1]: < Host: hidden-brook-63920.herokuapp.com
app[web.1]: < Connection: close
app[web.1]: < Cache-Control: max-age=0
app[web.1]: < Upgrade-Insecure-Requests: 1
app[web.1]: < Total-Route-Time: 0
app[web.1]: sent response

1 Ответ

0 голосов
/ 11 июня 2019

Оказывается, что HTTP-ответ должен быть с \r\n, а не \n.RFC 2616 требует CR LF.Локальная сеть более терпима, чем маршрутизаторы Heroku.

https://tools.ietf.org/html/rfc2616#section-2.2:

HTTP / 1.1 определяет последовательность CR LF как маркер конца строки для всех элементов протокола, крометело объекта (см. приложение 19.3 для толерантных приложений).Маркер конца строки в теле объекта
определяется связанным с ним типом носителя, как описано в разделе 3.7.

   CRLF           = CR LF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...