f50438e76f
* ui: Split up client/http and replace $.ajax This splits the client/http service more in the following ways: 1. Connections are now split out into its own service 2. The transport is now split out into its own service that returns a listener based http transport 3. Various string parsing/stringifying functions are now split out into utils * Remove jQuery from our production build * Move the coverage serving to the server.js file * Self review amends * Add X-Requested-With header * Move some files around, externalize some functions * Move connection tracking to use native Set * Ensure HTTP parsing doesn't encode headers In the future this will change to deal with all HTTP parsing in one place, hence the commented out METHOD_PARSING etc * Start to fix up integration tests to use requestParams
60 lines
1.6 KiB
JavaScript
60 lines
1.6 KiB
JavaScript
import EventTarget from 'consul-ui/utils/dom/event-target/rsvp';
|
|
export default class extends EventTarget {
|
|
constructor(method, url, headers) {
|
|
super();
|
|
this._url = url;
|
|
this._method = method;
|
|
this._headers = headers;
|
|
this._headers = {
|
|
...headers,
|
|
'content-type': 'application/json',
|
|
};
|
|
if (typeof this._headers.body.index !== 'undefined') {
|
|
// this should probably be in a response
|
|
this._headers['content-type'] = 'text/event-stream';
|
|
}
|
|
}
|
|
headers() {
|
|
return this._headers;
|
|
}
|
|
open(xhr) {
|
|
this._xhr = xhr;
|
|
this.dispatchEvent({ type: 'open' });
|
|
}
|
|
respond(data) {
|
|
this.dispatchEvent({ type: 'message', data: data });
|
|
}
|
|
error(error) {
|
|
// if the xhr was aborted (status = 0)
|
|
// and this requests was aborted with a different status
|
|
// switch the status
|
|
if (error.statusCode === 0 && typeof this.statusCode !== 'undefined') {
|
|
error.statusCode = this.statusCode;
|
|
}
|
|
this.dispatchEvent({ type: 'error', error: error });
|
|
}
|
|
close() {
|
|
this.dispatchEvent({ type: 'close' });
|
|
}
|
|
connection() {
|
|
return this._xhr;
|
|
}
|
|
abort(statusCode = 0) {
|
|
if (this.headers()['content-type'] === 'text/event-stream') {
|
|
this.statusCode = statusCode;
|
|
const xhr = this.connection();
|
|
// unsent and opened get aborted
|
|
// headers and loading means wait for it
|
|
// to finish for the moment
|
|
if (xhr.readyState) {
|
|
switch (xhr.readyState) {
|
|
case 0:
|
|
case 1:
|
|
xhr.abort();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|