Undertow Core HTTPS 服务器给出 400 Bad Request
Undertow Core HTTPS server gives 400 Bad Request
我使用 io.undertow.core 设置了 Java HTTPS 服务器,创建了 HttpListener,看起来我的代码很完美,但是......它不起作用。它会根据任何请求给我 400 Bad Request。
下面是undertow、http等相关的代码:
package ru.epserv.epmodule.modules.serverapi;
import org.bukkit.Bukkit;
import org.json.simple.JSONObject;
import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import ru.epserv.epmodule.modules.serverapi.contexts.BanwhyContext;
import ru.epserv.epmodule.modules.serverapi.contexts.FirstseenContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetPlayerContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetPlayersContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetWarningsContext;
import ru.epserv.epmodule.modules.serverapi.contexts.IsOnlineContext;
import ru.epserv.epmodule.modules.serverapi.contexts.LastseenContext;
import ru.epserv.epmodule.modules.serverapi.contexts.Ping;
import ru.epserv.epmodule.modules.serverapi.contexts.SendContext;
import ru.epserv.epmodule.modules.serverapi.contexts.SkillsContext;
import ru.epserv.epmodule.modules.serverapi.contexts.TimeplayedContext;
import ru.epserv.epmodule.modules.serverapi.contexts.UptimeContext;
import ru.epserv.epmodule.modules.serverapi.utils.ParsedRequest;
public class HTTPSServer {
public static String notFound;
public Undertow server;
@SuppressWarnings("unchecked")
public void start() {
JSONObject notFoundJSON = new JSONObject();
notFoundJSON.put("response", null);
notFoundJSON.put("error", "not_found");
HTTPSServer.notFound = notFoundJSON.toJSONString();
Ping ping = new Ping();
SendContext send = new SendContext();
GetPlayersContext list = new GetPlayersContext();
IsOnlineContext isOnline = new IsOnlineContext();
UptimeContext uptime = new UptimeContext();
FirstseenContext firstseen = new FirstseenContext();
LastseenContext lastseen = new LastseenContext();
TimeplayedContext timeplayed = new TimeplayedContext();
BanwhyContext banwhy = new BanwhyContext();
GetWarningsContext getWarnings = new GetWarningsContext();
SkillsContext skills = new SkillsContext();
GetPlayerContext getPlayer = new GetPlayerContext();
this.server = Undertow.builder()
.addHttpsListener(45105, "0.0.0.0", HTTPSServer.getSSLContextFromLetsEncrypt())
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange t) throws Exception {
ParsedRequest r = new ParsedRequest(t);
r.setResponseHeader("Access-Control-Allow-Origin", "*");
Bukkit.getLogger().warning(r.getRequestURI().getPath());
switch (r.getRequestURI().getPath().substring(1).trim()) {
case "ping":
ping.handle(r, t);
break;
case "send":
send.handle(r, t);
break;
case "list":
list.handle(r, t);
break;
case "isonline":
ServerAPI.log
.warn("Отправлен запрос на устаревший адрес https://mc.epserv.ru:45105/isonline, "
+ "используйте isOnline. Адрес подключения: "
+ r.getRemoteAddress().toString() + ". User-Agent: "
+ r.getRequestHeaders().getFirst("User-Agent") + ".");
isOnline.handle(r, t);
break;
case "isOnline":
isOnline.handle(r, t);
break;
case "uptime":
uptime.handle(r, t);
break;
case "firstseen":
firstseen.handle(r, t);
break;
case "lastseen":
lastseen.handle(r, t);
break;
case "timeplayed":
timeplayed.handle(r, t);
break;
case "banwhy":
banwhy.handle(r, t);
break;
case "getWarnings":
getWarnings.handle(r, t);
break;
case "skills":
skills.handle(r, t);
break;
case "getPlayer":
getPlayer.handle(r, t);
break;
default:
r.setResponseCode(404);
r.write(HTTPSServer.notFound);
r.send();
}
}
})
.build();
this.server.start();
}
public void stop() {
server.stop();
}
}
我还尝试使用 curl -v --data "" https://mc.epserv.ru:45105/list
获取更多信息,这是输出:
boom@kali:~$ curl -v --data "" https://mc.epserv.ru:45105/list
* Trying 5.228.179.67:45105...
* TCP_NODELAY set
* Connected to mc.epserv.ru (5.228.179.67) port 45105 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: CN=mc.epserv.ru
* start date: May 18 13:27:54 2020 GMT
* expire date: Aug 16 13:27:54 2020 GMT
* subjectAltName: host "mc.epserv.ru" matched cert's "mc.epserv.ru"
* issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
* SSL certificate verify ok.
> POST /list HTTP/1.1
> Host: mc.epserv.ru:45105
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 0
> Content-Type: application/x-www-form-urlencoded
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Content-Length: 0
< Connection: close
<
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, close notify (256):
我尝试使用 AccessLogHandler
、RequestDumpingHandler
,但什么也没有,Undertow 没有记录任何内容并继续响应 400 Bad Request。
我做错了什么?我发现了一个错误还是什么?怎么了?
如有需要请向我询问更多信息,如果我的英语不好请见谅
问题已解决 - 我再次使用 mvn install
(来自 https://github.com/undertow-io/undertow
存储库)构建了 Undertow,现在它按预期工作了。这可能是 Undertow 2.1.2.Final-SNAPSHOT 的错误,但在 Undertow 2.1.4.Final-SNAPSHOT 上一切正常。
我使用 io.undertow.core 设置了 Java HTTPS 服务器,创建了 HttpListener,看起来我的代码很完美,但是......它不起作用。它会根据任何请求给我 400 Bad Request。
下面是undertow、http等相关的代码:
package ru.epserv.epmodule.modules.serverapi;
import org.bukkit.Bukkit;
import org.json.simple.JSONObject;
import io.undertow.Undertow;
import io.undertow.server.HttpHandler;
import io.undertow.server.HttpServerExchange;
import ru.epserv.epmodule.modules.serverapi.contexts.BanwhyContext;
import ru.epserv.epmodule.modules.serverapi.contexts.FirstseenContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetPlayerContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetPlayersContext;
import ru.epserv.epmodule.modules.serverapi.contexts.GetWarningsContext;
import ru.epserv.epmodule.modules.serverapi.contexts.IsOnlineContext;
import ru.epserv.epmodule.modules.serverapi.contexts.LastseenContext;
import ru.epserv.epmodule.modules.serverapi.contexts.Ping;
import ru.epserv.epmodule.modules.serverapi.contexts.SendContext;
import ru.epserv.epmodule.modules.serverapi.contexts.SkillsContext;
import ru.epserv.epmodule.modules.serverapi.contexts.TimeplayedContext;
import ru.epserv.epmodule.modules.serverapi.contexts.UptimeContext;
import ru.epserv.epmodule.modules.serverapi.utils.ParsedRequest;
public class HTTPSServer {
public static String notFound;
public Undertow server;
@SuppressWarnings("unchecked")
public void start() {
JSONObject notFoundJSON = new JSONObject();
notFoundJSON.put("response", null);
notFoundJSON.put("error", "not_found");
HTTPSServer.notFound = notFoundJSON.toJSONString();
Ping ping = new Ping();
SendContext send = new SendContext();
GetPlayersContext list = new GetPlayersContext();
IsOnlineContext isOnline = new IsOnlineContext();
UptimeContext uptime = new UptimeContext();
FirstseenContext firstseen = new FirstseenContext();
LastseenContext lastseen = new LastseenContext();
TimeplayedContext timeplayed = new TimeplayedContext();
BanwhyContext banwhy = new BanwhyContext();
GetWarningsContext getWarnings = new GetWarningsContext();
SkillsContext skills = new SkillsContext();
GetPlayerContext getPlayer = new GetPlayerContext();
this.server = Undertow.builder()
.addHttpsListener(45105, "0.0.0.0", HTTPSServer.getSSLContextFromLetsEncrypt())
.setHandler(new HttpHandler() {
@Override
public void handleRequest(final HttpServerExchange t) throws Exception {
ParsedRequest r = new ParsedRequest(t);
r.setResponseHeader("Access-Control-Allow-Origin", "*");
Bukkit.getLogger().warning(r.getRequestURI().getPath());
switch (r.getRequestURI().getPath().substring(1).trim()) {
case "ping":
ping.handle(r, t);
break;
case "send":
send.handle(r, t);
break;
case "list":
list.handle(r, t);
break;
case "isonline":
ServerAPI.log
.warn("Отправлен запрос на устаревший адрес https://mc.epserv.ru:45105/isonline, "
+ "используйте isOnline. Адрес подключения: "
+ r.getRemoteAddress().toString() + ". User-Agent: "
+ r.getRequestHeaders().getFirst("User-Agent") + ".");
isOnline.handle(r, t);
break;
case "isOnline":
isOnline.handle(r, t);
break;
case "uptime":
uptime.handle(r, t);
break;
case "firstseen":
firstseen.handle(r, t);
break;
case "lastseen":
lastseen.handle(r, t);
break;
case "timeplayed":
timeplayed.handle(r, t);
break;
case "banwhy":
banwhy.handle(r, t);
break;
case "getWarnings":
getWarnings.handle(r, t);
break;
case "skills":
skills.handle(r, t);
break;
case "getPlayer":
getPlayer.handle(r, t);
break;
default:
r.setResponseCode(404);
r.write(HTTPSServer.notFound);
r.send();
}
}
})
.build();
this.server.start();
}
public void stop() {
server.stop();
}
}
我还尝试使用 curl -v --data "" https://mc.epserv.ru:45105/list
获取更多信息,这是输出:
boom@kali:~$ curl -v --data "" https://mc.epserv.ru:45105/list
* Trying 5.228.179.67:45105...
* TCP_NODELAY set
* Connected to mc.epserv.ru (5.228.179.67) port 45105 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* ALPN, server did not agree to a protocol
* Server certificate:
* subject: CN=mc.epserv.ru
* start date: May 18 13:27:54 2020 GMT
* expire date: Aug 16 13:27:54 2020 GMT
* subjectAltName: host "mc.epserv.ru" matched cert's "mc.epserv.ru"
* issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
* SSL certificate verify ok.
> POST /list HTTP/1.1
> Host: mc.epserv.ru:45105
> User-Agent: curl/7.68.0
> Accept: */*
> Content-Length: 0
> Content-Type: application/x-www-form-urlencoded
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Content-Length: 0
< Connection: close
<
* Closing connection 0
* TLSv1.2 (OUT), TLS alert, close notify (256):
我尝试使用 AccessLogHandler
、RequestDumpingHandler
,但什么也没有,Undertow 没有记录任何内容并继续响应 400 Bad Request。
我做错了什么?我发现了一个错误还是什么?怎么了? 如有需要请向我询问更多信息,如果我的英语不好请见谅
问题已解决 - 我再次使用 mvn install
(来自 https://github.com/undertow-io/undertow
存储库)构建了 Undertow,现在它按预期工作了。这可能是 Undertow 2.1.2.Final-SNAPSHOT 的错误,但在 Undertow 2.1.4.Final-SNAPSHOT 上一切正常。