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 <erich.gorma...@gmail.com> 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 <cezary...@gmail.com>
> 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 <erich.gorma...@gmail.com>
>> 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
>> >
>>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org
For additional commands, e-mail: users-h...@tapestry.apache.org

Reply via email to