You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by pe...@apache.org on 2010/09/16 00:40:00 UTC

svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Author: pete
Date: Wed Sep 15 22:39:59 2010
New Revision: 997528

URL: http://svn.apache.org/viewvc?rev=997528&view=rev
Log:
fixed non-working ajax redirects: WICKET-3048

Modified:
    wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java

Modified: wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
==============================================================================
--- wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java (original)
+++ wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java Wed Sep 15 22:39:59 2010
@@ -104,8 +104,8 @@ public abstract class WebRequest extends
 	/**
 	 * Marker parameter for AjaxRequest.
 	 */
-	private static final String PARAM_AJAX = "wicket:ajax";
-	private static final String HEADER_AJAX = "Wicket-Ajax";
+	protected static final String PARAM_AJAX = "wicket:ajax";
+	protected static final String HEADER_AJAX = "Wicket-Ajax";
 
 	/**
 	 * Returns whether this request is an Ajax request. This implementation only checks for value of

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java Wed Sep 15 22:39:59 2010
@@ -371,4 +371,23 @@ public class ServletWebRequest extends W
 	{
 		return RequestUtils.getCharset(httpServletRequest);
 	}
+
+	@Override
+	public boolean isAjax()
+	{
+		return isAjax(httpServletRequest);
+	}
+
+	/**
+	 * check if random http servlet request is an ajax request
+	 *
+	 * @param httpServletRequest web request
+	 * @return <code>true</code> if ajax, <code>false</code> if regular request
+	 */
+	public static boolean isAjax(HttpServletRequest httpServletRequest)
+	{
+		// TODO there is some redundancy in this method and WebRequest#isAjax - can this be eliminated?
+		return Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) ||
+			Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX));
+	}
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=997528&r1=997527&r2=997528&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java Wed Sep 15 22:39:59 2010
@@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args;
 
 /**
  * WebResponse that wraps a {@link ServletWebResponse}.
- * 
+ *
  * @author Matej Knopp
  */
 public class ServletWebResponse extends WebResponse
@@ -41,7 +41,7 @@ public class ServletWebResponse extends 
 
 	/**
 	 * Construct.
-	 * 
+	 *
 	 * @param httpServletRequest
 	 * @param httpServletResponse
 	 */
@@ -57,7 +57,7 @@ public class ServletWebResponse extends 
 
 	/**
 	 * Returns the wrapped response
-	 * 
+	 *
 	 * @return wrapped response
 	 */
 	public final HttpServletResponse getHttpServletResponse()
