Hi! Please see https://github.com/slavb18/cachedstreamtest
There is 2 interceptors My first variant based on AbstractPhaseInterceptor https://github.com/slavb18/cachedstreamtest/blob/master/src/main/java/ru/ilb/common/jaxrs/interceptors/ReplaceOutInterceptor2.java is not working with large payloads: this returns empty string curl http://localhost:8080/cachedstreamtest/web/test?limit=100000 then i rewrite it to WriterInterceptor as you suggested: https://github.com/slavb18/cachedstreamtest/blob/master/src/main/java/ru/ilb/common/jaxrs/interceptors/ReplaceOutInterceptor.java and, when i write this test, surprisingly, CachedStream working here So may be i just found bad example in first place. Don't now how it is related to CachedStream in detail There is both two beans in this test https://github.com/slavb18/cachedstreamtest/blob/master/src/main/webapp/WEB-INF/beans.xml with working one commented 2016-10-13 17:11 GMT+04:00 Sergey Beryozkin <sberyoz...@gmail.com>: > Hi > > So far we have not seen any side-effects and this class is used a lot. I > guess there is indeed some code in that class which is problematic. > > Can you please consider creating a simple test which does an output stream > replacement from the JAX-RS filter and hits this problem ? > > Thanks, Sergey > > On 08/10/16 20:19, Vjacheslav V. Borisov wrote: > >> I have used this class istead of CachedOutputStream >> https://www.whitebyte.info/programming/java/convert-a-bytear >> rayoutputstream-into-a-bytearrayinputstream >> and also rewirte interceptor to WriterInterceptor interface, now my >> ReplaceOutInterceptor is working fine >> Thanks! >> >> 2016-10-08 1:14 GMT+04:00 Vjacheslav V. Borisov <slav...@gmail.com>: >> >> Hi! >>> >>> I see WriterInterceptorContext could be used, but it also requires >>> CachedOutputStream to intercept OutputStream, I see this in >>> JweJsonWriterInterceptor... >>> So CachedOutputStream bug will be repeated in WriterInterceptorContext >>> >>> >>> >>> >>> 2016-09-20 13:13 GMT+04:00 Sergey Beryozkin <sberyoz...@gmail.com>: >>> >>> Hi, >>>> JAX-RS ContainerRequestContext and ContainerResponseContext, as well as >>>> WriterInterceptorContext and ReaderInterceptorContext filter contexts >>>> all >>>> allow resetting the entity streams or on the way out - entity objects - >>>> perhaps that can offer a simpler option for replacing the content... >>>> >>>> Cheers, Sergey >>>> >>>> On 19/09/16 11:30, Vjacheslav V. Borisov wrote: >>>> >>>> During message.getInterceptorChain().doIntercept(message); I see call >>>>> to >>>>> maybeDeleteTempFile() which resets inmem = true; >>>>> and later csnew.getInputStream() execution leads to if (inmem) { } >>>>> >>>>> 2016-09-19 13:05 GMT+04:00 Vjacheslav V. Borisov <slav...@gmail.com>: >>>>> >>>>> Hi! >>>>> >>>>>> >>>>>> I have following code (this is interceptror which does regular >>>>>> expression >>>>>> replacements) >>>>>> >>>>>> >>>>>> https://github.com/ilb/common/blob/master/common-jaxrs/src/ >>>>>> main/java/ru/ilb/common/jaxrs/interceptors/ReplaceOutInterceptor.java >>>>>> >>>>>> private void replaceContents(Message message) { >>>>>> OutputStream os = message.getContent(OutputStream.class); >>>>>> CachedStream cs = new CachedStream(); >>>>>> message.setContent(OutputStream.class, cs); >>>>>> >>>>>> message.getInterceptorChain().doIntercept(message); >>>>>> >>>>>> try { >>>>>> cs.flush(); >>>>>> CachedOutputStream csnew = (CachedOutputStream) >>>>>> message.getContent(OutputStream.class); >>>>>> >>>>>> String contents = IOUtils.toString(csnew.getInpu >>>>>> tStream()); >>>>>> for (Map.Entry<String, String> keyValue : >>>>>> replacements.entrySet()) { >>>>>> contents = contents.replaceAll(keyValue.getKey(), >>>>>> keyValue.getValue()); >>>>>> } >>>>>> //String replaced=contents.replaceAll(regex, >>>>>> replacement); >>>>>> os.write(contents.getBytes(Charset.forName(encoding))); >>>>>> os.flush(); >>>>>> >>>>>> message.setContent(OutputStream.class, os); >>>>>> >>>>>> } catch (IOException ioe) { >>>>>> throw new RuntimeException(ioe); >>>>>> } >>>>>> } >>>>>> >>>>>> >>>>>> >>>>>> Howewer, when response contents length of if less than threshold >>>>>> (128 * >>>>>> 1024 bytes) >>>>>> i can get csnew.getInputStream() and get its contents, but when >>>>>> content >>>>>> is >>>>>> more than treshold, >>>>>> i see that in enforceLimits() -> createFileOutputStream() temp file is >>>>>> created, >>>>>> but using csnew.getInputStream() I am getting empty stream. >>>>>> >>>>>> >>>>>> >>>>> >>>> -- >>>> Sergey Beryozkin >>>> >>>> Talend Community Coders >>>> http://coders.talend.com/ >>>> >>>> >>> >>> >> > > -- > Sergey Beryozkin > > Talend Community Coders > http://coders.talend.com/ >