178 lines
5.5 KiB
JavaScript
178 lines
5.5 KiB
JavaScript
module.exports = function(runtime, scope){
|
|
importPackage(Packages["okhttp3"]);
|
|
var http = {};
|
|
http.get = function(url, options, callback){
|
|
options = options || {};
|
|
options.method = "GET";
|
|
return http.request(url, options, callback);
|
|
}
|
|
|
|
http.client = function(){
|
|
if(!http._client_){
|
|
http._client_ = new OkHttpClient();
|
|
}
|
|
return http._client_;
|
|
}
|
|
|
|
http.post = function(url, data, options, callback){
|
|
options = options || {};
|
|
options.method = "POST";
|
|
options.contentType = options.contentType || "application/x-www-form-urlencoded";
|
|
if(data){
|
|
fillPostData(options, data);
|
|
}
|
|
return http.request(url, options, callback);
|
|
}
|
|
|
|
http.postJson = function(url, data, options, callback){
|
|
options = options || {};
|
|
options.contentType = "application/json";
|
|
return http.post(url, data, options, callback);
|
|
}
|
|
|
|
http.postMultipart = function(url, files, options, callback){
|
|
options = options || {};
|
|
options.method = "POST";
|
|
options.contentType = "multipart/form-data";
|
|
options.files = files;
|
|
return http.request(url, options, callback);
|
|
}
|
|
|
|
http.request = function(url, options, callback){
|
|
var call = http.client().newCall(http.buildRequest(url, options));
|
|
if(!callback){
|
|
return wrapResponse(call.execute());
|
|
}
|
|
call.enqueue(new Callback({
|
|
onResponse: function(call, res){
|
|
callback(wrapResponse(res));
|
|
},
|
|
onFailure: function(call, ex){
|
|
callback(null, ex);
|
|
}
|
|
}));
|
|
}
|
|
|
|
http.buildRequest = function(url, options){
|
|
var r = new Request.Builder();
|
|
if(!url.startsWith("http://") && !url.startsWith("https://")){
|
|
url = "http://" + url;
|
|
}
|
|
r.url(url);
|
|
if(options.headers){
|
|
setHeaders(r, options.headers);
|
|
}
|
|
if(options.body){
|
|
r.method(options.method, parseBody(options, options.body));
|
|
}else if(options.files){
|
|
r.method(options.method, parseMultipart(options.files));
|
|
}else {
|
|
r.method(options.method, null);
|
|
}
|
|
return r.build();
|
|
}
|
|
|
|
function parseMultipart(files){
|
|
var builder = new MultipartBody.Builder()
|
|
.setType(MultipartBody.FORM);
|
|
for(var key in files){
|
|
if(!files.hasOwnProperty(key)){
|
|
continue;
|
|
}
|
|
var value = files[key];
|
|
if(typeof(value) == 'string'){
|
|
builder.addFormDataPart(key, value);
|
|
continue;
|
|
}
|
|
var path, mimeType, fileName;
|
|
if(typeof(value.getPath) == 'function'){
|
|
path = value.getPath();
|
|
}else if(value.length == 2){
|
|
fileName = value[0];
|
|
path = value[1];
|
|
}else if(value.length >= 3){
|
|
fileName = value[0];
|
|
mimeType = value[1]
|
|
path = value[2];
|
|
}
|
|
var file = new com.stardust.pio.PFile(path);
|
|
fileName = fileName || file.getName();
|
|
mimeType = mimeType || parseMimeType(file.getExtension());
|
|
builder.addFormDataPart(key, fileName, RequestBody.create(MediaType.parse(mimeType), file));
|
|
}
|
|
return builder.build();
|
|
}
|
|
|
|
function parseMimeType(ext){
|
|
if(ext.length == 0){
|
|
return "application/octet-stream";
|
|
}
|
|
return android.webkit.MimeTypeMap.getSingleton().getMimeTypeFromExtension(ext)
|
|
|| "application/octet-stream";
|
|
}
|
|
|
|
function fillPostData(options, data){
|
|
if(options.contentType == "application/x-www-form-urlencoded"){
|
|
var b = new FormBody.Builder();
|
|
for(var key in data){
|
|
if(data.hasOwnProperty(key)){
|
|
b.add(key, data[key]);
|
|
}
|
|
}
|
|
options.body = b.build();
|
|
}else if(options.contentType == "application/json"){
|
|
options.body = JSON.stringify(data);
|
|
}else{
|
|
options.body = data;
|
|
}
|
|
}
|
|
|
|
function setHeaders(r, headers){
|
|
for(var key in headers){
|
|
if(headers.hasOwnProperty(key)){
|
|
r.header(key, headers[key]);
|
|
}
|
|
}
|
|
}
|
|
|
|
function parseBody(options, body){
|
|
if(typeof(body) == "string"){
|
|
body = RequestBody.create(MediaType.parse(options.contentType), body);
|
|
}else if(body instanceof RequestBody){
|
|
return body;
|
|
}else{
|
|
body = new RequestBody({
|
|
contentType: function(){
|
|
return MediaType.parse(options.contentType);
|
|
},
|
|
writeTo: body
|
|
});
|
|
}
|
|
return body;
|
|
}
|
|
|
|
function wrapResponse(res){
|
|
var r = {};
|
|
r.statusCode = res.code();
|
|
r.statusMessage = res.message();
|
|
var headers = res.headers();
|
|
r.headers = {};
|
|
for(var i = 0; i < headers.size(); i++){
|
|
r.headers[headers.name(i)] = headers.value(i);
|
|
}
|
|
r.body = {};
|
|
var body = res.body();
|
|
r.body.string = body.string.bind(body);
|
|
r.body.bytes = body.bytes.bind(body);
|
|
r.body.json = function(){
|
|
return JSON.parse(r.body.string());
|
|
}
|
|
r.body.contentType = body.contentType();
|
|
r.request = res.request();
|
|
r.url = r.request.url();
|
|
r.method = r.request.method();
|
|
return r;
|
|
}
|
|
|
|
return http;
|
|
} |