forked from jooby-project/jooby
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTraceHandler.java
More file actions
47 lines (40 loc) · 1.33 KB
/
TraceHandler.java
File metadata and controls
47 lines (40 loc) · 1.33 KB
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
/**
* Jooby https://jooby.io
* Apache License Version 2.0 https://jooby.io/LICENSE.txt
* Copyright 2014 Edgar Espina
*/
package io.jooby;
import javax.annotation.Nonnull;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* The TRACE method performs a message loop-back test along the path to the target resource.
*
* @author edgar
* @since 2.0.4
*/
public class TraceHandler implements Route.Decorator {
private static final String CRLF = "\r\n";
@Nonnull @Override public Route.Handler apply(@Nonnull Route.Handler next) {
return ctx -> {
if (ctx.getMethod().equals(Router.TRACE)) {
// Handle trace
StringBuilder buffer = new StringBuilder(Router.TRACE).append(" ").append(ctx.getRequestPath())
.append(" ").append(ctx.getProtocol());
for (Map.Entry<String, List<String>> entry : ctx.headerMultimap().entrySet()) {
buffer.append(CRLF).append(entry.getKey()).append(": ")
.append(entry.getValue().stream().collect(Collectors.joining(", ")));
}
buffer.append(CRLF);
ctx.setResponseType("message/http");
return ctx.send(buffer.toString());
} else {
return next.apply(ctx);
}
};
}
@Nonnull @Override public void setRoute(@Nonnull Route route) {
route.setHttpTrace(true);
}
}