-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxhr.js
More file actions
82 lines (70 loc) · 2.8 KB
/
Copy pathxhr.js
File metadata and controls
82 lines (70 loc) · 2.8 KB
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
d3.xhr = function(url, mimeType, callback) {
var xhr = {},
dispatch = d3.dispatch("progress", "load", "error"),
headers = {},
response = d3_identity,
request = new (window.XDomainRequest && /^(http(s)?:)?\/\//.test(url) ? XDomainRequest : XMLHttpRequest);
"onload" in request
? request.onload = request.onerror = respond
: request.onreadystatechange = function() { request.readyState > 3 && respond(); };
function respond() {
var s = request.status;
!s && request.responseText || s >= 200 && s < 300 || s === 304
? dispatch.load.call(xhr, response.call(xhr, request))
: dispatch.error.call(xhr, request);
}
request.onprogress = function(event) {
var o = d3.event;
d3.event = event;
try { dispatch.progress.call(xhr, request); }
finally { d3.event = o; }
};
xhr.header = function(name, value) {
name = (name + "").toLowerCase();
if (arguments.length < 2) return headers[name];
if (value == null) delete headers[name];
else headers[name] = value + "";
return xhr;
};
// If mimeType is non-null and no Accept header is set, a default is used.
xhr.mimeType = function(value) {
if (!arguments.length) return mimeType;
mimeType = value == null ? null : value + "";
return xhr;
};
// Specify how to convert the response content to a specific type;
// changes the callback value on "load" events.
xhr.response = function(value) {
response = value;
return xhr;
};
// Convenience methods.
["get", "post"].forEach(function(method) {
xhr[method] = function() {
return xhr.send.apply(xhr, [method].concat(d3_array(arguments)));
};
});
// If callback is non-null, it will be used for error and load events.
xhr.send = function(method, data, callback) {
if (arguments.length === 2 && typeof data === "function") callback = data, data = null;
request.open(method, url, true);
if (mimeType != null && !("accept" in headers)) headers["accept"] = mimeType + ",*/*";
if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);
if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);
if (callback != null) xhr.on("error", callback).on("load", function(request) { callback(null, request); });
request.send(data == null ? null : data);
return xhr;
};
xhr.abort = function() {
request.abort();
return xhr;
};
d3.rebind(xhr, dispatch, "on");
if (arguments.length === 2 && typeof mimeType === "function") callback = mimeType, mimeType = null;
return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));
};
function d3_xhr_fixCallback(callback) {
return callback.length === 1
? function(error, request) { callback(error == null ? request : null); }
: callback;
}