You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.2 KiB
50 lines
1.2 KiB
var window = require('global/window');
|
|
|
|
const httpResponseHandler = (callback, decodeResponseBody = false) => (err, response, responseBody) => {
|
|
// if the XHR failed, return that error
|
|
if (err) {
|
|
callback(err);
|
|
return;
|
|
}
|
|
|
|
// if the HTTP status code is 4xx or 5xx, the request also failed
|
|
if (response.statusCode >= 400 && response.statusCode <= 599) {
|
|
let cause = responseBody;
|
|
|
|
if (decodeResponseBody) {
|
|
if (window.TextDecoder) {
|
|
const charset = getCharset(response.headers && response.headers['content-type']);
|
|
|
|
try {
|
|
cause = new TextDecoder(charset).decode(responseBody);
|
|
} catch (e) {
|
|
}
|
|
} else {
|
|
cause = String.fromCharCode.apply(null, new Uint8Array(responseBody));
|
|
}
|
|
}
|
|
|
|
callback({cause});
|
|
return;
|
|
}
|
|
|
|
// otherwise, request succeeded
|
|
callback(null, responseBody);
|
|
};
|
|
|
|
function getCharset(contentTypeHeader = '') {
|
|
return contentTypeHeader
|
|
.toLowerCase()
|
|
.split(';')
|
|
.reduce((charset, contentType) => {
|
|
const [type, value] = contentType.split('=');
|
|
|
|
if (type.trim() === 'charset') {
|
|
return value.trim();
|
|
}
|
|
|
|
return charset;
|
|
}, 'utf-8');
|
|
}
|
|
|
|
module.exports = httpResponseHandler;
|
|
|