forked from quarkusio/quarkus
-
Notifications
You must be signed in to change notification settings - Fork 0
/
DevConsolePostHandler.java
105 lines (92 loc) · 3.68 KB
/
DevConsolePostHandler.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package io.quarkus.devconsole.runtime.spi;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import io.netty.handler.codec.http.HttpHeaderNames;
import io.netty.handler.codec.http.HttpResponseStatus;
import io.vertx.core.Handler;
import io.vertx.core.MultiMap;
import io.vertx.ext.web.RoutingContext;
public abstract class DevConsolePostHandler implements Handler<RoutingContext> {
@Override
public void handle(RoutingContext event) {
if (event.getBody() != null) {
//really simple form data decoder
//but we can't really re-use the netty one
String data = event.getBodyAsString();
String[] parts = data.split("&");
MultiMap post = MultiMap.caseInsensitiveMultiMap();
for (String i : parts) {
String[] pair = i.split("=");
try {
post.add(URLDecoder.decode(pair[0], StandardCharsets.UTF_8.name()),
URLDecoder.decode(pair[1], StandardCharsets.UTF_8.name()));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
dispatch(event, post);
} else {
event.request().setExpectMultipart(true);
event.request().endHandler(new Handler<Void>() {
@Override
public void handle(Void ignore) {
dispatch(event, event.request().formAttributes());
}
});
}
}
protected void dispatch(RoutingContext event, MultiMap form) {
try {
handlePost(event, form);
actionSuccess(event);
return;
} catch (NotImplementedException e) {
// just go on and do async
} catch (Exception e) {
event.fail(e);
}
try {
new Thread(new Runnable() {
public void run() {
try {
handlePostAsync(event, form);
actionSuccess(event);
} catch (Exception e) {
event.fail(e);
}
}
}, "DEV Console action").start();
return;
} catch (NotImplementedException e) {
throw new RuntimeException("One of handlePost or handleAsyncPost must be implemented");
} catch (Exception e) {
event.fail(e);
}
}
protected void actionSuccess(RoutingContext event) {
if (!event.response().ended()) {
event.response().setStatusCode(HttpResponseStatus.SEE_OTHER.code()).headers()
.set(HttpHeaderNames.LOCATION, event.request().uri());
event.response().end();
}
}
protected void flashMessage(RoutingContext event, String message) {
FlashScopeUtil.setFlashMessage(event, message);
}
protected void flashMessage(RoutingContext event, String message, Duration displayTime) {
FlashScopeUtil.setFlashMessage(event, message, displayTime);
}
protected void flashMessage(RoutingContext event, String message, FlashScopeUtil.FlashMessageStatus messageStatus) {
FlashScopeUtil.setFlashMessage(event, message, messageStatus, null);
}
private static class NotImplementedException extends RuntimeException {
}
protected void handlePost(RoutingContext event, MultiMap form) throws Exception {
throw new NotImplementedException();
}
protected void handlePostAsync(RoutingContext event, MultiMap form) throws Exception {
throw new NotImplementedException();
}
}