Skip to content

Commit 8a3308c

Browse files
committed
Add ability to turn of stack traces for Err,handle results in production fix jooby-project#856
1 parent 0b6e84f commit 8a3308c

File tree

8 files changed

+45
-87
lines changed

8 files changed

+45
-87
lines changed

jooby/src/main/java/org/jooby/Err.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,8 @@
207207
import java.util.Map;
208208
import java.util.Optional;
209209

210+
import com.typesafe.config.Config;
211+
import org.jooby.funzy.Try;
210212
import org.slf4j.Logger;
211213
import org.slf4j.LoggerFactory;
212214

@@ -282,11 +284,13 @@ public static class DefHandler implements Err.Handler {
282284
public void handle(final Request req, final Response rsp, final Err ex) throws Throwable {
283285
log.error("execution of: {}{} resulted in exception\nRoute:\n{}\n\nStacktrace:",
284286
req.method(), req.path(), req.route().print(6), ex);
285-
287+
Config conf = req.require(Config.class);
288+
boolean stackstrace = Try.apply(() -> conf.getBoolean("err.stacktrace"))
289+
.orElse(req.require(Env.class).name().equals("dev"));
286290
rsp.send(
287291
Results
288-
.when(MediaType.html, () -> Results.html(VIEW).put("err", ex.toMap()))
289-
.when(MediaType.all, () -> ex.toMap()));
292+
.when(MediaType.html, () -> Results.html(VIEW).put("err", ex.toMap(stackstrace)))
293+
.when(MediaType.all, () -> ex.toMap(stackstrace)));
290294
}
291295

