Sling Model Exporter appears to set incorrect response content-type

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Sling Model Exporter appears to set incorrect response content-type

chrismillar
I've constructed a Sling Model Exporter with very basic options [0], and it
seems to be outputting:

Content-Type: application/json; charset=ISO-8859-1

This breaks the JSON RFC [1] as the default character encoding. It should
be:

Content-Type: application/json; charset=UTF-8

I'm hoping there's a solution to this, or that I'm missing something
obvious. Any help is greatly appreciated.

[0] https://gist.github.com/auniverseaway/c8b7b9013b5ecdd9c790253d194d17b6
[1] https://tools.ietf.org/html/rfc7159#section-8.1
Reply | Threaded
Open this post in threaded view
|

Re: Sling Model Exporter appears to set incorrect response content-type

justzzzz
Hi Chris,
Are you sure that the charset is being added by Sling, i.e. are you
accessing Sling directly or via an Apache server?

The Export Servlet doesn't actually try to infer anything about the content
type header. It just sets it to request.getResponseContentType(). See
[1]. If you trace that back far enough, it ultimately comes from the
MimeTypeService which I don't believe would ever include a charset. In the
ITs this comes back as just application/json.

Regards,
Justin

[1]
https://github.com/apache/sling-org-apache-sling-models-impl/blob/master/src/main/java/org/apache/sling/models/impl/ExportServlet.java#L110
[2]
https://github.com/apache/sling-org-apache-sling-models-integration-tests/blob/master/src/test/java/org/apache/sling/models/testing/exporter/ExporterIT.java#L287

On Wed, Nov 29, 2017 at 6:45 PM Chris Millar <[hidden email]> wrote:

> I've constructed a Sling Model Exporter with very basic options [0], and it
> seems to be outputting:
>
> Content-Type: application/json; charset=ISO-8859-1
>
> This breaks the JSON RFC [1] as the default character encoding. It should
> be:
>
> Content-Type: application/json; charset=UTF-8
>
> I'm hoping there's a solution to this, or that I'm missing something
> obvious. Any help is greatly appreciated.
>
> [0] https://gist.github.com/auniverseaway/c8b7b9013b5ecdd9c790253d194d17b6
> [1] https://tools.ietf.org/html/rfc7159#section-8.1
>
Reply | Threaded
Open this post in threaded view
|

Re: Sling Model Exporter appears to set incorrect response content-type

chrismillar
I'm accessing Sling (AEM) directly on port 4502. I can put together a test
project with Sling and see if it makes a difference.

If you look at the getResponseContentType method [0], you can see this does
not include the charset.

Is it getting set somewhere else or being defaulted? Hitting the JCR
directly gives me the correct charset.

Is there no way I can get to the response object to set this in the model?
Looking at the Impl, it didn't look like it.

[0]
https://sling.apache.org/apidocs/sling9/org/apache/sling/api/SlingHttpServletRequest.html#getResponseContentType

On Wed, Nov 29, 2017 at 5:14 PM, Justin Edelson <[hidden email]>
wrote:

> Hi Chris,
> Are you sure that the charset is being added by Sling, i.e. are you
> accessing Sling directly or via an Apache server?
>
> The Export Servlet doesn't actually try to infer anything about the content
> type header. It just sets it to request.getResponseContentType(). See
> [1]. If you trace that back far enough, it ultimately comes from the
> MimeTypeService which I don't believe would ever include a charset. In the
> ITs this comes back as just application/json.
>
> Regards,
> Justin
>
> [1]
> https://github.com/apache/sling-org-apache-sling-models-
> impl/blob/master/src/main/java/org/apache/sling/models/
> impl/ExportServlet.java#L110
> [2]
> https://github.com/apache/sling-org-apache-sling-models-
> integration-tests/blob/master/src/test/java/org/apache/
> sling/models/testing/exporter/ExporterIT.java#L287
>
> On Wed, Nov 29, 2017 at 6:45 PM Chris Millar <[hidden email]> wrote:
>
> > I've constructed a Sling Model Exporter with very basic options [0], and
> it
> > seems to be outputting:
> >
> > Content-Type: application/json; charset=ISO-8859-1
> >
> > This breaks the JSON RFC [1] as the default character encoding. It should
> > be:
> >
> > Content-Type: application/json; charset=UTF-8
> >
> > I'm hoping there's a solution to this, or that I'm missing something
> > obvious. Any help is greatly appreciated.
> >
> > [0] https://gist.github.com/auniverseaway/c8b7b9013b5ecdd9c790253d194d17
> b6
> > [1] https://tools.ietf.org/html/rfc7159#section-8.1
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Sling Model Exporter appears to set incorrect response content-type

justzzzz
I'm not sure what you mean by "Hitting the JCR directly..." since JCR has
no HTTP support.

In any case, as I said, the ExportServlet doesn't do any special handling
with the content type and the ITs show that application/json is being set,
so I would suggest using a debugger against your instance to see where the
charset is being introduced.

Regards,
Justin

On Wed, Nov 29, 2017 at 7:30 PM Chris Millar <[hidden email]> wrote:

> I'm accessing Sling (AEM) directly on port 4502. I can put together a test
> project with Sling and see if it makes a difference.
>
> If you look at the getResponseContentType method [0], you can see this does
> not include the charset.
>
> Is it getting set somewhere else or being defaulted? Hitting the JCR
> directly gives me the correct charset.
>
> Is there no way I can get to the response object to set this in the model?
> Looking at the Impl, it didn't look like it.
>
> [0]
>
> https://sling.apache.org/apidocs/sling9/org/apache/sling/api/SlingHttpServletRequest.html#getResponseContentType
>
> On Wed, Nov 29, 2017 at 5:14 PM, Justin Edelson <[hidden email]>
> wrote:
>
> > Hi Chris,
> > Are you sure that the charset is being added by Sling, i.e. are you
> > accessing Sling directly or via an Apache server?
> >
> > The Export Servlet doesn't actually try to infer anything about the
> content
> > type header. It just sets it to request.getResponseContentType(). See
> > [1]. If you trace that back far enough, it ultimately comes from the
> > MimeTypeService which I don't believe would ever include a charset. In
> the
> > ITs this comes back as just application/json.
> >
> > Regards,
> > Justin
> >
> > [1]
> > https://github.com/apache/sling-org-apache-sling-models-
> > impl/blob/master/src/main/java/org/apache/sling/models/
> > impl/ExportServlet.java#L110
> > [2]
> > https://github.com/apache/sling-org-apache-sling-models-
> > integration-tests/blob/master/src/test/java/org/apache/
> > sling/models/testing/exporter/ExporterIT.java#L287
> >
> > On Wed, Nov 29, 2017 at 6:45 PM Chris Millar <[hidden email]> wrote:
> >
> > > I've constructed a Sling Model Exporter with very basic options [0],
> and
> > it
> > > seems to be outputting:
> > >
> > > Content-Type: application/json; charset=ISO-8859-1
> > >
> > > This breaks the JSON RFC [1] as the default character encoding. It
> should
> > > be:
> > >
> > > Content-Type: application/json; charset=UTF-8
> > >
> > > I'm hoping there's a solution to this, or that I'm missing something
> > > obvious. Any help is greatly appreciated.
> > >
> > > [0]
> https://gist.github.com/auniverseaway/c8b7b9013b5ecdd9c790253d194d17
> > b6
> > > [1] https://tools.ietf.org/html/rfc7159#section-8.1
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Sling Model Exporter appears to set incorrect response content-type

chrismillar
"Hitting the JCR directly" I.E. No Exporter:
http://localhost:8080/content/bar.0.json for a JCR dump via Sling.

It looks like this is a result of the Export Servlet not setting any
character encoding, and only setting the content type. Both are needed,
otherwise `charset` defaults to ISO-8859-1 which comes from
javax.servlet.http.HttpServletResponse.

I have put together a demo project [0] to see the before results, as well
as a fork of sling.model.impl to see the after [1] when character encoding
properly set.

Install the demo, navigate to [2] and note the charset in Content-Type
header. It's incorrect (ISO-8859-1).
Once done, install the POC branch of models impl (and snapshot
dependencies) to see how the response has changed.

This is a bare-minimum solution [3]. Really, the ExportServlet should
detect the proper character encoding. This could come from either setting
in the request on the model (passed through the mixin?), or getting it from
other means.

[0] https://github.com/auniverseaway/sling-model-charset
[1]
https://github.com/auniverseaway/sling-org-apache-sling-models-impl/tree/POC_Character_Encoding
[2] http://localhost:8080/content/bar.model.json
[3]
https://github.com/auniverseaway/sling-org-apache-sling-models-impl/blob/POC_Character_Encoding/src/main/java/org/apache/sling/models/impl/ExportServlet.java#L95

