Re: Filtering and modification of Response in Tapestry
Ric 2000 <[email protected]> Sun, 1 Dec 2019 17:09:40 +0100
| Newsgroups | gmane.comp.java.tapestry.user |
|---|---|
| Message-ID | <CAGEHc1VntCoa8f-cuU5MbGAQpCk1RxmDzMFszAgBDvwbKYW1jg@mail.gmail.com> |
--0000000000007c5ba50598a6b152
Content-Type: multipart/alternative; boundary="0000000000007c5ba20598a6b150"
--0000000000007c5ba20598a6b150
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,
@Inject RequestGlobals requestGlobals) {
configuration.add("JavascriptCommentFilter", *new**
JavascriptCommentFilter(**requestGlobals**)*,
*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
>> >
>>
>
--0000000000007c5ba20598a6b150
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<Htt=
pServletRequestFilter>
</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;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(100,100=
,100)">@Inject</span><span style=3D"font-size:10pt;font-family:Consolas;col=
or:black"> RequestGlobals
</span><span style=3D"font-size:10pt;font-family:Consolas;color:rgb(106,62,=
62)">requestGlobals</span><span style=3D"font-size:10pt;font-family:Consola=
s;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)">"JavascriptC=
ommentFilter"</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:rgb(106,62,62)">requestGlobals</sp=
an></u><u><span style=3D"font-size:10pt;font-family:Consolas;color:black">)=
</span></u><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=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)">"StoreIntoGlobals"</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">com.xyz</a></span></u><span style=3D"background:rgb=
(212,212,212) none repeat scroll 0% 0%">.utils.ServletResponseWrapperCopier=
</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)">" handled by Tapestry filter: "</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)">".js"</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)">"javascript
resource detected with content: "</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("*/");</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 > -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("(?m)^//.*"=
;, "");</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 own s=
ervlet filter and puting it after the Tapestry Filter, but always 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<br></div><div><br>=
</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 <<a href=3D"mailto:erich.g=
[email protected]">[email protected]</a>> wrote:<br></div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1p=
x solid 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 completely wrong. Let me show my code in the next reply, I will restore=
the version from GIT first. <br></div><div><br></div><div>Best Regards, Er=
ich</div><div><br></div></div><br><div class=3D"gmail_quote"><div dir=3D"lt=
r" class=3D"gmail_attr">On Sat, Nov 30, 2019 at 8:38 PM Cezary Biernacki &l=
t;<a href=3D"mailto:[email protected]" target=3D"_blank">cezary.bi@gmail.=
com</a>> wrote:<br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1e=
x">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'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 <<a href=3D"mailto:erich.gorma=
[email protected]" target=3D"_blank">[email protected]</a>> wrote:<br=
>
<br>
> Dear all,<br>
><br>
> I'm struggling on how to filter and modify the response sent to th=
e client<br>
> in a Tapestry web application.<br>
> I tried first with a RequestFilter contributed to the RequestHandler<b=
r>
> service.<br>
> The problem occurred when I tried to read the content of the current<b=
r>
> response out stream. There are different hints on the internet how to =
do a<br>
> "capture" of this output stream using a custom HttpServletRe=
sponseWrapper<br>
> and overwriting the write method of the ServletOutputStream, to get th=
e<br>
> current content of the outputstream as byte array.<br>
><br>
> But this is always empty, regardless of how I try to do it.<br>
><br>
> Can you tell me, what is the right way in Tapestry to do it? Which ser=
vice<br>
> do I have to contribute, in which phase of the request processing the<=
br>
> response is filled and can be read, BEFORE it is send to the client?<b=
r>
><br>
> Thanks a lot for your suggestions, I really appreciate them!<br>
><br>
> Best Regards, Ric<br>
><br>
</blockquote></div>
</blockquote></div>
--0000000000007c5ba20598a6b150--
--0000000000007c5ba50598a6b152
Content-Type: text/plain; charset=us-ascii
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
--0000000000007c5ba50598a6b152--