我创建了一个带有上下文的本地 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);
}
}
}