Files
AutoJs6/autojs/src/main/assets/modules/__http__.js
2017-12-05 22:26:53 +08:00

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;
}