Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not try to forward if response is commited. Fixes #452 #454

Merged
merged 2 commits into from
Mar 22, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions vraptor-core/src/main/java/br/com/caelum/vraptor/VRaptor.java
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
import org.slf4j.Logger;

import br.com.caelum.vraptor.core.StaticContentHandler;
import br.com.caelum.vraptor.events.EndRequest;
import br.com.caelum.vraptor.events.NewRequest;
import br.com.caelum.vraptor.events.VRaptorInitialized;
import br.com.caelum.vraptor.http.EncodingHandler;
Expand Down Expand Up @@ -76,9 +75,6 @@ public class VRaptor implements Filter {
@Inject
private Event<NewRequest> newRequestEvent;

@Inject
private Event<EndRequest> endRequestEvent;

@Override
public void init(FilterConfig cfg) throws ServletException {
servletContext = cfg.getServletContext();
Expand Down Expand Up @@ -120,7 +116,6 @@ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throw new ServletException(e.getMessage(), e.getCause());
}

endRequestEvent.fire(new EndRequest());
logger.debug("VRaptor ended the request");
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
package br.com.caelum.vraptor.events;

import br.com.caelum.vraptor.http.MutableRequest;
import br.com.caelum.vraptor.http.MutableResponse;

public class EndRequest {

private final MutableRequest request;
private final MutableResponse response;

public EndRequest(MutableRequest request, MutableResponse response) {
this.request = request;
this.response = response;
}

public MutableRequest getRequest() {
return request;
}

public MutableResponse getResponse() {
return response;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,11 @@ public ForwardToDefaultView(Result result) {
}

public void forward(@Observes EndRequest event) {
if (result.used()) {
if (result.used() || event.getResponse().isCommitted()) {
logger.debug("Request already dispatched and commited somewhere else, not forwarding.");
return;
}
// TODO: maybe the response.isCommited is true, we should warn before
// trying to forward

logger.debug("forwarding to the dafault page for this logic");
result.use(Results.page()).defaultView();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import br.com.caelum.vraptor.controller.MethodNotAllowedHandler;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.events.ControllerFound;
import br.com.caelum.vraptor.events.EndRequest;
import br.com.caelum.vraptor.events.NewRequest;
import br.com.caelum.vraptor.http.UrlToControllerTranslator;
import br.com.caelum.vraptor.http.route.ControllerNotFoundException;
Expand All @@ -56,21 +57,26 @@ public class RequestHandlerObserver {
private final Event<ControllerFound> controllerFoundEvent;
private final InterceptorStack interceptorStack;

private Event<EndRequest> endRequestEvent;

/**
* @deprecated CDI eyes only
*/
protected RequestHandlerObserver() {
this(null, null, null, null, null);
this(null, null, null, null, null, null);
}

@Inject
public RequestHandlerObserver(UrlToControllerTranslator translator,
ControllerNotFoundHandler controllerNotFoundHandler, MethodNotAllowedHandler methodNotAllowedHandler,
Event<ControllerFound> event, InterceptorStack interceptorStack) {
Event<ControllerFound> controllerFoundEvent,
Event<EndRequest> endRequestEvent,
InterceptorStack interceptorStack) {
this.translator = translator;
this.methodNotAllowedHandler = methodNotAllowedHandler;
this.controllerNotFoundHandler = controllerNotFoundHandler;
this.controllerFoundEvent = event;
this.controllerFoundEvent = controllerFoundEvent;
this.endRequestEvent = endRequestEvent;
this.interceptorStack = interceptorStack;
}

Expand All @@ -80,6 +86,7 @@ public void handle(@Observes NewRequest event, CDIRequestFactories factories) {
ControllerMethod method = translator.translate(event.getRequest());
controllerFoundEvent.fire(new ControllerFound(method));
interceptorStack.start();
endRequestEvent.fire(new EndRequest(event.getRequest(), event.getResponse()));
} catch (ControllerNotFoundException e) {
controllerNotFoundHandler.couldntFind(event.getChain(), event.getRequest(), event.getResponse());
} catch (MethodNotAllowedException e) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,20 @@
import br.com.caelum.vraptor.core.MethodInfo;
import br.com.caelum.vraptor.events.EndRequest;
import br.com.caelum.vraptor.events.MethodExecuted;
import br.com.caelum.vraptor.http.MutableRequest;
import br.com.caelum.vraptor.http.MutableResponse;
import br.com.caelum.vraptor.view.MockedPage;
import br.com.caelum.vraptor.view.PageResult;

@RunWith(MockitoJUnitRunner.class)
public class ForwardToDefaultViewTest {

private ForwardToDefaultView interceptor;
@Mock private Result result;
@Mock private ControllerMethod method;
@Mock private MethodInfo methodInfo;
private @Mock Result result;
private @Mock ControllerMethod method;
private @Mock MethodInfo methodInfo;
private @Mock MutableRequest request;
private @Mock MutableResponse response;

@Before
public void setup() {
Expand All @@ -51,15 +55,22 @@ public void setup() {
@Test
public void doesNothingIfResultWasAlreadyUsed() {
when(result.used()).thenReturn(true);
interceptor.forward(new EndRequest());
interceptor.forward(new EndRequest(request, response));
verify(result, never()).use(PageResult.class);
}

@Test
public void doesNothingIfResponseIsCommited() {
when(response.isCommitted()).thenReturn(true);
interceptor.forward(new EndRequest(request, response));
verify(result, never()).use(PageResult.class);
}

@Test
public void shouldForwardToViewWhenResultWasNotUsed() {
when(result.used()).thenReturn(false);
when(result.use(PageResult.class)).thenReturn(new MockedPage());
interceptor.forward(new EndRequest());
interceptor.forward(new EndRequest(request, response));
verify(result).use(PageResult.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.any;

import java.util.EnumSet;

Expand All @@ -30,6 +31,7 @@
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;

import br.com.caelum.vraptor.controller.ControllerMethod;
Expand All @@ -38,6 +40,7 @@
import br.com.caelum.vraptor.controller.MethodNotAllowedHandler;
import br.com.caelum.vraptor.core.InterceptorStack;
import br.com.caelum.vraptor.events.ControllerFound;
import br.com.caelum.vraptor.events.EndRequest;
import br.com.caelum.vraptor.events.NewRequest;
import br.com.caelum.vraptor.http.MutableRequest;
import br.com.caelum.vraptor.http.MutableResponse;
Expand All @@ -55,15 +58,16 @@ public class RequestHandlerObserverTest {
private RequestHandlerObserver observer;
private @Mock ControllerNotFoundHandler notFoundHandler;
private @Mock MethodNotAllowedHandler methodNotAllowedHandler;
private @Mock Event<ControllerFound> event;
private @Mock Event<ControllerFound> controllerFoundEvent;
private @Mock Event<EndRequest> endRequestEvent;
private @Mock InterceptorStack interceptorStack;
private @Mock FilterChain chain;

@Before
public void config() {
MockitoAnnotations.initMocks(this);
newRequest = new NewRequest(chain, webRequest, webResponse);
observer = new RequestHandlerObserver(translator, notFoundHandler, methodNotAllowedHandler, event, interceptorStack);
observer = new RequestHandlerObserver(translator, notFoundHandler, methodNotAllowedHandler, controllerFoundEvent, endRequestEvent, interceptorStack);
}

@Test
Expand All @@ -90,4 +94,20 @@ public void shouldUseControllerMethodFoundWithNextInterceptor() throws Exception
observer.handle(newRequest, new CDIRequestFactories());
verify(interceptorStack).start();
}

@Test
public void shouldFireTheControllerWasFound() throws Exception {
final ControllerMethod method = mock(ControllerMethod.class);
when(translator.translate(webRequest)).thenReturn(method);
observer.handle(newRequest, new CDIRequestFactories());
verify(controllerFoundEvent).fire(any(ControllerFound.class));
}

@Test
public void shouldFireTheRequestSuceeded() throws Exception {
final ControllerMethod method = mock(ControllerMethod.class);
when(translator.translate(webRequest)).thenReturn(method);
observer.handle(newRequest, new CDIRequestFactories());
verify(endRequestEvent).fire(any(EndRequest.class));
}
}