Hi Cezary, this sounds great, so I now see my error, but will try it with the configuration parameter, you mentioned.
Thanks a lot. Best Regards, Ric On Sun, Dec 1, 2019 at 10:50 PM Cezary Biernacki <cezary...@gmail.com> wrote: > Hi, > you get empty output because in line > > *boolean* handled = handler.service(httpServletRequest, > httpServletResponse); > you pass the original "httpServletResponse". This lines pass processing to > the rest of the filter pipeline where actual generation of the response > happens, and because the original object is passed, the content of the > response is sent to the client, not captured by your wrapper class. > > You need to create your wrapper before calling "handler.service()", pass > the wrapper as the second argument, and process captured output after > "handler.service()". It should fix the problem with getting always an empty > output. > > But I suspect you will have more problems and this way is not really > optimal. Tapestry has a special pipeline for handling assets like > JavaScript in the form of StreamableSource decorators, > ResourceTransformer-s and ResourceMinimisers. Files translated, minified > and compressed before sending to output - so your code would probably not > find any recognisable part to process. Tapestry also caches results of this > processing, so usually it is done only once, not on every requests as in > your code, which significantly improves performance. More importantly, > minification of JavaScript files removes comments. Minification is > controlled by "tapestry.enable-minification" > (see org.apache.tapestry5.SymbolConstants#MINIFICATION_ENABLED), which > normally is enabled in the production mode and disabled in the development > mode. So if your goal is to remove comments from JavaScript files, just run > your Tapestry application mode. > > Best regards, > Cezary > > > On Sun, Dec 1, 2019 at 5:12 PM Ric 2000 <erich.gorma...@gmail.com> wrote: > > > 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 <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 >