apollographql / datasource-rest

A caching data source for REST APIs
MIT License
39 stars 20 forks source link

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

Open petercmuc opened 3 months ago

petercmuc commented 3 months ago

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

slagiewka commented 6 days ago

See #229.