Skip to content

JSON body is not parsed when Content-Type contains a charset #341

@petercmuc

Description

@petercmuc

My back-end returns JSON data with a content-header that contains the suffix +json'and the charset=utf-8'
The content-type is not recognized as JSON and the body is returned as a plain string instead of JSON.

The problem is the way that the Content-Type header is parsed:
Content-Type: application/whatever+json;charset=utf-8

This is the method for parsing the header (and the body):

  protected parseBody(response: FetcherResponse): Promise<object | string> {
    const contentType = response.headers.get('Content-Type');
    const contentLength = response.headers.get('Content-Length');
    if (
      // As one might expect, a "204 No Content" is empty! This means there
      // isn't enough to `JSON.parse`, and trying will result in an error.
      response.status !== 204 &&
      contentLength !== '0' &&
      contentType &&
      (contentType.startsWith('application/json') ||
        contentType.endsWith('+json'))
    ) {
      return response.json();
    } else {
      return response.text();
    }
  }

The condition for checking on JSON fails, because:
contentType.endsWith('+json')
is false in the case that there is a charset defined at the end of the header

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions