|
1 | 1 | package org.jooby; |
2 | 2 |
|
3 | 3 | import com.google.common.collect.ImmutableList; |
| 4 | +import com.google.common.escape.Escapers; |
| 5 | +import com.google.common.html.HtmlEscapers; |
4 | 6 | import com.typesafe.config.Config; |
5 | 7 | import static org.easymock.EasyMock.expect; |
6 | 8 | import org.jooby.test.MockUnit; |
|
15 | 17 |
|
16 | 18 | import java.io.PrintWriter; |
17 | 19 | import java.io.StringWriter; |
| 20 | +import java.util.LinkedHashMap; |
18 | 21 | import java.util.Map; |
19 | 22 |
|
20 | 23 | @RunWith(PowerMockRunner.class) |
@@ -66,6 +69,7 @@ private MockUnit.Block handleErr(Throwable ex, boolean stacktrace) { |
66 | 69 | expect(conf.getBoolean("err.stacktrace")).andReturn(stacktrace); |
67 | 70 | Env env = unit.get(Env.class); |
68 | 71 | expect(env.name()).andReturn("dev"); |
| 72 | + expect(env.xss("html")).andReturn(HtmlEscapers.htmlEscaper()::escape); |
69 | 73 |
|
70 | 74 | Request req = unit.get(Request.class); |
71 | 75 |
|
@@ -112,13 +116,45 @@ public void handleWithErrMessage() throws Exception { |
112 | 116 | }); |
113 | 117 | } |
114 | 118 |
|
| 119 | + @SuppressWarnings({"unchecked"}) |
| 120 | + @Test |
| 121 | + public void handleWithHtmlErrMessage() throws Exception { |
| 122 | + Err ex = new Err(500, "Something something <em>dark</em>"); |
| 123 | + |
| 124 | + StringWriter writer = new StringWriter(); |
| 125 | + ex.printStackTrace(new PrintWriter(writer)); |
| 126 | + String[] stacktrace = writer.toString().replace("\r", "").split("\\n"); |
| 127 | + |
| 128 | + new MockUnit(Request.class, Response.class, Route.class, Env.class, Config.class) |
| 129 | + .expect(handleErr(ex, true)) |
| 130 | + .run(unit -> { |
| 131 | + |
| 132 | + Request req = unit.get(Request.class); |
| 133 | + Response rsp = unit.get(Response.class); |
| 134 | + |
| 135 | + new Err.DefHandler().handle(req, rsp, ex); |
| 136 | + }, |
| 137 | + unit -> { |
| 138 | + Result result = unit.captured(Result.class).iterator().next(); |
| 139 | + View view = (View) result.ifGet(ImmutableList.of(MediaType.html)).get(); |
| 140 | + assertEquals("err", view.name()); |
| 141 | + checkErr(stacktrace, "Server Error(500): Something something <em>dark</em>", |
| 142 | + (Map<String, Object>) view.model() |
| 143 | + .get("err")); |
| 144 | + |
| 145 | + Object hash = result.ifGet(MediaType.ALL).get(); |
| 146 | + assertEquals(4, ((Map<String, Object>) hash).size()); |
| 147 | + }); |
| 148 | + } |
| 149 | + |
115 | 150 | private void checkErr(final String[] stacktrace, final String message, |
116 | 151 | final Map<String, Object> err) { |
117 | | - assertEquals(message, err.remove("message")); |
118 | | - assertEquals("Server Error", err.remove("reason")); |
119 | | - assertEquals(500, err.remove("status")); |
120 | | - assertArrayEquals(stacktrace, (String[]) err.remove("stacktrace")); |
121 | | - assertEquals(err.toString(), 0, err.size()); |
| 152 | + final Map<String, Object> copy = new LinkedHashMap<>(err); |
| 153 | + assertEquals(message, copy.remove("message")); |
| 154 | + assertEquals("Server Error", copy.remove("reason")); |
| 155 | + assertEquals(500, copy.remove("status")); |
| 156 | + assertArrayEquals(stacktrace, (String[]) copy.remove("stacktrace")); |
| 157 | + assertEquals(copy.toString(), 0, copy.size()); |
122 | 158 | } |
123 | 159 |
|
124 | 160 | } |
0 commit comments