[
https://issues.apache.org/jira/browse/NIFI-1539?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Matt Gilman resolved NIFI-1539.
-------------------------------
Resolution: Fixed
Fix Version/s: 0.6.0
> Add correct parsing of content type in accordance with RFC 2045
> ---------------------------------------------------------------
>
> Key: NIFI-1539
> URL: https://issues.apache.org/jira/browse/NIFI-1539
> Project: Apache NiFi
> Issue Type: Bug
> Affects Versions: 0.5.0
> Reporter: Sönke Liebau
> Priority: Minor
> Fix For: 0.6.0
>
>
> The content viewer does not display json content when the content-type string
> does not exactly match "application/json" for example:
> "application/json;charset=UTF8" or "application/Json" trigger the error
> message "No viewer is registered for this content type."
> According to [RFC 2045|https://www.ietf.org/rfc/rfc2045.txt] there can be any
> number of parameters following the type and subtype values, so I believe
> these should not impact the viewer chosen to display this content.
> Furthermore, the rfc states that type and subtype are to be treated case
> insensitive, which is also not given as all checks I found in the code are
> purely against lowercase.
> As far as I can tell this is checked twice, the viewer for the content type
> is obtained from a Context object, if there is no viewer that matches exactly
> the error message stated above is shown.
> After this was successful a string comparison is done in the
> StandardContentViewerController class:
> {code:title=StandardContentViewerController.java|borderStyle=solid}
> if ("application/json".equals(contentType) ||
> "application/xml".equals(contentType) || "text/plain".equals(contentType) ||
> "text/csv".equals(contentType)) {
> ...
> }
> {code}
> So even if the Viewer was assigned to this content type if would fail here.
> h3. Proposed solution
> - Add code to DownloadableContent.java to parse content type string at
> creation and store only lowercased type and subtype, which is retrieved by
> getter method, so no changes are necessary to downstream code
> - Add map to object to store parameters that were contained in the original
> value
> - Either make the entire parameters map object retrievable or create getter
> to retrieve parameter from map by parameter name
> - Add method to retrieve original field value, I propose to build the value
> on request from stored type, subtype and parameters, this way we can
> implement some light error handling and ensure to always hand out properly
> formed strings, even if the input value may have had some small error (there
> is no need to pay attention to parameter order, as per rfc the order
> shouldn't matter)
> h3. Discussion points
> - Anything that actually relies on access to parameters in the content type
> would break, this could be avoided by not changing the getType method but
> instead adding a new method to return type without parameters instead.
> Drawback to this is that current implementation of ContentViewerController
> would need to be changed to use this new function. I am unsure which aproach
> is preferable..
> - If there are classes downstream that access the content type field not via
> DownloadableContent, this shouldn't break anything, as the status quo is
> preserved, but there is a small chance that you get two different content
> types, if you actually use both methods
> I am happy to create a pull request to this effect if open points can be
> clarified and this is deemed useful.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)