Commit 64e5a2e0 by Spencer Gibb

protect against a null RequestDispatcher

parent 758d86e7
......@@ -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
......
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();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment