Re: Filtering and modification of Response in Tapestry

Ric 2000 <[email protected]> Sun, 1 Dec 2019 17:11:45 +0100
Newsgroups gmane.comp.java.tapestry.user
Message-ID <CAGEHc1UnSvB5utkh3ugnQEQoQs2M+YmROTGqjWEU6odHjpqFDA@mail.gmail.com>
--000000000000f0d91a0598a6b8c6
Content-Type: multipart/alternative; boundary="000000000000f0d9180598a6b8c4"

--000000000000f0d9180598a6b8c4
Content-Type: text/plain; charset="UTF-8"

 Hi again,

here is the code I used:

First the way I contributed the HttpServletRequestHandlerin my Tapestry
Filter Module:

@Contribute(HttpServletRequestHandler.*class*)

*public* *void*
contributeHttpServletRequestHandler(OrderedConfiguration<HttpServletRequestFilter>
configuration) {



    configuration.add("JavascriptCommentFilter", *new**
JavascriptCommentFilter(**)*,

                           *after*("StoreIntoGlobals").build());

}

Here is the code of my HttpServletRequestFilter (the used
ServletResponseWrapperCopier I attached to this post):

*package* *com.xyz.common.services.requestfilter*;



*import* java.io.IOException;

*import* java.io.PrintWriter;



*import* javax.servlet.http.HttpServletRequest;

*import* javax.servlet.http.HttpServletResponse;



*import* org.apache.log4j.Logger;

*import* org.apache.tapestry5.services.HttpServletRequestFilter;

*import* org.apache.tapestry5.services.HttpServletRequestHandler;



*import* *com.xyz <http://com.xyz>*.utils.ServletResponseWrapperCopier;



*public* *class* JavascriptCommentFilter *implements*
HttpServletRequestFilter {



       *private* *final* *static* Logger *LOG* = Logger.*getLogger*
(JavascriptCommentFilter.*class*);



       @Override

       *public* *boolean* service(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,

                    HttpServletRequestHandler handler) *throws* IOException
{



             String requestUrl = httpServletRequest
.getRequestURL().toString();



             *boolean* handled = handler.service(httpServletRequest,
httpServletResponse);



             *LOG*.debug(requestUrl + " handled by Tapestry filter: " +
handled);



             *if* (!handled) {



             }



             *if* (requestUrl.endsWith(".js")) {



                    // CharResponseWrapper charResponseWrapper = new
CharResponseWrapper(httpServletResponse);



                    *ServletResponseWrapperCopier* capturingResponseWrapper
= *new* *ServletResponseWrapperCopier*(

                                  httpServletResponse);



                    PrintWriter responseWriter = httpServletResponse
.getWriter();



                    // String originalContent =
charResponseWrapper.toString();

                    String originalContent = capturingResponseWrapper
.getCaptureAsString();

                    // String originalContent =
capturingResponseWrapper.getCaptureAsString();

                    *LOG*.debug("javascript resource detected with content:
" + originalContent);

                    //

                    // int commentEnd = originalContent.indexOf("*/");

                    // if (commentEnd > -1) {

                    //

                    // originalContent =
originalContent.substring(commentEnd);

                    // }

                    //

                    // originalContent =
originalContent.replaceAll("(?m)^//.*", "");

                    //

                    // responseWriter.write(originalContent);

             }



             *return* handled;

       }

}

I tried several variations, like writing an own servlet filter and puting
it after the Tapestry Filter, but always the same: the content appears to
be empty.
Thanks in advance for your suggestions!

Best Regards, Ric

On Sun, Dec 1, 2019 at 3:38 PM Ric 2000 <[email protected]> wrote:

> Hi Cezary,
>
> first thanks for your reply. Then I was at least not completely wrong. Let
> me show my code in the next reply, I will restore the version from GIT
> first.
>
> Best Regards, Erich
>
>
> On Sat, Nov 30, 2019 at 8:38 PM Cezary Biernacki <[email protected]>
> wrote:
>
>> Hi,
>> as you suggested, it is possible to capture output of handling request by
>> subclassing HttpServletResponseWrapper, providing your own
>> ServletOutputStream, and wrapping the original HttpServletResponse inside
>> a
>> filter on the requested processing pipeline. This way is not specific to
>> Tapestry, maybe you only need to remember that Tapestry on the request
>> processing pipeline is implemented as a filter, not a servlet. Tapestry
>> itself uses this approach to implement compressing responses, see class
>> org.apache.tapestry5.internal.gzip.GZipFilter.  I don't know why it is not
>> working for you, probably you have a bug, but without seeing your code it
>> hard to help you.
>>
>> Best regards,
>> Cezary
>>
>>
>>
>>
>> On Sat, Nov 30, 2019 at 10:38 AM Ric 2000 <[email protected]>
>> wrote:
>>
>> > Dear all,
>> >
>> > I'm struggling on how to filter and modify the response sent to the
>> client
>> > in a Tapestry web application.
>> > I tried first with a RequestFilter contributed to the RequestHandler
>> > service.
>> > The problem occurred when I tried to read the content of the current
>> > response out stream. There are different hints on the internet how to
>> do a
>> > "capture" of this output stream using a custom
>> HttpServletResponseWrapper
>> > and overwriting the write method of the ServletOutputStream, to get the
>> > current content of the outputstream as byte array.
>> >
>> > But this is always empty, regardless of how I try to do it.
>> >
>> > Can you tell me, what is the right way in Tapestry to do it? Which
>> service
>> > do I have to contribute, in which phase of the request processing the
>> > response is filled and can be read, BEFORE it is send to the client?
>> >
>> > Thanks a lot for your suggestions, I really appreciate them!
>> >
>> > Best Regards, Ric
>> >
>>
>

--000000000000f0d9180598a6b8c4
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">
<div>Hi again,</div><div><br></div><div>here is the code I used:</div><div>=
<br></div><div>First the way I contributed the
HttpServletRequestHandlerin my Tapestry Filter Module:<br><p class=3D"MsoNo=
rmal"><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(100,100,=
100)">@Contribute</span><span style=3D"font-size:10pt;font-family:Consolas;=
color:black">(HttpServletRequestHandler.</span><b><span style=3D"font-size:=
10pt;font-family:Consolas;color:rgb(127,0,85)">class</span></b><span style=
=3D"font-size:10pt;font-family:Consolas;color:black">)</span><span style=3D=
"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">public</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black">
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">void</span></b><span style=3D"font-size:10pt;font-family:Consolas;co=
lor:black"> contributeHttpServletRequestHandler(OrderedConfiguration&lt;Htt=
pServletRequestFilter&gt;
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">configuration</span><span style=3D"font-size:10pt;font-family:Consolas=
;color:black">) {</span><span style=3D"font-size:10pt;font-family:Consolas"=
></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal">=C2=A0=C2=A0=C2=A0 <span style=3D"font-size:10pt;fon=
t-family:Consolas;color:rgb(106,62,62)">configuration</span><span style=3D"=
font-size:10pt;font-family:Consolas;color:black">.add(</span><span style=3D=
"font-size:10pt;font-family:Consolas;color:rgb(42,0,255)">&quot;JavascriptC=
ommentFilter&quot;</span><span style=3D"font-size:10pt;font-family:Consolas=
;color:black">,
</span><b><u><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(1=
27,0,85)">new</span></u></b><u><span style=3D"font-size:10pt;font-family:Co=
nsolas;color:black"> JavascriptCommentFilter(</span></u><u><span style=3D"f=
ont-size:10pt;font-family:Consolas;color:black">)</span></u><span style=3D"=
font-size:10pt;font-family:Consolas;color:black">,</span><span style=3D"fon=
t-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0
<i>after</i>(</span><span style=3D"font-size:10pt;font-family:Consolas;colo=
r:rgb(42,0,255)">&quot;StoreIntoGlobals&quot;</span><span style=3D"font-siz=
e:10pt;font-family:Consolas;color:black">).build());</span><span style=3D"f=
ont-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">}</span></p>

</div><div><br></div><div>Here is the code of my=20
HttpServletRequestFilter (the used=20
<span style=3D"background:rgb(212,212,212) none repeat scroll 0% 0%">Servle=
tResponseWrapperCopier</span>

I attached to this post): <br></div><div><br></div><div>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">package</span></b><span style=3D"font-size:10pt;font=
-family:Consolas;color:black">
<u><span style=3D"background:rgb(212,212,212) none repeat scroll 0% 0%">com=
.xyz.common.services.requestfilter</span></u>;</span><span style=3D"font-si=
ze:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> java.io.IOException;</span><span style=3D"fon=
t-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> java.io.PrintWriter;</span><span style=3D"fon=
t-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> javax.servlet.http.HttpServletRequest;</span>=
<span style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> javax.servlet.http.HttpServletResponse;</span=
><span style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> org.apache.log4j.Logger;</span><span style=3D=
"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> org.apache.tapestry5.services.HttpServletRequ=
estFilter;</span><span style=3D"font-size:10pt;font-family:Consolas"></span=
></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black"> org.apache.tapestry5.services.HttpServletRequ=
estHandler;</span><span style=3D"font-size:10pt;font-family:Consolas"></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">import</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black">
<u><span style=3D"background:rgb(212,212,212) none repeat scroll 0% 0%"><a =
href=3D"http://com.xyz" target=3D"_blank">com.xyz</a></span></u><span style=
=3D"background:rgb(212,212,212) none repeat scroll 0% 0%">.utils.ServletRes=
ponseWrapperCopier</span>;</span><span style=3D"font-size:10pt;font-family:=
Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><b><span style=3D"font-size:10pt;font-family:Consola=
s;color:rgb(127,0,85)">public</span></b><span style=3D"font-size:10pt;font-=
family:Consolas;color:black">
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">class</span></b><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black"> JavascriptCommentFilter
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">implements</span></b><span style=3D"font-size:10pt;font-family:Conso=
las;color:black"> HttpServletRequestFilter {</span><span style=3D"font-size=
:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">private</span></b><span style=3D"font-size:10pt;font-family:Consolas=
;color:black">
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">final</span></b><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">static</span></b><span style=3D"font-size:10pt;font-family:Consolas;=
color:black"> Logger
</span><b><i><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(0=
,0,192)">LOG</span></i></b><span style=3D"font-size:10pt;font-family:Consol=
as;color:black"> =3D Logger.<i>getLogger</i>(JavascriptCommentFilter.</span=
><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,0,85)"=
>class</span></b><span style=3D"font-size:10pt;font-family:Consolas;color:b=
lack">);</span><span style=3D"font-size:10pt;font-family:Consolas"></span><=
/p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(100,100=
,100)">@Override</span><span style=3D"font-size:10pt;font-family:Consolas">=
</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">public</span></b><span style=3D"font-size:10pt;font-family:Consolas;=
color:black">
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">boolean</span></b><span style=3D"font-size:10pt;font-family:Consolas=
;color:black"> service(HttpServletRequest
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">httpServletRequest</span><span style=3D"font-size:10pt;font-family:Con=
solas;color:black">, HttpServletResponse
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">httpServletResponse</span><span style=3D"font-size:10pt;font-family:Co=
nsolas;color:black">,</span><span style=3D"font-size:10pt;font-family:Conso=
las"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 HttpServletRequestHandl=
er
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">handler</span><span style=3D"font-size:10pt;font-family:Consolas;color=
:black">)
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">throws</span></b><span style=3D"font-size:10pt;font-family:Consolas;=
color:black"> IOException {</span><span style=3D"font-size:10pt;font-family=
:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 String
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">requestUrl</span><span style=3D"font-size:10pt;font-family:Consolas;co=
lor:black"> =3D
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">httpServletRequest</span><span style=3D"font-size:10pt;font-family:Con=
solas;color:black">.getRequestURL().toString();</span><span style=3D"font-s=
ize:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">boolean</span></b><span style=3D"font-size:10pt;font-family:Consolas=
;color:black">
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">handled</span><span style=3D"font-size:10pt;font-family:Consolas;color=
:black"> =3D
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">handler</span><span style=3D"font-size:10pt;font-family:Consolas;color=
:black">.service(</span><span style=3D"font-size:10pt;font-family:Consolas;=
color:rgb(106,62,62)">httpServletRequest</span><span style=3D"font-size:10p=
t;font-family:Consolas;color:black">,
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">httpServletResponse</span><span style=3D"font-size:10pt;font-family:Co=
nsolas;color:black">);</span><span style=3D"font-size:10pt;font-family:Cons=
olas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0
</span><b><i><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(0=
,0,192)">LOG</span></i></b><span style=3D"font-size:10pt;font-family:Consol=
as;color:black">.debug(</span><span style=3D"font-size:10pt;font-family:Con=
solas;color:rgb(106,62,62)">requestUrl</span><span style=3D"font-size:10pt;=
font-family:Consolas;color:black">
 + </span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(42,0=
,255)">&quot; handled by Tapestry filter: &quot;</span><span style=3D"font-=
size:10pt;font-family:Consolas;color:black"> +
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">handled</span><span style=3D"font-size:10pt;font-family:Consolas;color=
:black">);</span><span style=3D"font-size:10pt;font-family:Consolas"></span=
></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">if</span></b><span style=3D"font-size:10pt;font-family:Consolas;colo=
r:black"> (!</span><span style=3D"font-size:10pt;font-family:Consolas;color=
:rgb(106,62,62)">handled</span><span style=3D"font-size:10pt;font-family:Co=
nsolas;color:black">)
 {</span><span style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 }</span><span style=3D"font-size:10pt;font-family:Consolas"></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">if</span></b><span style=3D"font-size:10pt;font-family:Consolas;colo=
