protect against a null RequestDispatcher
This commit is contained in:
@@ -6,6 +6,8 @@ import com.netflix.zuul.context.RequestContext;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
|
||||
import javax.servlet.RequestDispatcher;
|
||||
|
||||
/**
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
@@ -42,10 +44,17 @@ public class SendErrorFilter extends ZuulFilter {
|
||||
ctx.getRequest().setAttribute("javax.servlet.error.exception", e);
|
||||
}
|
||||
ctx.getRequest().setAttribute("javax.servlet.error.status_code", statusCode);
|
||||
ctx.getRequest().getRequestDispatcher(errorPath).forward(ctx.getRequest(), ctx.getResponse());
|
||||
RequestDispatcher dispatcher = ctx.getRequest().getRequestDispatcher(errorPath);
|
||||
if (dispatcher != null) {
|
||||
dispatcher.forward(ctx.getRequest(), ctx.getResponse());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Throwables.propagate(e);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public void setErrorPath(String errorPath) {
|
||||
this.errorPath = errorPath;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,6 +81,14 @@ public class SampleZuulProxyApplicationTests {
|
||||
assertEquals("Deleted!", result.getBody());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testNotFound() {
|
||||
ResponseEntity<String> result = new TestRestTemplate().exchange(
|
||||
"http://localhost:" + port + "/myinvalidpath", HttpMethod.GET,
|
||||
new HttpEntity<Void>((Void) null), String.class);
|
||||
assertEquals(HttpStatus.NOT_FOUND, result.getStatusCode());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//Don't use @SpringBootApplication because we don't want to component scan
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package org.springframework.cloud.netflix.zuul.filters.post;
|
||||
|
||||
import com.netflix.zuul.context.RequestContext;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.mock.web.MockHttpServletRequest;
|
||||
import org.springframework.mock.web.MockHttpServletResponse;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
/**
|
||||
* @author Spencer Gibb
|
||||
*/
|
||||
public class SendErrorFilterTests {
|
||||
|
||||
@After
|
||||
public void reset() {
|
||||
RequestContext.testSetCurrentContext(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void runsNormally() {
|
||||
SendErrorFilter filter = createSendErrorFilter(new MockHttpServletRequest());
|
||||
|
||||
assertTrue("shouldFilter returned false", filter.shouldFilter());
|
||||
filter.run();
|
||||
}
|
||||
|
||||
private SendErrorFilter createSendErrorFilter(HttpServletRequest request) {
|
||||
RequestContext context = new RequestContext();
|
||||
context.setRequest(request);
|
||||
context.setResponse(new MockHttpServletResponse());
|
||||
context.set("error.status_code", HttpStatus.NOT_FOUND.value());
|
||||
RequestContext.testSetCurrentContext(context);
|
||||
SendErrorFilter filter = new SendErrorFilter();
|
||||
filter.setErrorPath("/error");
|
||||
return filter;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void noRequestDispatcher() {
|
||||
SendErrorFilter filter = createSendErrorFilter(mock(HttpServletRequest.class));
|
||||
|
||||
assertTrue("shouldFilter returned false", filter.shouldFilter());
|
||||
filter.run();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user