From 217985107af066c8fabbe45c3fbf4052215083a4 Mon Sep 17 00:00:00 2001 From: Chris Duarte Date: Wed, 21 Dec 2016 18:27:40 -0800 Subject: [PATCH] Parse + merge nested response headers to fix content-type checking (#147) * Parse + merge nested response headers to fix content-type checking * Remove redundant parsing of nested headers in Client.login --- service/client/client.js | 31 +++++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/service/client/client.js b/service/client/client.js index 3ac3b93ff..13de6cb0e 100644 --- a/service/client/client.js +++ b/service/client/client.js @@ -208,13 +208,6 @@ export default class Client { if (response.headers.has(HEADER_TOKEN)) { this.token = response.headers.get(HEADER_TOKEN); - } else { - // weird case where fetch does not parse the header correctly - const parseHeader = response.headers.get(HEADER_CONTENT_TYPE).split('\n'); - const filter = parseHeader.filter((h) => h.indexOf('Token:') > -1); - if (filter.length) { - this.token = filter[0].replace('Token: ', ''); - } } return data; @@ -631,7 +624,8 @@ export default class Client { doFetchWithResponse = async (url, options) => { const response = await fetch(url, this.getOptions(options)); - const contentType = response.headers.get(HEADER_CONTENT_TYPE); + const headers = parseAndMergeNestedHeaders(response.headers); + const contentType = headers.get(HEADER_CONTENT_TYPE); const isJson = contentType && contentType.indexOf(CONTENT_TYPE_JSON) !== -1; let data; @@ -662,3 +656,24 @@ export default class Client { throw {message: msg, status_code: data.status_code, url}; }; } + +function parseAndMergeNestedHeaders(originalHeaders) { + // TODO: This is a workaround for https://github.com/matthew-andrews/isomorphic-fetch/issues/97 + // The real solution is to set Access-Control-Expose-Headers on the server + const headers = new Map(); + let nestedHeaders = new Map(); + originalHeaders.forEach((val, key) => { + const capitalizedKey = key.replace(/\b[a-z]/g, (l) => l.toUpperCase()); + let realVal = val; + if (val && val.match(/\n\S+:\s\S+/)) { + const nestedHeaderStrings = val.split('\n'); + realVal = nestedHeaderStrings.shift(); + const moreNestedHeaders = new Map( + nestedHeaderStrings.map((h) => h.split(/:\s/)) + ); + nestedHeaders = new Map([...nestedHeaders, ...moreNestedHeaders]); + } + headers.set(capitalizedKey, realVal); + }); + return new Map([...headers, ...nestedHeaders]); +}