cloudinary-core
Version:
Cloudinary Client Side JS library. Cloudinary streamlines your web application’s image manipulation needs. Cloudinary's cloud-based servers automate image uploading, resizing, cropping, optimizing, sprite generation and more.
88 lines (75 loc) • 2.25 kB
JavaScript
/**
* @description Returns an object hash of header -> value
* @param {string} url
* @param {number} max_timeout_ms - Time to elapse before promise is rejected
* @return {Promise<{
* status: 'success' | 'error'
* message?: string
* payload: object,
* }>}
*/
function getHeadersFromURL(url, max_timeout_ms = 5000) {
url = url + '.webm'; // Headers are alaways fetched as webm
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
let timeoutID = setErrorHandling(xhr, max_timeout_ms, reject);
xhr.onreadystatechange = function () {
if (this.readyState === this.HEADERS_RECEIVED) {
// clear the time-out rejection
clearTimeout(timeoutID); // clear timeout reject error
// Get the raw header string
let headers = xhr.getAllResponseHeaders();
let headerMap = headerStringToMap(headers);
resolve({
status: 'success',
payload: headerMap
});
}
};
xhr.open('HEAD', url, true);
xhr.send();
});
}
/**
* @description Convert the Header string to a map of key:value
* @param {string} headers
* @return {{}}
*/
function headerStringToMap(headers) {
// Convert the header string into an array
// of individual headers
let arr = headers.trim().split(/[\r\n]+/);
// Create a map of header names to values
let headerMap = {};
arr.forEach(function (line) {
let parts = line.split(': ');
let header = parts.shift();
let value = parts.join(': ');
headerMap[header] = value;
});
return headerMap;
}
/**
*
* @param {XMLHttpRequest} xhr
* @param {number} max_timeout_ms - Time to elapse before timeoutCallback is called
* @param {Function} timeoutCallback
* @return {number};
*/
function setErrorHandling(xhr, max_timeout_ms, timeoutCallback) {
let timeoutID = setTimeout(() => {
timeoutCallback({
status: 'error',
message: 'Timeout reading headers from server'
});
}, max_timeout_ms);
xhr.onerror = function () {
clearTimeout(timeoutID); // clear timeout reject error
timeoutCallback({
status: 'error',
message: 'Error reading headers from server'
});
};
return timeoutID;
}
export default getHeadersFromURL;