292296
}
@@ -434,23 +438,39 @@ public int statusCode() {
434438
*
435439
* <pre>
436440
* message: exception message (if present)
437-
* stacktrace: array with the stacktrace
438441
* status: status code
439442
* reason: a status code reason
440443
* </pre>
441444
*
442445
* @return A lightweight view of the err.
443446
*/
444447
public Map<String, Object> toMap() {
448+
return toMap(false);
449+
}
450+
451+
/**
452+
* Produces a friendly view of the err, resulting map has these attributes:
453+
*
454+
* <pre>
455+
* message: exception message (if present)
456+
* stacktrace: array with the stacktrace
457+
* status: status code
458+
* reason: a status code reason
459+
* </pre>
460+
*
461+
* @param stacktrace True for adding stacktrace.
462+
* @return A lightweight view of the err.
463+
*/
464+
public Map<String, Object> toMap(boolean stacktrace) {
445465
Status status = Status.valueOf(this.status);
446466
Throwable cause = Optional.ofNullable(getCause()).orElse(this);
447467
String message = Optional.ofNullable(cause.getMessage()).orElse(status.reason());
448468

449-
String[] stacktrace = Throwables.getStackTraceAsString(cause).replace("\r", "").split("\\n");
450-
451469
Map<String, Object> err = new LinkedHashMap<>();
452470
err.put("message", message);
453-
err.put("stacktrace", stacktrace);
471+
if (stacktrace) {
472+
err.put("stacktrace", Throwables.getStackTraceAsString(cause).replace("\r", "").split("\\n"));
473+
}
454474
err.put("status", status.value());
455475
err.put("reason", status.reason());
456476

jooby/src/main/java/org/jooby/Jooby.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2887,10 +2887,7 @@ private Injector bootstrap(final Config args,
28872887
binder.bind(ParserExecutor.class).in(Singleton.class);
28882888

28892889
/** override(able) renderer */
2890-
boolean stacktrace = finalConfig.hasPath("err.stacktrace")
2891-
? finalConfig.getBoolean("err.stacktrace")
2892-
: "dev".equals(envname);
2893-
renderers.addBinding().toInstance(new DefaulErrRenderer(stacktrace));
2890+
renderers.addBinding().toInstance(new DefaulErrRenderer());
28942891
renderers.addBinding().toInstance(BuiltinRenderer.text);
28952892

28962893
binder.bind(HttpHandler.class).to(HttpHandlerImpl.class).in(Singleton.class);

jooby/src/main/java/org/jooby/internal/DefaulErrRenderer.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -213,12 +213,6 @@
213213

214214
public class DefaulErrRenderer implements Renderer {
215215

216-
private boolean showStacktrace;
217-
218-
public DefaulErrRenderer(final boolean stacktrace) {
219-
this.showStacktrace = stacktrace;
220-
}
221-
222216
@SuppressWarnings("unchecked")
223217
@Override
224218
public void render(final Object object, final Context ctx) throws Exception {
@@ -230,7 +224,7 @@ public void render(final Object object, final Context ctx) throws Exception {
230224
Object status = model.get("status");
231225
Object reason = model.get("reason");
232226
Object message = model.get("message");
233-
String[] stacktrace = this.showStacktrace ? (String[]) model.get("stacktrace") : null;
227+
String[] stacktrace = (String[]) model.get("stacktrace");
234228

235229
StringBuilder html = new StringBuilder("<!doctype html>\n")
236230
.append("<html>\n")

jooby/src/test/java/org/jooby/DefaultErrHandlerTest.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import java.io.StringWriter;
99
import java.util.Map;
1010

11+
import com.typesafe.config.Config;
1112
import org.jooby.test.MockUnit;
1213
import org.junit.Test;
1314
import org.junit.runner.RunWith;
@@ -31,7 +32,7 @@ public void handleNoErrMessage() throws Exception {
3132
ex.printStackTrace(new PrintWriter(writer));
3233
String[] stacktrace = writer.toString().replace("\r", "").split("\\n");
3334

34-
new MockUnit(Request.class, Response.class, Route.class)
35+
new MockUnit(Request.class, Response.class, Route.class, Config.class, Env.class)
3536
.expect(unit -> {
3637
Logger log = unit.mock(Logger.class);
3738
log.error("execution of: {}{} resulted in exception\nRoute:\n{}\n\nStacktrace:", "GET",
@@ -43,8 +44,14 @@ public void handleNoErrMessage() throws Exception {
4344
Route route = unit.get(Route.class);
4445
expect(route.print(6)).andReturn("route");
4546

47+
Config conf = unit.get(Config.class);
48+
Env env = unit.get(Env.class);
49+
expect(env.name()).andReturn("dev");
50+
4651
Request req = unit.get(Request.class);
4752

53+
expect(req.require(Config.class)).andReturn(conf);
54+
expect(req.require(Env.class)).andReturn(env);
4855
expect(req.path()).andReturn("/path");
4956
expect(req.method()).andReturn("GET");
5057
expect(req.route()).andReturn(route);
@@ -80,7 +87,7 @@ public void handleWithErrMessage() throws Exception {
8087
ex.printStackTrace(new PrintWriter(writer));
8188
String[] stacktrace = writer.toString().replace("\r", "").split("\\n");
8289

83-
new MockUnit(Request.class, Response.class, Route.class)
90+
new MockUnit(Request.class, Response.class, Route.class, Env.class, Config.class)
8491
.expect(unit -> {
8592
Logger log = unit.mock(Logger.class);
8693
log.error("execution of: {}{} resulted in exception\nRoute:\n{}\n\nStacktrace:", "GET",
@@ -92,8 +99,15 @@ public void handleWithErrMessage() throws Exception {
9299
Route route = unit.get(Route.class);
93100
expect(route.print(6)).andReturn("route");
94101

102+
Config conf = unit.get(Config.class);
103+
Env env = unit.get(Env.class);
104+
expect(env.name()).andReturn("dev");
105+
95106
Request req = unit.get(Request.class);
96107

108+
expect(req.require(Config.class)).andReturn(conf);
109+
expect(req.require(Env.class)).andReturn(env);
110+
97111
expect(req.path()).andReturn("/path");
98112
expect(req.method()).andReturn("GET");
99113
expect(req.route()).andReturn(route);

modules/coverage-report/pom.xml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,6 @@
8787
<source>${project.parent.basedir}/jooby-unbescape/src/main/java</source>
8888
<source>${project.parent.basedir}/jooby-thymeleaf/src/main/java</source>
8989
<source>${project.parent.basedir}/jooby-filewatcher/src/main/java</source>
90-
<source>${project.parent.basedir}/jooby-lang-js/src/main/java</source>
9190
<source>${project.parent.basedir}/jooby-requery/src/main/java</source>
9291
<source>${project.parent.basedir}/jooby-rocker/src/main/java</source>
9392
<source>${project.parent.basedir}/jooby-neo4j/src/main/java</source>
@@ -153,7 +152,6 @@
153152
<source>${project.parent.basedir}/jooby-unbescape/src/test/java</source>
154153
<source>${project.parent.basedir}/jooby-thymeleaf/src/test/java</source>
155154
<source>${project.parent.basedir}/jooby-filewatcher/src/test/java</source>
156-
<source>${project.parent.basedir}/jooby-lang-js/src/test/java</source>
157155
<source>${project.parent.basedir}/jooby-requery/src/test/java</source>
158156
<source>${project.parent.basedir}/jooby-rocker/src/test/java</source>
159157
<source>${project.parent.basedir}/jooby-neo4j/src/test/java</source>
@@ -356,12 +354,6 @@
356354
<version>${project.version}</version>
357355
</dependency>
358356

359-
<dependency>
360-
<groupId>org.jooby</groupId>
361-
<artifactId>jooby-lang-js</artifactId>
362-
<version>${project.version}</version>
363-
</dependency>
364-
365357
<dependency>
366358
<groupId>org.jooby</groupId>
367359
<artifactId>jooby-spymemcached</artifactId>

modules/coverage-report/src/test/java/org/jooby/js/JsApp.java

Lines changed: 0 additions & 16 deletions
This file was deleted.

modules/coverage-report/src/test/java/org/jooby/js/JsAppFeature.java

Lines changed: 0 additions & 30 deletions
This file was deleted.

modules/coverage-report/src/test/java/org/jooby/js/Pets.java

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)