r:black"> (</span><span style=3D"font-size:10pt;font-family:Consolas;color:=
rgb(106,62,62)">requestUrl</span><span style=3D"font-size:10pt;font-family:=
Consolas;color:black">.endsWith(</span><span style=3D"font-size:10pt;font-f=
amily:Consolas;color:rgb(42,0,255)">&quot;.js&quot;</span><span style=3D"fo=
nt-size:10pt;font-family:Consolas;color:black">))
 {</span><span style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// CharResponseWrapper charResponseWrapper =3D new CharResponseWrapper=
(httpServletResponse);</span><span style=3D"font-size:10pt;font-family:Cons=
olas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
<u>ServletResponseWrapperCopier</u> </span><span style=3D"font-size:10pt;fo=
nt-family:Consolas;color:rgb(106,62,62)">capturingResponseWrapper</span><sp=
an style=3D"font-size:10pt;font-family:Consolas;color:black"> =3D
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">new</span></b><span style=3D"font-size:10pt;font-family:Consolas;col=
or:black">
<u>ServletResponseWrapperCopier</u>(</span><span style=3D"font-size:10pt;fo=
nt-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">httpServletResponse</span><span style=3D"font-size:10pt;font-family:Co=
nsolas;color:black">);</span><span style=3D"font-size:10pt;font-family:Cons=
olas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 PrintWriter
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">responseWriter</span><span style=3D"font-size:10pt;font-family:Consola=
s;color:black"> =3D
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">httpServletResponse</span><span style=3D"font-size:10pt;font-family:Co=
nsolas;color:black">.getWriter();</span><span style=3D"font-size:10pt;font-=
family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// String originalContent =3D charResponseWrapper.toString();</span><s=
pan style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 String
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">originalContent</span><span style=3D"font-size:10pt;font-family:Consol=
as;color:black"> =3D
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">capturingResponseWrapper</span><span style=3D"font-size:10pt;font-fami=
ly:Consolas;color:black">.getCaptureAsString();</span><span style=3D"font-s=
ize:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// String originalContent =3D capturingResponseWrapper.getCaptureAsStr=
ing();</span><span style=3D"font-size:10pt;font-family:Consolas"></span></p=
>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><b><i><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(0=
,0,192)">LOG</span></i></b><span style=3D"font-size:10pt;font-family:Consol=
as;color:black">.debug(</span><span style=3D"font-size:10pt;font-family:Con=
solas;color:rgb(42,0,255)">&quot;javascript
 resource detected with content: &quot;</span><span style=3D"font-size:10pt=
;font-family:Consolas;color:black"> +
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">originalContent</span><span style=3D"font-size:10pt;font-family:Consol=
as;color:black">);</span><span style=3D"font-size:10pt;font-family:Consolas=
"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">//</span><span style=3D"font-size:10pt;font-family:Consolas"></span></=
p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// int commentEnd =3D originalContent.indexOf(&quot;*/&quot;);</span><=
span style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// if (commentEnd &gt; -1) {</span><span style=3D"font-size:10pt;font-=
family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">//</span><span style=3D"font-size:10pt;font-family:Consolas"></span></=
p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// originalContent =3D originalContent.substring(commentEnd);</span><s=
pan style=3D"font-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// }</span><span style=3D"font-size:10pt;font-family:Consolas"></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">//</span><span style=3D"font-size:10pt;font-family:Consolas"></span></=
p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// originalContent =3D originalContent.replaceAll(&quot;(?m)^//.*&quot=
;, &quot;&quot;);</span><span style=3D"font-size:10pt;font-family:Consolas"=
></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">//</span><span style=3D"font-size:10pt;font-family:Consolas"></span></=
p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(63,127,=
95)">// responseWriter.write(originalContent);</span><span style=3D"font-si=
ze:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 }</span><span style=3D"font-size:10pt;font-family:Consolas"></spa=
n></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas">=
=C2=A0</span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0
</span><b><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(127,=
0,85)">return</span></b><span style=3D"font-size:10pt;font-family:Consolas;=
color:black">
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">handled</span><span style=3D"font-size:10pt;font-family:Consolas;color=
:black">;</span><span style=3D"font-size:10pt;font-family:Consolas"></span>=
</p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 }</span><span style=3D"fon=
t-size:10pt;font-family:Consolas"></span></p>
<p class=3D"MsoNormal"><span style=3D"font-size:10pt;font-family:Consolas;c=
olor:black">}</span></p>

