Skip to content

Commit b16483c

Browse files
committed
resolves #1621 return status 405
1 parent 6865551 commit b16483c

File tree

3 files changed

+56
-2
lines changed

3 files changed

+56
-2
lines changed

server/src/main/java/io/kroki/server/error/ErrorHandler.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -95,13 +95,18 @@ public void handle(RoutingContext context) {
9595
if (errorCode == 404) {
9696
statusMessage = "Not Found";
9797
errorMessage = statusMessage;
98-
} else if (failure instanceof BadRequestException || failure instanceof IllegalStateException) {
98+
} else if (failure instanceof BadRequestException
99+
|| failure instanceof IllegalStateException
100+
|| failure instanceof MethodNotAllowedException) {
99101
if (errorCode < 400 || errorCode >= 500) {
100102
errorCode = 400;
101103
statusMessage = "Bad Request";
102104
} else {
103105
statusMessage = statusMessageMap.getOrDefault(errorCode, "Bad Request");
104106
}
107+
if (failure instanceof MethodNotAllowedException) {
108+
context.response().putHeader("Allow", ((MethodNotAllowedException) failure).getAllowMethods());
109+
}
105110
errorMessage = failure.getMessage();
106111
if (failure instanceof BadRequestException) {
107112
htmlErrorMessage = ((BadRequestException) failure).getMessageHTML();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package io.kroki.server.error;
2+
3+
import java.util.List;
4+
5+
public class MethodNotAllowedException extends RuntimeException {
6+
7+
private final List<String> allowMethods;
8+
9+
public MethodNotAllowedException(List<String> allowMethods) {
10+
super();
11+
this.allowMethods = allowMethods;
12+
}
13+
14+
@Override
15+
public String getMessage() {
16+
return "Method not allowed. Please use a " + String.join(" or ", this.allowMethods) + " request.";
17+
}
18+
19+
public List<String> getAllowMethods() {
20+
return allowMethods;
21+
}
22+
}

server/src/main/java/io/kroki/server/service/DiagramRegistry.java

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package io.kroki.server.service;
22

3+
import io.kroki.server.error.MethodNotAllowedException;
4+
import io.kroki.server.error.UnsupportedFormatException;
35
import io.kroki.server.response.Caching;
6+
import io.vertx.core.http.HttpMethod;
47
import io.vertx.ext.web.Router;
58
import io.vertx.ext.web.handler.BodyHandler;
69

710
import java.util.HashMap;
11+
import java.util.List;
812
import java.util.Map;
913
import java.util.Set;
1014
import java.util.stream.Collectors;
1115

1216
public class DiagramRegistry {
1317

14-
private Map<String, DiagramHandler> registry = new HashMap<>();
18+
private final Map<String, DiagramHandler> registry = new HashMap<>();
1519
private final Router router;
1620
private final BodyHandler bodyHandler;
1721

@@ -27,10 +31,33 @@ public void register(DiagramService diagramService, String... names) {
2731
router.get("/" + name + "/:output_format/:source_encoded")
2832
.handler(diagramHandler.createRequestReceived(name))
2933
.handler(diagramHandler.createGet(name));
34+
router.route("/" + name)
35+
.handler(event -> {
36+
if (HttpMethod.POST.equals(event.request().method())) {
37+
event.next();
38+
return;
39+
}
40+
event.fail(405, new MethodNotAllowedException(List.of("POST")));
41+
});
3042
router.post("/" + name)
3143
.handler(bodyHandler)
3244
.handler(diagramHandler.createRequestReceived(name))
3345
.handler(diagramHandler.createPost(name));
46+
router.route("/" + name + "/:output_format")
47+
.handler(event -> {
48+
if (HttpMethod.POST.equals(event.request().method())) {
49+
event.next();
50+
return;
51+
}
52+
String outputFormat = event.pathParam("output_format");
53+
try {
54+
diagramHandler.validate(name, outputFormat);
55+
} catch (UnsupportedFormatException e) {
56+
event.fail(e);
57+
return;
58+
}
59+
event.fail(405, new MethodNotAllowedException(List.of("POST")));
60+
});
3461
router.post("/" + name + "/:output_format")
3562
.handler(bodyHandler)
3663
.handler(diagramHandler.createRequestReceived(name))

0 commit comments

Comments
 (0)