On Wed, Nov 29, 2017 at 7:04 PM, Justin Edelson <[hidden email]>
wrote:

> I'm not sure what you mean by "Hitting the JCR directly..." since JCR has
> no HTTP support.
>
> In any case, as I said, the ExportServlet doesn't do any special handling
> with the content type and the ITs show that application/json is being set,
> so I would suggest using a debugger against your instance to see where the
> charset is being introduced.
>
> Regards,
> Justin
>
> On Wed, Nov 29, 2017 at 7:30 PM Chris Millar <[hidden email]> wrote:
>
> > I'm accessing Sling (AEM) directly on port 4502. I can put together a
> test
> > project with Sling and see if it makes a difference.
> >
> > If you look at the getResponseContentType method [0], you can see this
> does
> > not include the charset.
> >
> > Is it getting set somewhere else or being defaulted? Hitting the JCR
> > directly gives me the correct charset.
> >
> > Is there no way I can get to the response object to set this in the
> model?
> > Looking at the Impl, it didn't look like it.
> >
> > [0]
> >
> > https://sling.apache.org/apidocs/sling9/org/apache/sling/api/
> SlingHttpServletRequest.html#getResponseContentType
> >
> > On Wed, Nov 29, 2017 at 5:14 PM, Justin Edelson <
> [hidden email]>
> > wrote:
> >
> > > Hi Chris,
> > > Are you sure that the charset is being added by Sling, i.e. are you
> > > accessing Sling directly or via an Apache server?
> > >
> > > The Export Servlet doesn't actually try to infer anything about the
> > content
> > > type header. It just sets it to request.getResponseContentType(). See
> > > [1]. If you trace that back far enough, it ultimately comes from the
> > > MimeTypeService which I don't believe would ever include a charset. In
> > the
> > > ITs this comes back as just application/json.
> > >
> > > Regards,
> > > Justin
> > >
> > > [1]
> > > https://github.com/apache/sling-org-apache-sling-models-
> > > impl/blob/master/src/main/java/org/apache/sling/models/
> > > impl/ExportServlet.java#L110
> > > [2]
> > > https://github.com/apache/sling-org-apache-sling-models-
> > > integration-tests/blob/master/src/test/java/org/apache/
> > > sling/models/testing/exporter/ExporterIT.java#L287
> > >
> > > On Wed, Nov 29, 2017 at 6:45 PM Chris Millar <[hidden email]> wrote:
> > >
> > > > I've constructed a Sling Model Exporter with very basic options [0],
> > and
> > > it
> > > > seems to be outputting:
> > > >
> > > > Content-Type: application/json; charset=ISO-8859-1
> > > >
> > > > This breaks the JSON RFC [1] as the default character encoding. It
> > should
> > > > be:
> > > >
> > > > Content-Type: application/json; charset=UTF-8
> > > >
> > > > I'm hoping there's a solution to this, or that I'm missing something
> > > > obvious. Any help is greatly appreciated.
> > > >
> > > > [0]
> > https://gist.github.com/auniverseaway/c8b7b9013b5ecdd9c790253d194d17
> > > b6
> > > > [1] https://tools.ietf.org/html/rfc7159#section-8.1
> > > >
> > >
> >
>
Reply | Threaded
Open this post in threaded view
|

Re: Sling Model Exporter appears to set incorrect response content-type

justzzzz
Thanks. I think I see the problem. This is a bug in Jetty.

https://github.com/eclipse/jetty.project/blob/master/jetty-http/src/main/resources/org/eclipse/jetty/http/encoding.properties
only
includes text/json as mapped to UTF-8. It should also set this for
application/json.

We could certainly choose to work around this in Sling, but it should be
done at a lower level than the ExportServlet.

Regards,
Justin

On Wed, Nov 29, 2017 at 11:19 PM Chris Millar <[hidden email]> wrote:

