protect against a null RequestDispatcher

This commit is contained in:
Spencer Gibb
2015-01-07 11:54:27 -07:00
parent 758d86e793
commit 64e5a2e0ba
3 changed files with 69 additions and 1 deletions

View File

@@ -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;
}
}

View File

@@ -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

View File

@@ -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();
}
}