[
https://issues.apache.org/jira/browse/SLING-8047?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16668614#comment-16668614
]
Philip Mundt commented on SLING-8047:
-------------------------------------
[~jsedding] that's what I'm wondering too. I wasn't able to find the root cause
yet. But it seems that the buffer is overwritten somewhere, if not flushed in
the {{org.apache.sling.servlets.get.impl.helpers.JsonRenderer}}.
Regarding your question: it's a fake response implementation that wraps (in our
case) a {{java.io.ByteArrayOutputStream}} in a {{java.io.OutputStreamWriter}}
and passes it to the {{java.io.PrintWriter}} ({{autoFlush}} is set to
{{true}}). The response object does not implement the {{#flushBuffer()}}
method, but even if I do (I quickly tried, flushing print writer and output
stream) nothing changes. The only working solution up until now was flushing
the writer in the JSON renderer.
> Rendered/exported JSON requested via SlingRequestProcessor is not written to
> output stream
> ------------------------------------------------------------------------------------------
>
> Key: SLING-8047
> URL: https://issues.apache.org/jira/browse/SLING-8047
> Project: Sling
> Issue Type: Bug
> Components: Feature Model, Servlets
> Reporter: Philip Mundt
> Assignee: Jason E Bailey
> Priority: Major
> Attachments:
> SLING-8047-DefaultGetServlet-does-not-write-to-output-stream.patch,
> SLING-8047-ExportServlet-does-not-write-to-output-stream.patch
>
> Time Spent: 20m
> Remaining Estimate: 0h
>
> While trying to facilitate the {{SlingRequestProcessor}} to get a rendered or
> exported JSON representation of a resource, we ran into the problem of the
> response always being empty. The HTML rendering worked without any issue.
> (See example code of [Get the rendered HTML for an AEM resource, component or
> page|http://www.nateyolles.com/blog/2015/10/get-rendered-html-for-an-aem-resource-or-component]
> or [https://stackoverflow.com/a/34218708])
> Main, observed difference seem to be the method calls to print writer:
> h4. JsonRenderer
> {{org.apache.sling.servlets.get.impl.helpers.JsonRenderer#render}} uses
> {{#write}} method of response's print writer.
> h4. ExportServlet (via JacksonExporter)
> {{org.apache.sling.models.impl.ExportServlet#doGet}} uses {{#write}} method
> of response's print writer.
> h4. HTMLRenderer
> {{org.apache.sling.servlets.get.impl.helpers.HtmlRenderer#render}} uses
> {{#print}} and {{#println}} methods of response's print writer.
> h3. Further observations
> When the print writer's {{autoFlush}} property is set to true and one uses
> the {{#println}} method instead of {{#write}}, the {{JsonRenderer}} will
> flush the print writer's buffer to the output stream. Due to wrapping the
> response in
> {{org.apache.sling.scripting.core.impl.helper.OnDemandWriterResponse}} (where
> {{autoFlush=false}}) this does not work for the {{ExportServlet}}.
> When adding implicit {{#flush()}} calls to both classes, both request
> scenarios will work. According to the servlet specification, it should not be
> necessary to flush the print writer, as the container must immediately flush
> all remaining content to the client upon "termination of the service method
> of the servlet".
> Please find two test cases for (where implicit {{#flush()}} calls were added):
> * JsonRenderer ({{sling-org-apache-sling-servlets-get}}):
> [^SLING-8047-DefaultGetServlet-does-not-write-to-output-stream.patch]
> * ExportServlet ({{sling-org-apache-sling-models-impl}}):
> [^SLING-8047-ExportServlet-does-not-write-to-output-stream.patch]
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)