特定本地主机路径的 ERR_EMPTY_RESPONSE

时间:2021-01-30 21:45:17

标签: java google-chrome safari httpserver

我创建了一个带有上下文的本地 HttpServer,用于在 OAuth 授权过程中处理重定向。在重定向过程中,服务器接收 URL 中的键值对,我将其解析并存储在 queryPairs 中。如果 queryPairs 不为空,我会显示两个 HTML 文件之一。如果 queryPairs 为空,那么我尝试显示“HTML/NoQueries.html”文件。但是,当我启动我的应用程序并搜索“http://localhost:80/Authorization”(并期望显示 HTML/NoQueries.html 文件)时,Safari 显示它“无法打开页面,因为服务器意外断开连接”。 Chrome 会发送一条“ERR_EMPTY_RESPONSE”错误消息,指明“本地主机未发送任何数据”。

我已验证所有 HTML 文件都可以正常工作。我已经确认“http://localhost:80/Authorization?paramA=valueA”和“http://localhost:80/Authorization?paramB=valueB”是有效的。我还确认,当收到 !state.equals(queryPairs.get("state")) 响应代码时。我看过[这个问题] (Ktor Netty Server is returning empty response)。

我应该如何解决错误消息并显示 HTML/NoQueries.html 文件?

感谢您的帮助!

HttpServer server = HttpServer.create(new InetSocketAddress(80), 0);
server.createContext("/Authorization", new AuthorizationHandler());
server.setExecutor(null);
server.start();

static class AuthorizationHandler implements HttpHandler {
    public void handle(HttpExchange exchange) throws IOException {
        if (exchange.getRequestMethod().equals("GET")) {
            String[] pairs = exchange.getRequestURI().getQuery().split("&");
            for (String pair : pairs) {
                int idx = pair.indexOf("=");
                final String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), StandardCharsets.UTF_8) : pair;
                final String value = idx > 0 && pair.length() > idx + 1 ? URLDecoder.decode(pair.substring(idx + 1), StandardCharsets.UTF_8) : null;
                queryPairs.put(key, value);
            }
            if (queryPairs.size() != 0) {
                if (state.equals(queryPairs.get("state"))) {
                    if (queryPairs.containsKey("paramA")) {
                        File file = new File("HTML/FileA.html");
                        exchange.sendResponseHeaders(200, file.length());
                        try (OutputStream os = exchange.getResponseBody()) {
                            Files.copy(file.toPath(), os);
                        }
                        try {
                            methodA();
                            methodB();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    } else if (queryPairs.containsKey("paramB")) {
                        File file = new File("HTML/FileB.html");
                        exchange.sendResponseHeaders(200, file.length());
                        try (OutputStream os = exchange.getResponseBody()) {
                            Files.copy(file.toPath(), os);
                        }
                    }
                } else {
                    exchange.sendResponseHeaders(403, -1);
                }
            } else {
                System.out.println("No Queries");
                File file = new File("HTML/NoQueries.html");
                exchange.sendResponseHeaders(200, file.length());
                try (OutputStream os = exchange.getResponseBody()) {
                    Files.copy(file.toPath(), os);
                }
            }
        } else {
            exchange.sendResponseHeaders(501, -1);
        }
    }
}

0 个答案:

没有答案
相关问题