Commit 64e5a2e0 by Spencer Gibb

protect against a null RequestDispatcher

parent 758d86e7
...@@ -6,6 +6,8 @@ import com.netflix.zuul.context.RequestContext; ...@@ -6,6 +6,8 @@ import com.netflix.zuul.context.RequestContext;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import javax.servlet.RequestDispatcher;
/** /**
* @author Spencer Gibb * @author Spencer Gibb
*/ */
...@@ -42,10 +44,17 @@ public class SendErrorFilter extends ZuulFilter { ...@@ -42,10 +44,17 @@ public class SendErrorFilter extends ZuulFilter {
ctx.getRequest().setAttribute("javax.servlet.error.exception", e); ctx.getRequest().setAttribute("javax.servlet.error.exception", e);
} }
ctx.getRequest().setAttribute("javax.servlet.error.status_code", statusCode); 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) { } catch (Exception e) {
Throwables.propagate(e); Throwables.propagate(e);
} }
return null; return null;
} }
public void setErrorPath(String errorPath) {
this.errorPath = errorPath;
}
} }
...@@ -81,6 +81,14 @@ public class SampleZuulProxyApplicationTests { ...@@ -81,6 +81,14 @@ public class SampleZuulProxyApplicationTests {
assertEquals("Deleted!", result.getBody()); 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 //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