aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-web/src/main/js/helpers/request.js
blob: 74a5eaaf3bcba18c1bc7a38a9310305327b63b24 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import _ from 'underscore';

/**
 * Default options for any request
 * @type {{credentials: string}}
 */
const OPTIONS = {
  type: 'GET',
  credentials: 'same-origin'
};


/**
 * Default request headers
 * @type {{Accept: string}}
 */
const HEADERS = {
  'Accept': 'application/json'
};


/**
 * Create a query string from an object
 * @param {object} parameters
 * @returns {string}
 */
function queryString (parameters) {
  return Object.keys(parameters)
      .map(key => {
        return `${encodeURIComponent(key)}=${encodeURIComponent(parameters[key])}`;
      })
      .join('&');
}


/**
 * Request
 */
class Request {
  constructor (url) {
    this.url = url;
    this.options = {};
    this.headers = {};
  }

  submit () {
    let url = this.url;
    let options = _.defaults(this.options, OPTIONS);
    let headers = _.defaults(this.headers, HEADERS);
    options.headers = headers;
    if (this.data) {
      if (options.type === 'GET') {
        url += '?' + queryString(this.data);
      } else {
        options.body = queryString(this.data);
      }
    }
    return window.fetch(url, options);
  }

  setData (data) {
    this.data = data;
    return this;
  }
}


/**
 * Make a request
 * @param {string} url
 * @returns {Request}
 */
export function request (url) {
  return new Request(url);
}


/**
 * Check that response status is ok
 * @param response
 * @returns {*}
 */
export function checkStatus (response) {
  if (response.status >= 200 && response.status < 300) {
    return response;
  } else {
    var error = new Error(response.status);
    error.response = response;
    throw error;
  }
}


/**
 * Parse response as JSON
 * @param response
 * @returns {object}
 */
export function parseJSON (response) {
  return response.json();
}


/**
 * Shortcut to do a GET request and return response json
 * @param url
 * @param data
 */
export function getJSON (url, data) {
  return request(url)
      .setData(data)
      .submit()
      .then(checkStatus)
      .then(parseJSON);
}