@@ -223,25 +223,35 @@ public class ServletWebResponse extends 
 	@Override
 	public void sendRedirect(String url)
 	{
-		sendRedirect(url, false);
-	}
-
-	private void sendRedirect(String url, boolean cacheable)
-	{
-		redirect = true;
-		url = getAbsoluteURL(url);
-		url = httpServletResponse.encodeRedirectURL(url);
-
 		try
 		{
-			// proxies eventually cache '302 temporary redirect' responses:
-			// for most wicket use cases this is fatal since redirects are
-			// usually highly dynamic and can not be statically mapped
-			// to a request url in general
-			if (cacheable == false)
-				this.disableCaching();
+			redirect = true;
+			url = getAbsoluteURL(url);
+			url = httpServletResponse.encodeRedirectURL(url);
+
+			// wicket redirects should never be cached
+			this.disableCaching();
+
+			if (ServletWebRequest.isAjax(httpServletRequest))
+			{
+				httpServletResponse.addHeader("Ajax-Location", url);
+
+				/*
+				 * usually the Ajax-Location header is enough and we do not need to the
+				 * redirect url into the response, but sometimes the response is processed
+				 * via an iframe (eg using multipart ajax handling) and the headers are not
+				 * available because XHR is not used and that is the only way javascript has
+				 * access to response headers.
+				 */
+				httpServletResponse.getWriter().write(
+					"<ajax-response><redirect>" + url + "</redirect></ajax-response>");
 
-			httpServletResponse.sendRedirect(url);
+				setContentType("text/xml;charset=" + httpServletRequest.getCharacterEncoding());
+			}
+			else
+			{
+				httpServletResponse.sendRedirect(url);
+			}
 		}
 		catch (IOException e)
 		{



Re: svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Posted by Peter Ertl <pe...@gmx.org>.
Am 20.09.2010 um 13:03 schrieb Martin Grigorov:

> I chose "WebResponse" as type because this is in *Web*Application.

Isn't it even a "ServletWebApplication" ? :-)



Re: svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Posted by Martin Grigorov <mg...@apache.org>.
These are just the default implementations of these two methods.
If you change #newWebRequest() to return something else, e.g.
PortletWebRequest, then you will have to override #newWebResponse() as well
(e.g PortletWebResponse).
Until this change ServletWebResponse was working directly with
HttpServletRequest, now it has "wider knowledge" thru ServletWebRequest.
Maybe we can change #newWebResponse() to receive "Response" instead of
"WebResponse", but the cast will be still needed for this _default_
implementation.
I chose "WebResponse" as type because this is in *Web*Application.

On Mon, Sep 20, 2010 at 12:03 PM, Peter Ertl <pe...@gmx.org> wrote:

> I don't know if the cast to (ServletWebRequest) in WebApplication@383 is
> safe?
>
>                return new HeaderBufferingWebResponse(new
> ServletWebResponse((ServletWebRequest)webRequest,
>
> If it is safe then why not change
>
>        protected WebResponse newWebResponse(final WebRequest webRequest,
> final HttpServletResponse httpServletResponse)
>
> to
>
>        protected WebResponse newWebResponse(final ServletWebRequest
> webRequest, final HttpServletResponse httpServletResponse)
>
> ?
>
> That's exactly the location in code I did not know how to proceed.
>
> Igor mentioned that abstract WebRequest does not necessarily have to be
> ServletWebRequest when running in different containers.
>
> @dev: any opinions on that?
>
>
> Am 20.09.2010 um 10:30 schrieb Martin Grigorov:
>
> > Please review r998677.
> > I implemented the logic we discussed in IRC with you before your change.
> >
> > On Mon, Sep 20, 2010 at 10:24 AM, Peter Ertl <pe...@gmx.org> wrote:
> >
> >> Hi Martin,
> >>
> >> I am aware of that uglyness but I could not figure out a clean way to
> get
> >> around it.
> >>
> >> When fixing WICKET-3048 I needed a way to detect if the current request
> is
> >> of type 'ajax'.
> >>
> >> However the ctor from ServletWebResponse is
> >>
> >>       public ServletWebResponse(HttpServletRequest httpServletRequest,
> >>               HttpServletResponse httpServletResponse)
> >>
> >> To change it to
> >>
> >>       public ServletWebResponse(ServletWebRequest servletWebRequest,
> >>               HttpServletResponse httpServletResponse)
> >>
> >> you would need to instantiate
> >>
> >>       public ServletWebRequest(HttpServletRequest httpServletRequest,
> >> String filterPrefix)
> >>
> >> However there's no easy way to get 'filterPrefix' in the relevant places
> so
> >> I was kind of stuck there.
> >>
> >> Note my TODO in ServletWebRequest line 389 :-(
> >>
> >> If you can figure out a clean way to get this done I will appreciate
> that
> >> :-)
> >>
> >>
> >>
> >>
> >>
> >>
> >> Am 19.09.2010 um 16:22 schrieb Martin Grigorov:
> >>
> >>> Hi Peter,
> >>>
> >>> On Thu, Sep 16, 2010 at 12:40 AM, <pe...@apache.org> wrote:
> >>>
> >>>> Author: pete
> >>>> Date: Wed Sep 15 22:39:59 2010
> >>>> New Revision: 997528
> >>>>
> >>>> URL: http://svn.apache.org/viewvc?rev=997528&view=rev
> >>>> Log:
> >>>> fixed non-working ajax redirects: WICKET-3048
> >>>>
> >>>> Modified:
> >>>>
> >>>>
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >>>>
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >>>>
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >>>>
> >>>> Modified:
> >>>>
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >>>> URL:
> >>>>
> >>
> http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
> >>>>
> >>>>
> >>
> ==============================================================================
> >>>> ---
> >>>>
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >>>> (original)
> >>>> +++
> >>>>
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >>>> Wed Sep 15 22:39:59 2010
> >>>> @@ -104,8 +104,8 @@ public abstract class WebRequest extends
> >>>>      /**
> >>>>       * Marker parameter for AjaxRequest.
> >>>>       */
> >>>> -       private static final String PARAM_AJAX = "wicket:ajax";
> >>>> -       private static final String HEADER_AJAX = "Wicket-Ajax";
> >>>> +       protected static final String PARAM_AJAX = "wicket:ajax";
> >>>> +       protected static final String HEADER_AJAX = "Wicket-Ajax";
> >>>>
> >>>>      /**
> >>>>       * Returns whether this request is an Ajax request. This
> >>>> implementation only checks for value of
> >>>>
> >>>> Modified:
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >>>> URL:
> >>>>
> >>
> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
> >>>>
> >>>>
> >>
> ==============================================================================
> >>>> ---
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >>>> (original)
> >>>> +++
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >>>> Wed Sep 15 22:39:59 2010
> >>>> @@ -371,4 +371,23 @@ public class ServletWebRequest extends W
> >>>>      {
> >>>>              return RequestUtils.getCharset(httpServletRequest);
> >>>>      }
> >>>> +
> >>>> +       @Override
> >>>> +       public boolean isAjax()
> >>>> +       {
> >>>> +               return isAjax(httpServletRequest);
> >>>> +       }
> >>>> +
> >>>> +       /**
> >>>> +        * check if random http servlet request is an ajax request
> >>>> +        *
> >>>> +        * @param httpServletRequest web request
> >>>> +        * @return <code>true</code> if ajax, <code>false</code> if
> >> regular
> >>>> request
> >>>> +        */
> >>>> +       public static boolean isAjax(HttpServletRequest
> >> httpServletRequest)
> >>>> +       {
> >>>> +               // TODO there is some redundancy in this method and
> >>>> WebRequest#isAjax - can this be eliminated?
> >>>> +               return
> >>>> Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) ||
> >>>> +
> >>>> Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX));
> >>>> +       }
> >>>>
> >>> What is the reason to add this method at all ?
> >>> Why not use WebRequest#isAjax() ?
> >>>
> >>> Why 'static' ? ServletWebRequest has a reference to its
> >> HttpServletRequest.
> >>> Why do you want to check some other HttpServletRequest ?!
> >>>
> >>>> }
> >>>>
> >>>> Modified:
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >>>> URL:
> >>>>
> >>
> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=997528&r1=997527&r2=997528&view=diff
> >>>>
> >>>>
> >>
> ==============================================================================
> >>>> ---
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >>>> (original)
> >>>> +++
> >>>>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >>>> Wed Sep 15 22:39:59 2010
> >>>> @@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args;
> >>>>
> >>>> /**
> >>>> * WebResponse that wraps a {@link ServletWebResponse}.
> >>>> - *
> >>>> + *
> >>>> * @author Matej Knopp
> >>>> */
> >>>> public class ServletWebResponse extends WebResponse
> >>>> @@ -41,7 +41,7 @@ public class ServletWebResponse extends
> >>>>
> >>>>      /**
> >>>>       * Construct.
> >>>> -        *
> >>>> +        *
> >>>>       * @param httpServletRequest
> >>>>       * @param httpServletResponse
> >>>>       */
> >>>> @@ -57,7 +57,7 @@ public class ServletWebResponse extends
> >>>>
> >>>>      /**
> >>>>       * Returns the wrapped response
> >>>> -        *
> >>>> +        *
> >>>>       * @return wrapped response
> >>>>       */
> >>>>      public final HttpServletResponse getHttpServletResponse()
> >>>> @@ -223,25 +223,35 @@ public class ServletWebResponse extends
> >>>>      @Override
> >>>>      public void sendRedirect(String url)
> >>>>      {
> >>>> -               sendRedirect(url, false);
> >>>> -       }
> >>>> -
> >>>> -       private void sendRedirect(String url, boolean cacheable)
> >>>> -       {
> >>>> -               redirect = true;
> >>>> -               url = getAbsoluteURL(url);
> >>>> -               url = httpServletResponse.encodeRedirectURL(url);
> >>>> -
> >>>>              try
> >>>>              {
> >>>> -                       // proxies eventually cache '302 temporary
> >>>> redirect' responses:
> >>>> -                       // for most wicket use cases this is fatal
> since
> >>>> redirects are
> >>>> -                       // usually highly dynamic and can not be
> >> statically
> >>>> mapped
> >>>> -                       // to a request url in general
> >>>> -                       if (cacheable == false)
> >>>> -                               this.disableCaching();
> >>>> +                       redirect = true;
> >>>> +                       url = getAbsoluteURL(url);
> >>>> +                       url =
> >> httpServletResponse.encodeRedirectURL(url);
> >>>> +
> >>>> +                       // wicket redirects should never be cached
> >>>> +                       this.disableCaching();
> >>>> +
> >>>> +                       if
> >> (ServletWebRequest.isAjax(httpServletRequest))
> >>>> +                       {
> >>>> +
> >>>> httpServletResponse.addHeader("Ajax-Location", url);
> >>>> +
> >>>> +                               /*
> >>>> +                                * usually the Ajax-Location header is
> >>>> enough and we do not need to the
> >>>> +                                * redirect url into the response, but
> >>>> sometimes the response is processed
> >>>> +                                * via an iframe (eg using multipart
> >> ajax
> >>>> handling) and the headers are not
> >>>> +                                * available because XHR is not used
> and
> >>>> that is the only way javascript has
> >>>> +                                * access to response headers.
> >>>> +                                */
> >>>> +                               httpServletResponse.getWriter().write(
> >>>> +                                       "<ajax-response><redirect>" +
> >> url +
> >>>> "</redirect></ajax-response>");
> >>>>
> >>>> -                       httpServletResponse.sendRedirect(url);
> >>>> +                               setContentType("text/xml;charset=" +
> >>>> httpServletRequest.getCharacterEncoding());
> >>>> +                       }
> >>>> +                       else
> >>>> +                       {
> >>>> +                               httpServletResponse.sendRedirect(url);
> >>>> +                       }
> >>>>              }
> >>>>              catch (IOException e)
> >>>>              {
> >>>>
> >>>>
> >>>>
> >>
> >>
>
>

Re: svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Posted by Peter Ertl <pe...@gmx.org>.
I don't know if the cast to (ServletWebRequest) in WebApplication@383 is safe?

		return new HeaderBufferingWebResponse(new ServletWebResponse((ServletWebRequest)webRequest,

If it is safe then why not change

	protected WebResponse newWebResponse(final WebRequest webRequest, final HttpServletResponse httpServletResponse)

to

	protected WebResponse newWebResponse(final ServletWebRequest webRequest, final HttpServletResponse httpServletResponse)

?

That's exactly the location in code I did not know how to proceed.

Igor mentioned that abstract WebRequest does not necessarily have to be ServletWebRequest when running in different containers.

@dev: any opinions on that?


Am 20.09.2010 um 10:30 schrieb Martin Grigorov:

> Please review r998677.
> I implemented the logic we discussed in IRC with you before your change.
> 
> On Mon, Sep 20, 2010 at 10:24 AM, Peter Ertl <pe...@gmx.org> wrote:
> 
>> Hi Martin,
>> 
>> I am aware of that uglyness but I could not figure out a clean way to get
>> around it.
>> 
>> When fixing WICKET-3048 I needed a way to detect if the current request is
>> of type 'ajax'.
>> 
>> However the ctor from ServletWebResponse is
>> 
>>       public ServletWebResponse(HttpServletRequest httpServletRequest,
>>               HttpServletResponse httpServletResponse)
>> 
>> To change it to
>> 
>>       public ServletWebResponse(ServletWebRequest servletWebRequest,
>>               HttpServletResponse httpServletResponse)
>> 
>> you would need to instantiate
>> 
>>       public ServletWebRequest(HttpServletRequest httpServletRequest,
>> String filterPrefix)
>> 
>> However there's no easy way to get 'filterPrefix' in the relevant places so
>> I was kind of stuck there.
>> 
>> Note my TODO in ServletWebRequest line 389 :-(
>> 
>> If you can figure out a clean way to get this done I will appreciate that
>> :-)
>> 
>> 
>> 
>> 
>> 
>> 
>> Am 19.09.2010 um 16:22 schrieb Martin Grigorov:
>> 
>>> Hi Peter,
>>> 
>>> On Thu, Sep 16, 2010 at 12:40 AM, <pe...@apache.org> wrote:
>>> 
>>>> Author: pete
>>>> Date: Wed Sep 15 22:39:59 2010
>>>> New Revision: 997528
>>>> 
>>>> URL: http://svn.apache.org/viewvc?rev=997528&view=rev
>>>> Log:
>>>> fixed non-working ajax redirects: WICKET-3048
>>>> 
>>>> Modified:
>>>> 
>>>> 
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>>>> 
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>>>> 
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>>>> 
>>>> Modified:
>>>> 
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>>>> URL:
>>>> 
>> http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
>>>> 
>>>> 
>> ==============================================================================
>>>> ---
>>>> 
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>>>> (original)
>>>> +++
>>>> 
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>>>> Wed Sep 15 22:39:59 2010
>>>> @@ -104,8 +104,8 @@ public abstract class WebRequest extends
>>>>      /**
>>>>       * Marker parameter for AjaxRequest.
>>>>       */
>>>> -       private static final String PARAM_AJAX = "wicket:ajax";
>>>> -       private static final String HEADER_AJAX = "Wicket-Ajax";
>>>> +       protected static final String PARAM_AJAX = "wicket:ajax";
>>>> +       protected static final String HEADER_AJAX = "Wicket-Ajax";
>>>> 
>>>>      /**
>>>>       * Returns whether this request is an Ajax request. This
>>>> implementation only checks for value of
>>>> 
>>>> Modified:
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>>>> URL:
>>>> 
>> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
>>>> 
>>>> 
>> ==============================================================================
>>>> ---
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>>>> (original)
>>>> +++
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>>>> Wed Sep 15 22:39:59 2010
>>>> @@ -371,4 +371,23 @@ public class ServletWebRequest extends W
>>>>      {
>>>>              return RequestUtils.getCharset(httpServletRequest);
>>>>      }
>>>> +
>>>> +       @Override
>>>> +       public boolean isAjax()
>>>> +       {
>>>> +               return isAjax(httpServletRequest);
>>>> +       }
>>>> +
>>>> +       /**
>>>> +        * check if random http servlet request is an ajax request
>>>> +        *
>>>> +        * @param httpServletRequest web request
>>>> +        * @return <code>true</code> if ajax, <code>false</code> if
>> regular
>>>> request
>>>> +        */
>>>> +       public static boolean isAjax(HttpServletRequest
>> httpServletRequest)
>>>> +       {
>>>> +               // TODO there is some redundancy in this method and
>>>> WebRequest#isAjax - can this be eliminated?
>>>> +               return
>>>> Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) ||
>>>> +
>>>> Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX));
>>>> +       }
>>>> 
>>> What is the reason to add this method at all ?
>>> Why not use WebRequest#isAjax() ?
>>> 
>>> Why 'static' ? ServletWebRequest has a reference to its
>> HttpServletRequest.
>>> Why do you want to check some other HttpServletRequest ?!
>>> 
>>>> }
>>>> 
>>>> Modified:
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>>>> URL:
>>>> 
>> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=997528&r1=997527&r2=997528&view=diff
>>>> 
>>>> 
>> ==============================================================================
>>>> ---
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>>>> (original)
>>>> +++
>>>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>>>> Wed Sep 15 22:39:59 2010
>>>> @@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args;
>>>> 
>>>> /**
>>>> * WebResponse that wraps a {@link ServletWebResponse}.
>>>> - *
>>>> + *
>>>> * @author Matej Knopp
>>>> */
>>>> public class ServletWebResponse extends WebResponse
>>>> @@ -41,7 +41,7 @@ public class ServletWebResponse extends
>>>> 
>>>>      /**
>>>>       * Construct.
>>>> -        *
>>>> +        *
>>>>       * @param httpServletRequest
>>>>       * @param httpServletResponse
>>>>       */
>>>> @@ -57,7 +57,7 @@ public class ServletWebResponse extends
>>>> 
>>>>      /**
>>>>       * Returns the wrapped response
>>>> -        *
>>>> +        *
>>>>       * @return wrapped response
>>>>       */
>>>>      public final HttpServletResponse getHttpServletResponse()
>>>> @@ -223,25 +223,35 @@ public class ServletWebResponse extends
>>>>      @Override
>>>>      public void sendRedirect(String url)
>>>>      {
>>>> -               sendRedirect(url, false);
>>>> -       }
>>>> -
>>>> -       private void sendRedirect(String url, boolean cacheable)
>>>> -       {
>>>> -               redirect = true;
>>>> -               url = getAbsoluteURL(url);
>>>> -               url = httpServletResponse.encodeRedirectURL(url);
>>>> -
>>>>              try
>>>>              {
>>>> -                       // proxies eventually cache '302 temporary
>>>> redirect' responses:
>>>> -                       // for most wicket use cases this is fatal since
>>>> redirects are
>>>> -                       // usually highly dynamic and can not be
>> statically
>>>> mapped
>>>> -                       // to a request url in general
>>>> -                       if (cacheable == false)
>>>> -                               this.disableCaching();
>>>> +                       redirect = true;
>>>> +                       url = getAbsoluteURL(url);
>>>> +                       url =
>> httpServletResponse.encodeRedirectURL(url);
>>>> +
>>>> +                       // wicket redirects should never be cached
>>>> +                       this.disableCaching();
>>>> +
>>>> +                       if
>> (ServletWebRequest.isAjax(httpServletRequest))
>>>> +                       {
>>>> +
>>>> httpServletResponse.addHeader("Ajax-Location", url);
>>>> +
>>>> +                               /*
>>>> +                                * usually the Ajax-Location header is
>>>> enough and we do not need to the
>>>> +                                * redirect url into the response, but
>>>> sometimes the response is processed
>>>> +                                * via an iframe (eg using multipart
>> ajax
>>>> handling) and the headers are not
>>>> +                                * available because XHR is not used and
>>>> that is the only way javascript has
>>>> +                                * access to response headers.
>>>> +                                */
>>>> +                               httpServletResponse.getWriter().write(
>>>> +                                       "<ajax-response><redirect>" +
>> url +
>>>> "</redirect></ajax-response>");
>>>> 
>>>> -                       httpServletResponse.sendRedirect(url);
>>>> +                               setContentType("text/xml;charset=" +
>>>> httpServletRequest.getCharacterEncoding());
>>>> +                       }
>>>> +                       else
>>>> +                       {
>>>> +                               httpServletResponse.sendRedirect(url);
>>>> +                       }
>>>>              }
>>>>              catch (IOException e)
>>>>              {
>>>> 
>>>> 
>>>> 
>> 
>> 


Re: svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Posted by Martin Grigorov <mg...@apache.org>.
Please review r998677.
I implemented the logic we discussed in IRC with you before your change.

On Mon, Sep 20, 2010 at 10:24 AM, Peter Ertl <pe...@gmx.org> wrote:

> Hi Martin,
>
> I am aware of that uglyness but I could not figure out a clean way to get
> around it.
>
> When fixing WICKET-3048 I needed a way to detect if the current request is
> of type 'ajax'.
>
> However the ctor from ServletWebResponse is
>
>        public ServletWebResponse(HttpServletRequest httpServletRequest,
>                HttpServletResponse httpServletResponse)
>
> To change it to
>
>        public ServletWebResponse(ServletWebRequest servletWebRequest,
>                HttpServletResponse httpServletResponse)
>
> you would need to instantiate
>
>        public ServletWebRequest(HttpServletRequest httpServletRequest,
> String filterPrefix)
>
> However there's no easy way to get 'filterPrefix' in the relevant places so
> I was kind of stuck there.
>
> Note my TODO in ServletWebRequest line 389 :-(
>
> If you can figure out a clean way to get this done I will appreciate that
> :-)
>
>
>
>
>
>
> Am 19.09.2010 um 16:22 schrieb Martin Grigorov:
>
> > Hi Peter,
> >
> > On Thu, Sep 16, 2010 at 12:40 AM, <pe...@apache.org> wrote:
> >
> >> Author: pete
> >> Date: Wed Sep 15 22:39:59 2010
> >> New Revision: 997528
> >>
> >> URL: http://svn.apache.org/viewvc?rev=997528&view=rev
> >> Log:
> >> fixed non-working ajax redirects: WICKET-3048
> >>
> >> Modified:
> >>
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >>
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >>
> >> Modified:
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
> >>
> >>
> ==============================================================================
> >> ---
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >> (original)
> >> +++
> >>
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> >> Wed Sep 15 22:39:59 2010
> >> @@ -104,8 +104,8 @@ public abstract class WebRequest extends
> >>       /**
> >>        * Marker parameter for AjaxRequest.
> >>        */
> >> -       private static final String PARAM_AJAX = "wicket:ajax";
> >> -       private static final String HEADER_AJAX = "Wicket-Ajax";
> >> +       protected static final String PARAM_AJAX = "wicket:ajax";
> >> +       protected static final String HEADER_AJAX = "Wicket-Ajax";
> >>
> >>       /**
> >>        * Returns whether this request is an Ajax request. This
> >> implementation only checks for value of
> >>
> >> Modified:
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
> >>
> >>
> ==============================================================================
> >> ---
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >> (original)
> >> +++
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> >> Wed Sep 15 22:39:59 2010
> >> @@ -371,4 +371,23 @@ public class ServletWebRequest extends W
> >>       {
> >>               return RequestUtils.getCharset(httpServletRequest);
> >>       }
> >> +
> >> +       @Override
> >> +       public boolean isAjax()
> >> +       {
> >> +               return isAjax(httpServletRequest);
> >> +       }
> >> +
> >> +       /**
> >> +        * check if random http servlet request is an ajax request
> >> +        *
> >> +        * @param httpServletRequest web request
> >> +        * @return <code>true</code> if ajax, <code>false</code> if
> regular
> >> request
> >> +        */
> >> +       public static boolean isAjax(HttpServletRequest
> httpServletRequest)
> >> +       {
> >> +               // TODO there is some redundancy in this method and
> >> WebRequest#isAjax - can this be eliminated?
> >> +               return
> >> Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) ||
> >> +
> >> Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX));
> >> +       }
> >>
> > What is the reason to add this method at all ?
> > Why not use WebRequest#isAjax() ?
> >
> > Why 'static' ? ServletWebRequest has a reference to its
> HttpServletRequest.
> > Why do you want to check some other HttpServletRequest ?!
> >
> >> }
> >>
> >> Modified:
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >> URL:
> >>
> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=997528&r1=997527&r2=997528&view=diff
> >>
> >>
> ==============================================================================
> >> ---
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >> (original)
> >> +++
> >>
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> >> Wed Sep 15 22:39:59 2010
> >> @@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args;
> >>
> >> /**
> >> * WebResponse that wraps a {@link ServletWebResponse}.
> >> - *
> >> + *
> >> * @author Matej Knopp
> >> */
> >> public class ServletWebResponse extends WebResponse
> >> @@ -41,7 +41,7 @@ public class ServletWebResponse extends
> >>
> >>       /**
> >>        * Construct.
> >> -        *
> >> +        *
> >>        * @param httpServletRequest
> >>        * @param httpServletResponse
> >>        */
> >> @@ -57,7 +57,7 @@ public class ServletWebResponse extends
> >>
> >>       /**
> >>        * Returns the wrapped response
> >> -        *
> >> +        *
> >>        * @return wrapped response
> >>        */
> >>       public final HttpServletResponse getHttpServletResponse()
> >> @@ -223,25 +223,35 @@ public class ServletWebResponse extends
> >>       @Override
> >>       public void sendRedirect(String url)
> >>       {
> >> -               sendRedirect(url, false);
> >> -       }
> >> -
> >> -       private void sendRedirect(String url, boolean cacheable)
> >> -       {
> >> -               redirect = true;
> >> -               url = getAbsoluteURL(url);
> >> -               url = httpServletResponse.encodeRedirectURL(url);
> >> -
> >>               try
> >>               {
> >> -                       // proxies eventually cache '302 temporary
> >> redirect' responses:
> >> -                       // for most wicket use cases this is fatal since
> >> redirects are
> >> -                       // usually highly dynamic and can not be
> statically
> >> mapped
> >> -                       // to a request url in general
> >> -                       if (cacheable == false)
> >> -                               this.disableCaching();
> >> +                       redirect = true;
> >> +                       url = getAbsoluteURL(url);
> >> +                       url =
> httpServletResponse.encodeRedirectURL(url);
> >> +
> >> +                       // wicket redirects should never be cached
> >> +                       this.disableCaching();
> >> +
> >> +                       if
> (ServletWebRequest.isAjax(httpServletRequest))
> >> +                       {
> >> +
> >> httpServletResponse.addHeader("Ajax-Location", url);
> >> +
> >> +                               /*
> >> +                                * usually the Ajax-Location header is
> >> enough and we do not need to the
> >> +                                * redirect url into the response, but
> >> sometimes the response is processed
> >> +                                * via an iframe (eg using multipart
> ajax
> >> handling) and the headers are not
> >> +                                * available because XHR is not used and
> >> that is the only way javascript has
> >> +                                * access to response headers.
> >> +                                */
> >> +                               httpServletResponse.getWriter().write(
> >> +                                       "<ajax-response><redirect>" +
> url +
> >> "</redirect></ajax-response>");
> >>
> >> -                       httpServletResponse.sendRedirect(url);
> >> +                               setContentType("text/xml;charset=" +
> >> httpServletRequest.getCharacterEncoding());
> >> +                       }
> >> +                       else
> >> +                       {
> >> +                               httpServletResponse.sendRedirect(url);
> >> +                       }
> >>               }
> >>               catch (IOException e)
> >>               {
> >>
> >>
> >>
>
>

Re: svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Posted by Peter Ertl <pe...@gmx.org>.
Hi Martin,

I am aware of that uglyness but I could not figure out a clean way to get around it.

When fixing WICKET-3048 I needed a way to detect if the current request is of type 'ajax'.

However the ctor from ServletWebResponse is

	public ServletWebResponse(HttpServletRequest httpServletRequest,
		HttpServletResponse httpServletResponse)

To change it to 

	public ServletWebResponse(ServletWebRequest servletWebRequest,
		HttpServletResponse httpServletResponse)

you would need to instantiate

	public ServletWebRequest(HttpServletRequest httpServletRequest, String filterPrefix)

However there's no easy way to get 'filterPrefix' in the relevant places so I was kind of stuck there.

Note my TODO in ServletWebRequest line 389 :-(

If you can figure out a clean way to get this done I will appreciate that :-)






Am 19.09.2010 um 16:22 schrieb Martin Grigorov:

> Hi Peter,
> 
> On Thu, Sep 16, 2010 at 12:40 AM, <pe...@apache.org> wrote:
> 
>> Author: pete
>> Date: Wed Sep 15 22:39:59 2010
>> New Revision: 997528
>> 
>> URL: http://svn.apache.org/viewvc?rev=997528&view=rev
>> Log:
>> fixed non-working ajax redirects: WICKET-3048
>> 
>> Modified:
>> 
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>> 
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>> 
>> Modified:
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>> URL:
>> http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
>> 
>> ==============================================================================
>> ---
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>> (original)
>> +++
>> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>> Wed Sep 15 22:39:59 2010
>> @@ -104,8 +104,8 @@ public abstract class WebRequest extends
>>       /**
>>        * Marker parameter for AjaxRequest.
>>        */
>> -       private static final String PARAM_AJAX = "wicket:ajax";
>> -       private static final String HEADER_AJAX = "Wicket-Ajax";
>> +       protected static final String PARAM_AJAX = "wicket:ajax";
>> +       protected static final String HEADER_AJAX = "Wicket-Ajax";
>> 
>>       /**
>>        * Returns whether this request is an Ajax request. This
>> implementation only checks for value of
>> 
>> Modified:
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>> URL:
>> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
>> 
>> ==============================================================================
>> ---
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>> (original)
>> +++
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>> Wed Sep 15 22:39:59 2010
>> @@ -371,4 +371,23 @@ public class ServletWebRequest extends W
>>       {
>>               return RequestUtils.getCharset(httpServletRequest);
>>       }
>> +
>> +       @Override
>> +       public boolean isAjax()
>> +       {
>> +               return isAjax(httpServletRequest);
>> +       }
>> +
>> +       /**
>> +        * check if random http servlet request is an ajax request
>> +        *
>> +        * @param httpServletRequest web request
>> +        * @return <code>true</code> if ajax, <code>false</code> if regular
>> request
>> +        */
>> +       public static boolean isAjax(HttpServletRequest httpServletRequest)
>> +       {
>> +               // TODO there is some redundancy in this method and
>> WebRequest#isAjax - can this be eliminated?
>> +               return
>> Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) ||
>> +
>> Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX));
>> +       }
>> 
> What is the reason to add this method at all ?
> Why not use WebRequest#isAjax() ?
> 
> Why 'static' ? ServletWebRequest has a reference to its HttpServletRequest.
> Why do you want to check some other HttpServletRequest ?!
> 
>> }
>> 
>> Modified:
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>> URL:
>> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=997528&r1=997527&r2=997528&view=diff
>> 
>> ==============================================================================
>> ---
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>> (original)
>> +++
>> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>> Wed Sep 15 22:39:59 2010
>> @@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args;
>> 
>> /**
>> * WebResponse that wraps a {@link ServletWebResponse}.
>> - *
>> + *
>> * @author Matej Knopp
>> */
>> public class ServletWebResponse extends WebResponse
>> @@ -41,7 +41,7 @@ public class ServletWebResponse extends
>> 
>>       /**
>>        * Construct.
>> -        *
>> +        *
>>        * @param httpServletRequest
>>        * @param httpServletResponse
>>        */
>> @@ -57,7 +57,7 @@ public class ServletWebResponse extends
>> 
>>       /**
>>        * Returns the wrapped response
>> -        *
>> +        *
>>        * @return wrapped response
>>        */
>>       public final HttpServletResponse getHttpServletResponse()
>> @@ -223,25 +223,35 @@ public class ServletWebResponse extends
>>       @Override
>>       public void sendRedirect(String url)
>>       {
>> -               sendRedirect(url, false);
>> -       }
>> -
>> -       private void sendRedirect(String url, boolean cacheable)
>> -       {
>> -               redirect = true;
>> -               url = getAbsoluteURL(url);
>> -               url = httpServletResponse.encodeRedirectURL(url);
>> -
>>               try
>>               {
>> -                       // proxies eventually cache '302 temporary
>> redirect' responses:
>> -                       // for most wicket use cases this is fatal since
>> redirects are
>> -                       // usually highly dynamic and can not be statically
>> mapped
>> -                       // to a request url in general
>> -                       if (cacheable == false)
>> -                               this.disableCaching();
>> +                       redirect = true;
>> +                       url = getAbsoluteURL(url);
>> +                       url = httpServletResponse.encodeRedirectURL(url);
>> +
>> +                       // wicket redirects should never be cached
>> +                       this.disableCaching();
>> +
>> +                       if (ServletWebRequest.isAjax(httpServletRequest))
>> +                       {
>> +
>> httpServletResponse.addHeader("Ajax-Location", url);
>> +
>> +                               /*
>> +                                * usually the Ajax-Location header is
>> enough and we do not need to the
>> +                                * redirect url into the response, but
>> sometimes the response is processed
>> +                                * via an iframe (eg using multipart ajax
>> handling) and the headers are not
>> +                                * available because XHR is not used and
>> that is the only way javascript has
>> +                                * access to response headers.
>> +                                */
>> +                               httpServletResponse.getWriter().write(
>> +                                       "<ajax-response><redirect>" + url +
>> "</redirect></ajax-response>");
>> 
>> -                       httpServletResponse.sendRedirect(url);
>> +                               setContentType("text/xml;charset=" +
>> httpServletRequest.getCharacterEncoding());
>> +                       }
>> +                       else
>> +                       {
>> +                               httpServletResponse.sendRedirect(url);
>> +                       }
>>               }
>>               catch (IOException e)
>>               {
>> 
>> 
>> 


Re: svn commit: r997528 - in /wicket/trunk: wicket-request/src/main/java/org/apache/wicket/request/http/ wicket/src/main/java/org/apache/wicket/protocol/http/servlet/

Posted by Martin Grigorov <mg...@apache.org>.
Hi Peter,

On Thu, Sep 16, 2010 at 12:40 AM, <pe...@apache.org> wrote:

> Author: pete
> Date: Wed Sep 15 22:39:59 2010
> New Revision: 997528
>
> URL: http://svn.apache.org/viewvc?rev=997528&view=rev
> Log:
> fixed non-working ajax redirects: WICKET-3048
>
> Modified:
>
>  wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
>
>  wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
>
>  wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
>
> Modified:
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> URL:
> http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
>
> ==============================================================================
> ---
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> (original)
> +++
> wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
> Wed Sep 15 22:39:59 2010
> @@ -104,8 +104,8 @@ public abstract class WebRequest extends
>        /**
>         * Marker parameter for AjaxRequest.
>         */
> -       private static final String PARAM_AJAX = "wicket:ajax";
> -       private static final String HEADER_AJAX = "Wicket-Ajax";
> +       protected static final String PARAM_AJAX = "wicket:ajax";
> +       protected static final String HEADER_AJAX = "Wicket-Ajax";
>
>        /**
>         * Returns whether this request is an Ajax request. This
> implementation only checks for value of
>
> Modified:
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> URL:
> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=997528&r1=997527&r2=997528&view=diff
>
> ==============================================================================
> ---
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> (original)
> +++
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
> Wed Sep 15 22:39:59 2010
> @@ -371,4 +371,23 @@ public class ServletWebRequest extends W
>        {
>                return RequestUtils.getCharset(httpServletRequest);
>        }
> +
> +       @Override
> +       public boolean isAjax()
> +       {
> +               return isAjax(httpServletRequest);
> +       }
> +
> +       /**
> +        * check if random http servlet request is an ajax request
> +        *
> +        * @param httpServletRequest web request
> +        * @return <code>true</code> if ajax, <code>false</code> if regular
> request
> +        */
> +       public static boolean isAjax(HttpServletRequest httpServletRequest)
> +       {
> +               // TODO there is some redundancy in this method and
> WebRequest#isAjax - can this be eliminated?
> +               return
> Strings.isTrue(httpServletRequest.getHeader(HEADER_AJAX)) ||
> +
> Strings.isTrue(httpServletRequest.getParameter(PARAM_AJAX));
> +       }
>
What is the reason to add this method at all ?
Why not use WebRequest#isAjax() ?

Why 'static' ? ServletWebRequest has a reference to its HttpServletRequest.
Why do you want to check some other HttpServletRequest ?!

>  }
>
> Modified:
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> URL:
> http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=997528&r1=997527&r2=997528&view=diff
>
> ==============================================================================
> ---
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> (original)
> +++
> wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
> Wed Sep 15 22:39:59 2010
> @@ -31,7 +31,7 @@ import org.apache.wicket.util.lang.Args;
>
>  /**
>  * WebResponse that wraps a {@link ServletWebResponse}.
> - *
> + *
>  * @author Matej Knopp
>  */
>  public class ServletWebResponse extends WebResponse
> @@ -41,7 +41,7 @@ public class ServletWebResponse extends
>
>        /**
>         * Construct.
> -        *
> +        *
>         * @param httpServletRequest
>         * @param httpServletResponse
>         */
> @@ -57,7 +57,7 @@ public class ServletWebResponse extends
>
>        /**
>         * Returns the wrapped response
> -        *
> +        *
>         * @return wrapped response
>         */
>        public final HttpServletResponse getHttpServletResponse()
> @@ -223,25 +223,35 @@ public class ServletWebResponse extends
>        @Override
>        public void sendRedirect(String url)
>        {
> -               sendRedirect(url, false);
> -       }
> -
> -       private void sendRedirect(String url, boolean cacheable)
> -       {
> -               redirect = true;
> -               url = getAbsoluteURL(url);
> -               url = httpServletResponse.encodeRedirectURL(url);
> -
>                try
>                {
> -                       // proxies eventually cache '302 temporary
> redirect' responses:
> -                       // for most wicket use cases this is fatal since
> redirects are
> -                       // usually highly dynamic and can not be statically
> mapped
> -                       // to a request url in general
> -                       if (cacheable == false)
> -                               this.disableCaching();
> +                       redirect = true;
> +                       url = getAbsoluteURL(url);
> +                       url = httpServletResponse.encodeRedirectURL(url);
> +
> +                       // wicket redirects should never be cached
> +                       this.disableCaching();
> +
> +                       if (ServletWebRequest.isAjax(httpServletRequest))
> +                       {
> +
> httpServletResponse.addHeader("Ajax-Location", url);
> +
> +                               /*
> +                                * usually the Ajax-Location header is
> enough and we do not need to the
> +                                * redirect url into the response, but
> sometimes the response is processed
> +                                * via an iframe (eg using multipart ajax
> handling) and the headers are not
> +                                * available because XHR is not used and
> that is the only way javascript has
> +                                * access to response headers.
> +                                */
> +                               httpServletResponse.getWriter().write(
> +                                       "<ajax-response><redirect>" + url +
> "</redirect></ajax-response>");
>
> -                       httpServletResponse.sendRedirect(url);
> +                               setContentType("text/xml;charset=" +
> httpServletRequest.getCharacterEncoding());
> +                       }
> +                       else
> +                       {
> +                               httpServletResponse.sendRedirect(url);
> +                       }
>                }
>                catch (IOException e)
>                {
>
>
>