Philip Mundt created SLING-8047:
-----------------------------------

             Summary: 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


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 (tbd)
 * ExportServlet (tbd)



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to