sku-pg
Version:
Skulpt is a Javascript implementation of Python 2.x. Python that runs in your browser!
150 lines (120 loc) • 4.9 kB
JavaScript
var $builtinmodule = function (name) {
var request = {};
//~ Classes .................................................................
// Response class
//
// Response objects are returned by the request, get, post, etc.
// methods, allowing the user to access the response text, status
// code, and other information.
// ------------------------------------------------------------
var response = function ($gbl, $loc) {
// ------------------------------------------------------------
$loc.__init__ = new Sk.builtin.func(function (self, xhr) {
self.data$ = xhr.responseText;
self.lineList = self.data$.split("\n");
self.lineList = self.lineList.slice(0, -1);
for (var i = 0; i < self.lineList.length; i++) {
self.lineList[i] = self.lineList[i] + '\n';
}
self.currentLine = 0;
self.pos$ = 0;
});
// ------------------------------------------------------------
$loc.__str__ = new Sk.builtin.func(function (self) {
return Sk.ffi.remapToPy('<Response>');
});
// ------------------------------------------------------------
$loc.__iter__ = new Sk.builtin.func(function (self) {
var allLines = self.lineList;
return Sk.builtin.makeGenerator(function () {
if (this.$index >= this.$lines.length) {
return undefined;
}
return new Sk.builtin.str(this.$lines[this.$index++]);
}, {
$obj : self,
$index: 0,
$lines: allLines
});
});
// ------------------------------------------------------------
$loc.read = new Sk.builtin.func(function (self, size) {
if (self.closed) {
throw new Sk.builtin.ValueError("I/O operation on closed file");
}
var len = self.data$.length;
if (size === undefined) {
size = len;
}
var ret = new Sk.builtin.str(self.data$.substr(self.pos$, size));
self.pos$ += size;
if (self.pos$ >= len) {
self.pos$ = len;
}
return ret;
});
// ------------------------------------------------------------
$loc.readline = new Sk.builtin.func(function (self, size) {
var line = "";
if (self.currentLine < self.lineList.length) {
line = self.lineList[self.currentLine];
self.currentLine++;
}
return new Sk.builtin.str(line);
});
// ------------------------------------------------------------
$loc.readlines = new Sk.builtin.func(function (self, sizehint) {
var arr = [];
for (var i = self.currentLine; i < self.lineList.length; i++) {
arr.push(new Sk.builtin.str(self.lineList[i]));
}
return new Sk.builtin.list(arr);
});
};
request.Response =
Sk.misceval.buildClass(request, response, 'Response', []);
//~ Module functions ........................................................
// ------------------------------------------------------------
/**
* Constructs and sends a Request. Returns Response object.
*
* http://docs.python-requests.org/en/latest/api/#requests.request
*
* For now, this implementation doesn't actually construct a Request
* object; it just makes the request through jQuery.ajax and then
* constructs a Response.
*/
request.urlopen = new Sk.builtin.func(function (url, data, timeout) {
var prom = new Promise(function(resolve, reject) {
var xmlhttp = new XMLHttpRequest();
xmlhttp.addEventListener("loadend", function (e) {
resolve(Sk.misceval.callsim(request.Response, xmlhttp));
});
if (!data) {
xmlhttp.open("GET", url.v);
xmlhttp.send(null);
} else {
xmlhttp.open("POST", url.v);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("Content-length", data.v.length);
xmlhttp.send(data.v);
}
});
var susp = new Sk.misceval.Suspension();
susp.resume = function() {
return resolution;
};
susp.data = {
type: "Sk.promise",
promise: prom.then(function(value) {
resolution = value;
return value;
}, function(err) {
resolution = "";
return err;
})
};
return susp;
});
return request;
};