You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Roland Dobsai <ro...@gmail.com> on 2015/01/26 14:45:01 UTC
replace getRequestCycle().scheduleRequestHandlerAfterCurrent
Hi we're using getRequestCycle().scheduleRequestHandlerAfterCurrent,
various places in our application which causes 500 error, is there any we
to replace, lines below because my solution which is:
String url = RequestCycle.get().urlFor(rs).toString();
throw new RedirectToUrlException(url);
doesn't work.
///
ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(
new StringResourceStream(work, "text/csv"));
rs.setFileName("Workdone_" +
projectModel.getObject().getName().replaceAll("[^a-zA-Z0-9]", "") + ".csv");
this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
or another example I was trying to replace
ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(new
FileResourceStream(new File(file.getAbsolutePath())));
rs.setFileName(df.getFileName());
this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
with this, but doesnt work either:
String url = (RequestCycle.get().urlFor(rs)).toString();
throw new RedirectToUrlException(url);
thanks for any help
Re: replace getRequestCycle().scheduleRequestHandlerAfterCurrent
Posted by Roland Dobsai <ro...@gmail.com>.
It seems we cannot reproduce this locally - only in production. Difference
being apache is in front of tomcat. If we comment out the following code we
have no issues:
setPageRendererProvider(new IPageRendererProvider() {
@Override public PageRenderer get(final RenderPageRequestHandler
context) {
return new WebPageRenderer(context) {
@Override protected RedirectPolicy getRedirectPolicy()
{
RedirectPolicy result;
if (!((WebRequest)
RequestCycle.get().getRequest()).isAjax() && (context.getPage() instanceof
ExternalShareSecurePage || context.getPage() instanceof
ExternalShareDocumentPage)) {
result =
RedirectPolicy.NEVER_REDIRECT;
} else {
result = super.getRedirectPolicy();
} return result;
}
};
}
});
2015-01-26 14:17 GMT+00:00 Martin Grigorov <mg...@apache.org>:
> Wicket by default buffers the write/flush of the markup to the browser
> until the end of the the request cycle.
>
> The exception says that the application has already written some
> bytes/characters to the browser and it is not possible to make a redirect,
> because the response headers are already sent.
>
> Put a breakpoint at RelativeUrlServletResponseFilter#write() methods and
> see when and why it is being called earlier.
>
> Martin Grigorov
> Wicket Training and Consulting
> https://twitter.com/mtgrigorov
>
> On Mon, Jan 26, 2015 at 4:06 PM, Roland Dobsai <ro...@gmail.com>
> wrote:
>
> > thanks for a replay, yes there is an exception in a log
> >
> > here's an example
> >
> >
> > HTTP Status 500 - Cannot call sendRedirect() after the response has been
> > committed
> > ------------------------------
> >
> > *type* Exception report
> >
> > *message* *Cannot call sendRedirect() after the response has been
> > committed*
> >
> > *description* *The server encountered an internal error that prevented it
> > from fulfilling this request.*
> >
> > *exception*
> >
> > java.lang.IllegalStateException: Cannot call sendRedirect() after the
> > response has been committed
> >
> >
> org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:482)
> >
> >
> javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:137)
> >
> >
> hub.app.servlet.RelativeUrlFilter$RelativeUrlServletResponseFilter.sendRedirect(RelativeUrlFilter.java:106)
> >
> >
> org.apache.wicket.protocol.http.servlet.ServletWebResponse.sendRedirect(ServletWebResponse.java:268)
> >
> >
> org.apache.wicket.protocol.http.BufferedWebResponse$SendRedirectAction.invoke(BufferedWebResponse.java:400)
> >
> >
> org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:588)
> >
> >
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.stopBuffering(HeaderBufferingWebResponse.java:60)
> >
> >
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.flush(HeaderBufferingWebResponse.java:97)
> >
> >
> org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:269)
> >
> >
> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
> >
> >
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
> >
> > hub.app.servlet.RelativeUrlFilter.doFilter(RelativeUrlFilter.java:54)
> >
> >
> com.wideplay.warp.persist.PersistenceFilter$3.run(PersistenceFilter.java:141)
> >
> >
> com.wideplay.warp.persist.internal.Lifecycles.failEarlyAndLeaveNoOneBehind(Lifecycles.java:29)
> >
> >
> com.wideplay.warp.persist.PersistenceFilter.doFilter(PersistenceFilter.java:155)
> >
> > *note* *The full stack trace of the root cause is available in the Apache
> > Tomcat/7.0.55 logs.*
> >
> >
> > 2015-01-26 13:59 GMT+00:00 Martin Grigorov <mg...@apache.org>:
> >
> > > Hi,
> > >
> > > Error 500 means that there must be an exception in the logs. What is
> it ?
> > >
> > > What exactly "doesn't work" means in your case ? Another exception, or
> > > no-op behavior, or ... ? Please give more details.
> > >
> > > Martin Grigorov
> > > Wicket Training and Consulting
> > > https://twitter.com/mtgrigorov
> > >
> > > On Mon, Jan 26, 2015 at 3:45 PM, Roland Dobsai <
> roland.dobsai@gmail.com>
> > > wrote:
> > >
> > > > Hi we're using getRequestCycle().scheduleRequestHandlerAfterCurrent,
> > > > various places in our application which causes 500 error, is there
> any
> > we
> > > > to replace, lines below because my solution which is:
> > > > String url = RequestCycle.get().urlFor(rs).toString();
> > > > throw new RedirectToUrlException(url);
> > > > doesn't work.
> > > >
> > > > ///
> > > > ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(
> > > > new StringResourceStream(work, "text/csv"));
> > > > rs.setFileName("Workdone_" +
> > > > projectModel.getObject().getName().replaceAll("[^a-zA-Z0-9]", "") +
> > > > ".csv");
> > > >
> > > > this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
> > > >
> > > > or another example I was trying to replace
> > > >
> > > > ResourceStreamRequestHandler rs = new
> ResourceStreamRequestHandler(new
> > > > FileResourceStream(new File(file.getAbsolutePath())));
> > > > rs.setFileName(df.getFileName());
> > > >
> > > this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
> > > >
> > > > with this, but doesnt work either:
> > > > String url = (RequestCycle.get().urlFor(rs)).toString();
> > > > throw new RedirectToUrlException(url);
> > > >
> > > > thanks for any help
> > > >
> > >
> >
>
Re: replace getRequestCycle().scheduleRequestHandlerAfterCurrent
Posted by Martin Grigorov <mg...@apache.org>.
Wicket by default buffers the write/flush of the markup to the browser
until the end of the the request cycle.
The exception says that the application has already written some
bytes/characters to the browser and it is not possible to make a redirect,
because the response headers are already sent.
Put a breakpoint at RelativeUrlServletResponseFilter#write() methods and
see when and why it is being called earlier.
Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov
On Mon, Jan 26, 2015 at 4:06 PM, Roland Dobsai <ro...@gmail.com>
wrote:
> thanks for a replay, yes there is an exception in a log
>
> here's an example
>
>
> HTTP Status 500 - Cannot call sendRedirect() after the response has been
> committed
> ------------------------------
>
> *type* Exception report
>
> *message* *Cannot call sendRedirect() after the response has been
> committed*
>
> *description* *The server encountered an internal error that prevented it
> from fulfilling this request.*
>
> *exception*
>
> java.lang.IllegalStateException: Cannot call sendRedirect() after the
> response has been committed
>
> org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:482)
>
> javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:137)
>
> hub.app.servlet.RelativeUrlFilter$RelativeUrlServletResponseFilter.sendRedirect(RelativeUrlFilter.java:106)
>
> org.apache.wicket.protocol.http.servlet.ServletWebResponse.sendRedirect(ServletWebResponse.java:268)
>
> org.apache.wicket.protocol.http.BufferedWebResponse$SendRedirectAction.invoke(BufferedWebResponse.java:400)
>
> org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:588)
>
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.stopBuffering(HeaderBufferingWebResponse.java:60)
>
> org.apache.wicket.protocol.http.HeaderBufferingWebResponse.flush(HeaderBufferingWebResponse.java:97)
>
> org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:269)
>
> org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
>
> org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
>
> hub.app.servlet.RelativeUrlFilter.doFilter(RelativeUrlFilter.java:54)
>
> com.wideplay.warp.persist.PersistenceFilter$3.run(PersistenceFilter.java:141)
>
> com.wideplay.warp.persist.internal.Lifecycles.failEarlyAndLeaveNoOneBehind(Lifecycles.java:29)
>
> com.wideplay.warp.persist.PersistenceFilter.doFilter(PersistenceFilter.java:155)
>
> *note* *The full stack trace of the root cause is available in the Apache
> Tomcat/7.0.55 logs.*
>
>
> 2015-01-26 13:59 GMT+00:00 Martin Grigorov <mg...@apache.org>:
>
> > Hi,
> >
> > Error 500 means that there must be an exception in the logs. What is it ?
> >
> > What exactly "doesn't work" means in your case ? Another exception, or
> > no-op behavior, or ... ? Please give more details.
> >
> > Martin Grigorov
> > Wicket Training and Consulting
> > https://twitter.com/mtgrigorov
> >
> > On Mon, Jan 26, 2015 at 3:45 PM, Roland Dobsai <ro...@gmail.com>
> > wrote:
> >
> > > Hi we're using getRequestCycle().scheduleRequestHandlerAfterCurrent,
> > > various places in our application which causes 500 error, is there any
> we
> > > to replace, lines below because my solution which is:
> > > String url = RequestCycle.get().urlFor(rs).toString();
> > > throw new RedirectToUrlException(url);
> > > doesn't work.
> > >
> > > ///
> > > ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(
> > > new StringResourceStream(work, "text/csv"));
> > > rs.setFileName("Workdone_" +
> > > projectModel.getObject().getName().replaceAll("[^a-zA-Z0-9]", "") +
> > > ".csv");
> > >
> > > this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
> > >
> > > or another example I was trying to replace
> > >
> > > ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(new
> > > FileResourceStream(new File(file.getAbsolutePath())));
> > > rs.setFileName(df.getFileName());
> > >
> > this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
> > >
> > > with this, but doesnt work either:
> > > String url = (RequestCycle.get().urlFor(rs)).toString();
> > > throw new RedirectToUrlException(url);
> > >
> > > thanks for any help
> > >
> >
>
Re: replace getRequestCycle().scheduleRequestHandlerAfterCurrent
Posted by Roland Dobsai <ro...@gmail.com>.
thanks for a replay, yes there is an exception in a log
here's an example
HTTP Status 500 - Cannot call sendRedirect() after the response has been
committed
------------------------------
*type* Exception report
*message* *Cannot call sendRedirect() after the response has been committed*
*description* *The server encountered an internal error that prevented it
from fulfilling this request.*
*exception*
java.lang.IllegalStateException: Cannot call sendRedirect() after the
response has been committed
org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:482)
javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:137)
hub.app.servlet.RelativeUrlFilter$RelativeUrlServletResponseFilter.sendRedirect(RelativeUrlFilter.java:106)
org.apache.wicket.protocol.http.servlet.ServletWebResponse.sendRedirect(ServletWebResponse.java:268)
org.apache.wicket.protocol.http.BufferedWebResponse$SendRedirectAction.invoke(BufferedWebResponse.java:400)
org.apache.wicket.protocol.http.BufferedWebResponse.writeTo(BufferedWebResponse.java:588)
org.apache.wicket.protocol.http.HeaderBufferingWebResponse.stopBuffering(HeaderBufferingWebResponse.java:60)
org.apache.wicket.protocol.http.HeaderBufferingWebResponse.flush(HeaderBufferingWebResponse.java:97)
org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:269)
org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:201)
org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:282)
hub.app.servlet.RelativeUrlFilter.doFilter(RelativeUrlFilter.java:54)
com.wideplay.warp.persist.PersistenceFilter$3.run(PersistenceFilter.java:141)
com.wideplay.warp.persist.internal.Lifecycles.failEarlyAndLeaveNoOneBehind(Lifecycles.java:29)
com.wideplay.warp.persist.PersistenceFilter.doFilter(PersistenceFilter.java:155)
*note* *The full stack trace of the root cause is available in the Apache
Tomcat/7.0.55 logs.*
2015-01-26 13:59 GMT+00:00 Martin Grigorov <mg...@apache.org>:
> Hi,
>
> Error 500 means that there must be an exception in the logs. What is it ?
>
> What exactly "doesn't work" means in your case ? Another exception, or
> no-op behavior, or ... ? Please give more details.
>
> Martin Grigorov
> Wicket Training and Consulting
> https://twitter.com/mtgrigorov
>
> On Mon, Jan 26, 2015 at 3:45 PM, Roland Dobsai <ro...@gmail.com>
> wrote:
>
> > Hi we're using getRequestCycle().scheduleRequestHandlerAfterCurrent,
> > various places in our application which causes 500 error, is there any we
> > to replace, lines below because my solution which is:
> > String url = RequestCycle.get().urlFor(rs).toString();
> > throw new RedirectToUrlException(url);
> > doesn't work.
> >
> > ///
> > ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(
> > new StringResourceStream(work, "text/csv"));
> > rs.setFileName("Workdone_" +
> > projectModel.getObject().getName().replaceAll("[^a-zA-Z0-9]", "") +
> > ".csv");
> >
> > this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
> >
> > or another example I was trying to replace
> >
> > ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(new
> > FileResourceStream(new File(file.getAbsolutePath())));
> > rs.setFileName(df.getFileName());
> >
> this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
> >
> > with this, but doesnt work either:
> > String url = (RequestCycle.get().urlFor(rs)).toString();
> > throw new RedirectToUrlException(url);
> >
> > thanks for any help
> >
>
Re: replace getRequestCycle().scheduleRequestHandlerAfterCurrent
Posted by Martin Grigorov <mg...@apache.org>.
Hi,
Error 500 means that there must be an exception in the logs. What is it ?
What exactly "doesn't work" means in your case ? Another exception, or
no-op behavior, or ... ? Please give more details.
Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov
On Mon, Jan 26, 2015 at 3:45 PM, Roland Dobsai <ro...@gmail.com>
wrote:
> Hi we're using getRequestCycle().scheduleRequestHandlerAfterCurrent,
> various places in our application which causes 500 error, is there any we
> to replace, lines below because my solution which is:
> String url = RequestCycle.get().urlFor(rs).toString();
> throw new RedirectToUrlException(url);
> doesn't work.
>
> ///
> ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(
> new StringResourceStream(work, "text/csv"));
> rs.setFileName("Workdone_" +
> projectModel.getObject().getName().replaceAll("[^a-zA-Z0-9]", "") +
> ".csv");
>
> this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
>
> or another example I was trying to replace
>
> ResourceStreamRequestHandler rs = new ResourceStreamRequestHandler(new
> FileResourceStream(new File(file.getAbsolutePath())));
> rs.setFileName(df.getFileName());
> this.getRequestCycle().scheduleRequestHandlerAfterCurrent(rs);
>
> with this, but doesnt work either:
> String url = (RequestCycle.get().urlFor(rs)).toString();
> throw new RedirectToUrlException(url);
>
> thanks for any help
>