【问题标题】:Heroku: code=H18 "Server Request Interrupted" with minimal Java ServerHeroku:code=H18“服务器请求中断”,Java 服务器最少
【发布时间】:2019-06-12 00:42:57
【问题描述】:

http 服务器在本地与“heroku 本地网络”一起工作,但不在 heroku 云上。我总是收到错误:code=H18 desc="Server Request Interrupted" method=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

【问题讨论】:

    标签: http heroku


    【解决方案1】:

    事实证明,HTTP 响应必须使用\r\n 而不是\n。 RFC 2616 需要 CR LF。本地网络比 Heroku 路由器更宽容。

    https://www.rfc-editor.org/rfc/rfc2616#section-2.2:

    HTTP/1.1 将序列 CR LF 定义为 除实体主体外的所有协议元素(参见附录 19.3 宽容的应用)。实体主体内的行尾标记
    由其关联的媒体类型定义,如第 3.7 节所述。

       CRLF           = CR LF
    

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多