ember-introjs
Version:
An Ember Component for intro.js
85 lines (75 loc) • 2.26 kB
JavaScript
/**
* HTTP Client using the JSGI standard objects
*/
var LazyArray = require("../../lazy-array").LazyArray;
// configurable proxy server setting, defaults to http_proxy env var
exports.proxyServer = require("../../process").env.http_proxy;
exports.request = function(request){
var url = new java.net.URL(request.url),
connection = url.openConnection(),
method = request.method || "GET",
is = null,
promised = true;
if (request.jsgi && "async" in request.jsgi) promised = request.jsgi.async;
for (var header in this.headers) {
var value = this.headers[header];
connection.addRequestProperty(String(header), String(value));
}
connection.setFollowRedirects(false)
connection.setDoInput(true);
connection.setRequestMethod(method);
if (request.body && typeof request.body.forEach === "function") {
connection.setDoOutput(true);
var writer = new java.io.OutputStreamWriter(connection.getOutputStream());
request.body.forEach(function(chunk) {
writer.write(chunk);
writer.flush();
});
}
if (typeof writer !== "undefined") writer.close();
try {
connection.connect();
is = connection.getInputStream();
}
catch (e) {
is = connection.getErrorStream();
}
var status = Number(connection.getResponseCode()),
headers = {};
for (var i = 0;; i++) {
var key = connection.getHeaderFieldKey(i),
value = connection.getHeaderField(i);
if (!key && !value)
break;
// returns the HTTP status code with no key, ignore it.
if (key) {
key = String(key).toLowerCase();
value = String(value);
if (headers[key]) {
if (!Array.isArray(headers[key])) headers[key] = [headers[key]];
headers[key].push(value);
}
else {
headers[key] = value;
}
}
}
var reader = new java.io.BufferedReader(new java.io.InputStreamReader(is)),
builder = new java.lang.StringBuilder(),
line;
// FIXME create deferred and LazyArray
while((line = reader.readLine()) != null){
builder.append(line + '\n');
}
if (typeof writer !== "undefined") writer.close();
reader.close();
return {
status: status,
headers: headers,
body: LazyArray({
some: function(write) {
write(builder.toString());
}
})
}
};