</div><div><br></div><div>I tried several variations, like writing an=20
own servlet filter and puting it after the Tapestry Filter, but always=20
the same: the content appears to be empty. <br></div><div>Thanks in advance=
 for your suggestions!</div><div><br></div><div>Best Regards, Ric</div>

</div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">=
On Sun, Dec 1, 2019 at 3:38 PM Ric 2000 &lt;<a href=3D"mailto:erich.gormann=
[email protected]">[email protected]</a>&gt; wrote:<br></div><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px soli=
d rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div>Hi Cezary,</div>=
<div><br></div><div>first thanks for your reply. Then I was at least not co=
mpletely wrong. Let me show my code in the next reply, I will restore the v=
ersion from GIT first. <br></div><div><br></div><div>Best Regards, Erich</d=
iv><div><br></div></div><br><div class=3D"gmail_quote"><div dir=3D"ltr" cla=
ss=3D"gmail_attr">On Sat, Nov 30, 2019 at 8:38 PM Cezary Biernacki &lt;<a h=
ref=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a=
>&gt; wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px=
 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,=
<br>
as you suggested, it is possible to capture output of handling request by<b=
r>
subclassing HttpServletResponseWrapper, providing your own<br>
ServletOutputStream, and wrapping the original HttpServletResponse inside a=
<br>
filter on the requested processing pipeline. This way is not specific to<br=
>
Tapestry, maybe you only need to remember that Tapestry on the request<br>
processing pipeline is implemented as a filter, not a servlet. Tapestry<br>
itself uses this approach to implement compressing responses, see class<br>
org.apache.tapestry5.internal.gzip.GZipFilter.=C2=A0 I don&#39;t know why i=
t is not<br>
working for you, probably you have a bug, but without seeing your code it<b=
r>
hard to help you.<br>
<br>
Best regards,<br>
Cezary<br>
<br>
<br>
<br>
<br>
On Sat, Nov 30, 2019 at 10:38 AM Ric 2000 &lt;<a href=3D"mailto:erich.gorma=
[email protected]" target=3D"_blank">[email protected]</a>&gt; wrote:<br=
>
<br>
&gt; Dear all,<br>
&gt;<br>
&gt; I&#39;m struggling on how to filter and modify the response sent to th=
e client<br>
&gt; in a Tapestry web application.<br>
&gt; I tried first with a RequestFilter contributed to the RequestHandler<b=
r>
&gt; service.<br>
&gt; The problem occurred when I tried to read the content of the current<b=
r>
&gt; response out stream. There are different hints on the internet how to =
do a<br>
&gt; &quot;capture&quot; of this output stream using a custom HttpServletRe=
sponseWrapper<br>
&gt; and overwriting the write method of the ServletOutputStream, to get th=
e<br>
&gt; current content of the outputstream as byte array.<br>
&gt;<br>
&gt; But this is always empty, regardless of how I try to do it.<br>
&gt;<br>
&gt; Can you tell me, what is the right way in Tapestry to do it? Which ser=
vice<br>
&gt; do I have to contribute, in which phase of the request processing the<=
br>
&gt; response is filled and can be read, BEFORE it is send to the client?<b=
r>
&gt;<br>
&gt; Thanks a lot for your suggestions, I really appreciate them!<br>
&gt;<br>
&gt; Best Regards, Ric<br>
&gt;<br>
</blockquote></div>
</blockquote></div>

--000000000000f0d9180598a6b8c4--

--000000000000f0d91a0598a6b8c6
Content-Type: text/plain; charset=us-ascii


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
--000000000000f0d91a0598a6b8c6--