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/
>

Reply via email to