export async function request()

in experimenter/experimenter/legacy/legacy-ui/core/js/utils/request.js [1:64]


export async function request(url, options = {}, extraHeaders = {}) {
  let queryString = '';

  const headers = new Headers();
  headers.append('Accept', 'application/json');
  if (!(options.body && options.body instanceof FormData)) {
    headers.append('Content-Type', 'application/json');
  }

  for (let headerName in extraHeaders) {
    headers.append(headerName, extraHeaders[headerName]);
  }

  const settings = {
    headers,
    credentials: 'same-origin',
    method: 'GET',
    ...options,
  };

  // Convert `data` to `body` or querystring if necessary.
  if ('data' in settings) {
    if ('body' in settings) {
      throw new Error('Only pass one of `settings.data` and `settings.body`.');
    }

    if (['GET', 'HEAD'].includes(settings.method.toUpperCase())) {
      const queryStringData = Object.keys(settings.data).map(
        key => `${key}=${encodeURIComponent(settings.data[key])}`,
      );
      queryString = `?${queryStringData.join('&')}`;
    } else {
      settings.body = JSON.stringify(settings.data);
    }

    delete settings.data;
  }

  const response = await fetch(`${url}${queryString}`, settings);

  if (!response.ok) {
    let message;
    let data = {};
    let err;

    try {
      data = await response.json();
      message = data.detail || response.statusText;
    } catch (error) {
      message = `Invalid JSON in API Response: ${url}`;
      err = error;
    }

    data = { ...data, status: response.status };

    throw new RequestError(message, data, err);
  }

  if (response.status !== 204) {
    return response.json();
  }

  return null;
}