parseHeaders(rawHeaders) is called with following value for rawHeaders { "{\n \"cache-control\"": "\"no-cache, no-store, max-age=0, must-revalidate\"," } i believe since this isn't an array, replace is undefined so this statement fails, Note: xhr.getAllResponseHeaders() is not returning a array of all headers , there are about a dozen var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); called by: xhr.onload = function() { var options = { status: xhr.status, statusText: xhr.statusText, headers: parseHeaders(xhr.getAllResponseHeaders() || '') }; passing { "{\n \"cache-control\"": "\"no-cache, no-store, max-age=0, must-revalidate\"," }