Skip to content

Commit 83ec03e

Browse files
committed
Add flag to control when headers are reset on error
- fix #1383 - fix #1299
1 parent 16920bd commit 83ec03e

File tree

4 files changed

+77
-3
lines changed

4 files changed

+77
-3
lines changed

jooby/src/main/java/org/jooby/Response.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,14 @@ public String toString() {
416416
return rsp.toString();
417417
}
418418

419+
@Override public boolean isResetHeadersOnError() {
420+
return rsp.isResetHeadersOnError();
421+
}
422+
423+
@Override public void setResetHeadersOnError(boolean value) {
424+
this.setResetHeadersOnError(value);
425+
}
426+
419427
/**
420428
* Unwrap a response in order to find out the target instance.
421429
*
@@ -848,4 +856,18 @@ default Response status(final int status) {
848856
* @see Route.After
849857
*/
850858
void complete(Route.Complete handler);
859+
860+
/**
861+
* Indicates if headers are cleared/reset on error.
862+
*
863+
* @return Indicates if headers are cleared/reset on error. Default is true.
864+
*/
865+
boolean isResetHeadersOnError();
866+
867+
/**
868+
* Indicates if headers are cleared/reset on error.
869+
*
870+
* @param value True to reset.
871+
*/
872+
void setResetHeadersOnError(boolean value);
851873
}

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

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,8 @@ public class ResponseImpl implements Response {
280280

281281
private Optional<String> byteRange;
282282

283+
private boolean resetHeadersOnError = true;
284+
283285
public ResponseImpl(final RequestImpl req, final ParserExecutor parserExecutor,
284286
final NativeResponse rsp, final Route route, final List<Renderer> renderers,
285287
final Map<String, Renderer> rendererMap, final Map<String, Object> locals,
@@ -296,6 +298,14 @@ public ResponseImpl(final RequestImpl req, final ParserExecutor parserExecutor,
296298
this.byteRange = byteRange;
297299
}
298300

301+
@Override public boolean isResetHeadersOnError() {
302+
return resetHeadersOnError;
303+
}
304+
305+
@Override public void setResetHeadersOnError(boolean resetHeadersOnError) {
306+
this.resetHeadersOnError = resetHeadersOnError;
307+
}
308+
299309
@Override
300310
public void download(final String filename, final InputStream stream) throws Throwable {
301311
requireNonNull(filename, "A file's name is required.");
@@ -585,9 +595,11 @@ private void writeCookies() {
585595
}
586596

587597
public void reset() {
588-
status = null;
589-
this.cookies.clear();
590-
rsp.reset();
598+
if (resetHeadersOnError) {
599+
status = null;
600+
this.cookies.clear();
601+
rsp.reset();
602+
}
591603
}
592604

593605
void route(final Route route) {

jooby/src/test/java/org/jooby/ResponseTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,14 @@
1717
public class ResponseTest {
1818
public static class ResponseMock implements Response {
1919

20+
@Override public boolean isResetHeadersOnError() {
21+
throw new UnsupportedOperationException();
22+
}
23+
24+
@Override public void setResetHeadersOnError(boolean value) {
25+
throw new UnsupportedOperationException();
26+
}
27+
2028
@Override
2129
public void download(final String filename, final InputStream stream) throws Exception {
2230
throw new UnsupportedOperationException();
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package org.jooby.issues;
2+
3+
import org.jooby.test.ServerFeature;
4+
import org.junit.Test;
5+
6+
public class Issue1299 extends ServerFeature {
7+
8+
{
9+
use("*", (req, rsp) -> {
10+
if (req.param("noreset").booleanValue(false)) {
11+
rsp.setResetHeadersOnError(false);
12+
}
13+
});
14+
get("/1299", req -> {
15+
req.flash("error", "error");
16+
return req.param("missing").value();
17+
});
18+
19+
err((req, rsp, x) -> {
20+
rsp.status(200).end();
21+
});
22+
}
23+
24+
@Test
25+
public void shouldNotResetHeaders() throws Exception {
26+
request()
27+
.get("/1299")
28+
.expect(200)
29+
.header("Set-Cookie", (String) null);
30+
}
31+
32+
}

0 commit comments

Comments
 (0)