> "Hitting the JCR directly" I.E. No Exporter:
> http://localhost:8080/content/bar.0.json for a JCR dump via Sling.
>
> It looks like this is a result of the Export Servlet not setting any
> character encoding, and only setting the content type. Both are needed,
> otherwise `charset` defaults to ISO-8859-1 which comes from
> javax.servlet.http.HttpServletResponse.
>
> I have put together a demo project [0] to see the before results, as well
> as a fork of sling.model.impl to see the after [1] when character encoding
> properly set.
>
> Install the demo, navigate to [2] and note the charset in Content-Type
> header. It's incorrect (ISO-8859-1).
> Once done, install the POC branch of models impl (and snapshot
> dependencies) to see how the response has changed.
>
> This is a bare-minimum solution [3]. Really, the ExportServlet should
> detect the proper character encoding. This could come from either setting
> in the request on the model (passed through the mixin?), or getting it from
> other means.
>
> [0] https://github.com/auniverseaway/sling-model-charset
> [1]
>
> https://github.com/auniverseaway/sling-org-apache-sling-models-impl/tree/POC_Character_Encoding
> [2] http://localhost:8080/content/bar.model.json
> [3]
>
> https://github.com/auniverseaway/sling-org-apache-sling-models-impl/blob/POC_Character_Encoding/src/main/java/org/apache/sling/models/impl/ExportServlet.java#L95
>
> On Wed, Nov 29, 2017 at 7:04 PM, Justin Edelson <[hidden email]>
> wrote:
>
> > I'm not sure what you mean by "Hitting the JCR directly..." since JCR has
> > no HTTP support.
> >
> > In any case, as I said, the ExportServlet doesn't do any special handling
> > with the content type and the ITs show that application/json is being
> set,
> > so I would suggest using a debugger against your instance to see where
> the
> > charset is being introduced.
> >
> > Regards,
> > Justin
> >
> > On Wed, Nov 29, 2017 at 7:30 PM Chris Millar <[hidden email]> wrote:
> >
> > > I'm accessing Sling (AEM) directly on port 4502. I can put together a
> > test
> > > project with Sling and see if it makes a difference.
> > >
> > > If you look at the getResponseContentType method [0], you can see this
> > does
> > > not include the charset.
> > >
> > > Is it getting set somewhere else or being defaulted? Hitting the JCR
> > > directly gives me the correct charset.
> > >
> > > Is there no way I can get to the response object to set this in the
> > model?
> > > Looking at the Impl, it didn't look like it.
> > >
> > > [0]
> > >
> > > https://sling.apache.org/apidocs/sling9/org/apache/sling/api/
> > SlingHttpServletRequest.html#getResponseContentType
> > >
> > > On Wed, Nov 29, 2017 at 5:14 PM, Justin Edelson <
> > [hidden email]>
> > > wrote:
> > >
> > > > Hi Chris,
> > > > Are you sure that the charset is being added by Sling, i.e. are you
> > > > accessing Sling directly or via an Apache server?
> > > >
> > > > The Export Servlet doesn't actually try to infer anything about the
> > > content
> > > > type header. It just sets it to request.getResponseContentType(). See
> > > > [1]. If you trace that back far enough, it ultimately comes from the
> > > > MimeTypeService which I don't believe would ever include a charset.
> In
> > > the
> > > > ITs this comes back as just application/json.
> > > >
> > > > Regards,
> > > > Justin
> > > >
> > > > [1]
> > > > https://github.com/apache/sling-org-apache-sling-models-
> > > > impl/blob/master/src/main/java/org/apache/sling/models/
> > > > impl/ExportServlet.java#L110
> > > > [2]
> > > > https://github.com/apache/sling-org-apache-sling-models-
> > > > integration-tests/blob/master/src/test/java/org/apache/
> > > > sling/models/testing/exporter/ExporterIT.java#L287
> > > >
> > > > On Wed, Nov 29, 2017 at 6:45 PM Chris Millar <[hidden email]>
> wrote:
> > > >
> > > > > I've constructed a Sling Model Exporter with very basic options
> [0],
> > > and
> > > > it
> > > > > seems to be outputting:
> > > > >
> > > > > Content-Type: application/json; charset=ISO-8859-1
> > > > >
> > > > > This breaks the JSON RFC [1] as the default character encoding. It
> > > should
> > > > > be:
> > > > >
> > > > > Content-Type: application/json; charset=UTF-8
> > > > >
> > > > > I'm hoping there's a solution to this, or that I'm missing
> something
> > > > > obvious. Any help is greatly appreciated.
> > > > >
> > > > > [0]
> > > https://gist.github.com/auniverseaway/c8b7b9013b5ecdd9c790253d194d17
> > > > b6
> > > > > [1] https://tools.ietf.org/html/rfc7159#section-8.1
> > > > >
> > > >
> > >
> >
>