https://issues.apache.org/jira/browse/TAP5-1277

On Sat, Sep 18, 2010 at 11:33 AM, Howard Lewis Ship <[email protected]> wrote:
> I've been looking at the code, and I noticed that (for some reason)
> the code for streaming a JSONObject invokes PrintWriter.flush() at the
> end.  The code for streaming a partial page render response (which is
> also JSON) invokes PrintWriter.close().  I believe the later is
> correct. It is possible that flush() does not truly flush and that the
> end of the gzip stream never gets sent to the client, causing
> problems.
>
> I'm trying to figure out how to test this hypothesis, but I'm not sure
> how to get the current code to fail under test conditions.
>
> On Fri, Sep 17, 2010 at 3:59 AM, Michael Dukaczewski
> <[email protected]> wrote:
>> Hi Howard and all,
>>
>> thanks for your reply. I am always impressed how flexible Tapestry is.
>> The activation of the compression for JSON worked, but I was struck
>> by TAP5-469 and started some research.
>> Regarding your blog post
>> (http://tapestryjava.blogspot.com/2009/04/is-gzip-compression-compatible-with.html):
>> I tried several other combinations that worked fine, so I'm convinced
>> that GZIP compression in combination with JSON content basically works.
>> Thus, the error seems to be somewhere in the Tapestry code. My research
>> has shown that the Tapestry gzip stream sometimes does not finish
>> correctly when sending json. Therefore, the data is broken when it
>> arrives at the client. I have now solved the problem the following way
>> and it works very well:
>>
>> I have changed my event handler from:
>>
>> JSONObject onAction() {return getJson();}
>>
>> to:
>>
>> StreamResponse onAction() {return new JSONResponse(getJson());}
>>
>> and created the following wrapper:
>>
>> public class JSONResponse implements StreamResponse {
>>
>>       private static final int HEADER_SIZE = 20;
>>       private static final int MIN_DATA_SIZE = 512;
>>       private static final String CHARSET = "UTF-8";
>>
>>       private byte[] data;
>>       private boolean compress;
>>
>>       public JSONResponse(JSONCollection json) {
>>               try {
>>                       data = json.toCompactString().getBytes(CHARSET);
>>                       compress = data.length >= MIN_DATA_SIZE;
>>               } catch (UnsupportedEncodingException e) {
>>                       // should never happen!
>>               }
>>       }
>>
>>       @Override
>>       public String getContentType() {
>>               return "application/json; charset="+CHARSET;
>>       }
>>
>>       @Override
>>       public InputStream getStream() throws IOException {
>>               if (!compress) {
>>                       return new ByteArrayInputStream(data);
>>               }
>>               ByteArrayOutputStream out = new ByteArrayOutputStream(
>>                        expectedCompressedSize(data.length));
>>               GZIPOutputStream gzip = new GZIPOutputStream(out);
>>               gzip.write(data);
>>               gzip.close();
>>               byte[] gzipedData = out.toByteArray();
>>               return new ByteArrayInputStream(gzipedData);
>>       }
>>
>>       @Override
>>       public void prepareResponse(Response response) {
>>               if (compress) {
>>                       response.setHeader("Content-Encoding", "gzip");
>>               }
>>       }
>>
>>       private int expectedCompressedSize(int size) {
>>               return (size >> 2) + HEADER_SIZE;
>>       }
>>
>> }
>>
>>
>> Regards,
>> Michael
>>
>>
>>
>> Am 16.09.2010 18:03, schrieb Howard Lewis Ship:
>>> Also, make sure you disable JSON pretty printing!  Most of a JSON
>>> response is now whitespace when in development mode.
>>>
>>> On Thu, Sep 16, 2010 at 8:59 AM, Howard Lewis Ship <[email protected]> wrote:
>>>> It's a bit kludgey, but you could decorate the
>>>> ResponseCompressionAnalyzer service, something like:
>>>>
>>>> public ResponseCompressionAnalyzer
>>>> decorateResonseCompressionAnalyzer(final ResponseCompressionAnalyzer
>>>> delegate)
>>>> {
>>>>  return new REsponseCompressionAnalyzer() {
>>>>    public boolean isGzipSupported() { return delegate.isGzipSupported(); }
>>>>  public     boolean isCompressable(String contentType) {
>>>>    if (contentType.equals("application/json")) return true;
>>>>
>>>> return delegate.isCompressable(contentType);
>>>> }
>>>> };
>>>>
>>>> }
>>>>
>>>> On Thu, Sep 16, 2010 at 7:50 AM, Michael Dukaczewski
>>>> <[email protected]> wrote:
>>>>> I know. I have been following the topic. But now I have the problem that
>>>>> I have to transfer very large JSON objects. The application on which I
>>>>> am working is just for a small group of people (intranet) where I can
>>>>> make browser decisions. With luck, I can find a configuration that works
>>>>> well in my case with gzip compression. So is there a way to reactivate it?
>>>>>
>>>>>
>>>>> Am 16.09.2010 16:12, schrieb Thiago H. de Paula Figueiredo:
>>>>>> On Thu, 16 Sep 2010 10:40:08 -0300, Michael Dukaczewski
>>>>>> <[email protected]> wrote:
>>>>>>
>>>>>>> thanks for your answer, but that does not help me.
>>>>>>> Is there a simple workaround to reactivate gzip compression for json?
>>>>>>
>>>>>> It was disabled because it cause problems in some browsers.
>>>>>>
>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Howard M. Lewis Ship
>>>>
>>>> Creator of Apache Tapestry
>>>>
>>>> The source for Tapestry training, mentoring and support. Contact me to
>>>> learn how I can get you up and productive in Tapestry fast!
>>>>
>>>> (971) 678-5210
>>>> http://howardlewisship.com
>>>>
>>>
>>>
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>>
>>
>
>
>
> --
> Howard M. Lewis Ship
>
> Creator of Apache Tapestry
>
> The source for Tapestry training, mentoring and support. Contact me to
> learn how I can get you up and productive in Tapestry fast!
>
> (971) 678-5210
> http://howardlewisship.com
>



-- 
Howard M. Lewis Ship

Creator of Apache Tapestry

The source for Tapestry training, mentoring and support. Contact me to
learn how I can get you up and productive in Tapestry fast!

(971) 678-5210
http://howardlewisship.com

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to