openfl
Version:
A fast, productive library for 2D cross-platform development.
406 lines (390 loc) • 13.9 kB
JavaScript
// Class: lime._internal.backend.html5.HTML5HTTPRequest
var $global = typeof window != "undefined" ? window : typeof global != "undefined" ? global : typeof self != "undefined" ? self : this
$global.Object.defineProperty(exports, "__esModule", {value: true});
var __map_reserved = {};
// Imports
var $hxClasses = require("./../../../../hxClasses_stub").default;
var $hxEnums = require("./../../../../hxEnums_stub").default;
var $import = require("./../../../../import_stub").default;
function Lambda() {return require("./../../../../Lambda");}
function StringTools() {return require("./../../../../StringTools");}
function Std() {return require("./../../../../Std");}
function lime_app_Promise() {return require("./../../../../lime/app/Promise");}
function HxOverrides() {return require("./../../../../HxOverrides");}
function lime_net_HTTPRequestHeader() {return require("./../../../../lime/net/HTTPRequestHeader");}
function haxe_io_Bytes() {return require("./../../../../haxe/io/Bytes");}
function lime_net__$HTTPRequestErrorResponse() {return require("./../../../../lime/net/_HTTPRequestErrorResponse");}
function haxe_ds_List() {return require("./../../../../haxe/ds/List");}
function lime__$internal_format_Base64() {return require("./../../../../lime/_internal/format/Base64");}
function lime_graphics_ImageBuffer() {return require("./../../../../lime/graphics/ImageBuffer");}
function lime_graphics_Image() {return require("./../../../../lime/graphics/Image");}
function EReg() {return require("./../../../../EReg");}
// Constructor
var HTML5HTTPRequest = function() {
this.validStatus0 = new (EReg().default)("Tizen","gi").match(window.navigator.userAgent);
}
// Meta
HTML5HTTPRequest.__name__ = "lime._internal.backend.html5.HTML5HTTPRequest";
HTML5HTTPRequest.__isInterface__ = false;
HTML5HTTPRequest.prototype = {
cancel: function() {
if(this.request != null) {
this.request.abort();
}
},
init: function(parent) {
this.parent = parent;
},
load: function(uri,progress,readyStateChange) {
this.request = new XMLHttpRequest();
if(this.parent.method == "POST") {
this.request.upload.addEventListener("progress",progress,false);
} else {
this.request.addEventListener("progress",progress,false);
}
this.request.onreadystatechange = readyStateChange;
var query = "";
if(this.parent.data == null) {
var key = this.parent.formData.keys();
while(key.hasNext()) {
var key1 = key.next();
if(query.length > 0) {
query += "&";
}
var value = this.parent.formData.get(key1);
if(key1.indexOf("[]") > -1 && ((value) instanceof Array)) {
var arrayValue = (Lambda().default).map(value,function(v) {
return (StringTools().default).urlEncode(v);
}).join("&" + key1 + "=");
query += (StringTools().default).urlEncode(key1) + "=" + arrayValue;
} else {
query += (StringTools().default).urlEncode(key1) + "=" + (StringTools().default).urlEncode((Std().default).string(value));
}
}
if(this.parent.method == "GET" && query != "") {
if(uri.indexOf("?") > -1) {
uri += "&" + query;
} else {
uri += "?" + query;
}
query = "";
}
}
this.request.open((Std().default).string(this.parent.method),uri,true);
if(this.parent.timeout > 0) {
this.request.timeout = this.parent.timeout;
}
if(this.binary) {
this.request.responseType = "arraybuffer";
}
var contentType = null;
var _g = 0;
var _g1 = this.parent.headers;
while(_g < _g1.length) {
var header = _g1[_g];
++_g;
if(header.name == "Content-Type") {
contentType = header.value;
} else {
this.request.setRequestHeader(header.name,header.value);
}
}
if(this.parent.contentType != null) {
contentType = this.parent.contentType;
}
if(contentType == null) {
if(this.parent.data != null) {
contentType = "application/octet-stream";
} else if(query != "") {
contentType = "application/x-www-form-urlencoded";
}
}
if(contentType != null) {
this.request.setRequestHeader("Content-Type",contentType);
}
if(this.parent.withCredentials) {
this.request.withCredentials = true;
}
if(this.parent.data != null) {
this.request.send(this.parent.data.getData());
} else {
this.request.send(query);
}
},
loadData: function(uri) {
var promise = new (lime_app_Promise().default)();
if(HTML5HTTPRequest.activeRequests < HTML5HTTPRequest.requestLimit) {
HTML5HTTPRequest.activeRequests++;
this.__loadData(uri,promise);
} else {
HTML5HTTPRequest.requestQueue.add({ instance : this, uri : uri, promise : promise, type : "BINARY", options : 0});
}
return promise.future;
},
loadText: function(uri) {
var promise = new (lime_app_Promise().default)();
if(HTML5HTTPRequest.activeRequests < HTML5HTTPRequest.requestLimit) {
HTML5HTTPRequest.activeRequests++;
this.__loadText(uri,promise);
} else {
HTML5HTTPRequest.requestQueue.add({ instance : this, uri : uri, promise : promise, type : "TEXT", options : 0});
}
return promise.future;
},
processResponse: function() {
if(this.parent.enableResponseHeaders) {
this.parent.responseHeaders = [];
var name;
var value;
var _g = 0;
var _g1 = this.request.getAllResponseHeaders().split("\n");
while(_g < _g1.length) {
var line = _g1[_g];
++_g;
name = (StringTools().default).trim((HxOverrides().default).substr(line,0,line.indexOf(":")));
value = (StringTools().default).trim((HxOverrides().default).substr(line,line.indexOf(":") + 1,null));
if(name != "") {
this.parent.responseHeaders.push(new (lime_net_HTTPRequestHeader().default)(name,value));
}
}
}
this.parent.responseStatus = this.request.status;
},
__loadData: function(uri,promise) {
var _gthis = this;
var progress = function(event) {
promise.progress(event.loaded,event.total);
};
var readyStateChange = function(event1) {
if(_gthis.request.readyState != 4) {
return;
}
var bytes = null;
if(_gthis.request.responseType == "") {
if(_gthis.request.responseText != null) {
bytes = (haxe_io_Bytes().default).ofString(_gthis.request.responseText);
}
} else if(_gthis.request.response != null) {
bytes = (haxe_io_Bytes().default).ofData(_gthis.request.response);
}
if(_gthis.request.status != null && (_gthis.request.status >= 200 && _gthis.request.status < 400 || _gthis.validStatus0 && _gthis.request.status == 0)) {
_gthis.processResponse();
promise.complete(bytes);
} else {
_gthis.processResponse();
promise.error(new (lime_net__$HTTPRequestErrorResponse().default)(_gthis.request.status,bytes));
}
_gthis.request = null;
HTML5HTTPRequest.activeRequests--;
HTML5HTTPRequest.processQueue();
};
this.binary = true;
this.load(uri,progress,readyStateChange);
},
__loadText: function(uri,promise) {
var _gthis = this;
var progress = function(event) {
promise.progress(event.loaded,event.total);
};
var readyStateChange = function(event1) {
if(_gthis.request.readyState != 4) {
return;
}
if(_gthis.request.status != null && (_gthis.request.status >= 200 && _gthis.request.status < 400 || _gthis.validStatus0 && _gthis.request.status == 0)) {
_gthis.processResponse();
promise.complete(_gthis.request.responseText);
} else {
_gthis.processResponse();
promise.error(new (lime_net__$HTTPRequestErrorResponse().default)(_gthis.request.status,_gthis.request.responseText));
}
_gthis.request = null;
HTML5HTTPRequest.activeRequests--;
HTML5HTTPRequest.processQueue();
};
this.binary = false;
this.load(uri,progress,readyStateChange);
}
};
HTML5HTTPRequest.prototype.__class__ = HTML5HTTPRequest.prototype.constructor = $hxClasses["lime._internal.backend.html5.HTML5HTTPRequest"] = HTML5HTTPRequest;
// Init
// Statics
HTML5HTTPRequest.loadImage = function(uri) {
var promise = new (lime_app_Promise().default)();
if(HTML5HTTPRequest.activeRequests < HTML5HTTPRequest.requestLimit) {
HTML5HTTPRequest.activeRequests++;
HTML5HTTPRequest.__loadImage(uri,promise,0);
} else {
HTML5HTTPRequest.requestQueue.add({ instance : null, uri : uri, promise : promise, type : "IMAGE", options : 0});
}
return promise.future;
}
HTML5HTTPRequest.loadImageFromBytes = function(bytes,type) {
var uri = HTML5HTTPRequest.__createBlobURIFromBytes(bytes,type);
if(uri != null) {
var promise = new (lime_app_Promise().default)();
if(HTML5HTTPRequest.activeRequests < HTML5HTTPRequest.requestLimit) {
HTML5HTTPRequest.activeRequests++;
HTML5HTTPRequest.__loadImage(uri,promise,1);
} else {
HTML5HTTPRequest.requestQueue.add({ instance : null, uri : uri, promise : promise, type : "IMAGE", options : 1});
}
return promise.future;
} else {
return HTML5HTTPRequest.loadImage("data:" + type + ";base64," + (lime__$internal_format_Base64().default).encode(bytes));
}
}
HTML5HTTPRequest.processQueue = function() {
if(HTML5HTTPRequest.activeRequests < HTML5HTTPRequest.requestLimit && HTML5HTTPRequest.requestQueue.length > 0) {
HTML5HTTPRequest.activeRequests++;
var queueItem = HTML5HTTPRequest.requestQueue.pop();
switch(queueItem.type) {
case "BINARY":
queueItem.instance.__loadData(queueItem.uri,queueItem.promise);
break;
case "IMAGE":
HTML5HTTPRequest.__loadImage(queueItem.uri,queueItem.promise,queueItem.options);
break;
case "TEXT":
queueItem.instance.__loadText(queueItem.uri,queueItem.promise);
break;
default:
HTML5HTTPRequest.activeRequests--;
}
}
}
HTML5HTTPRequest.__createBlobURIFromBytes = function(bytes,type) {
return URL.createObjectURL(new Blob([bytes.getData()],{ type : type}));
}
HTML5HTTPRequest.__fixHostname = function(hostname) {
if(hostname == null) {
return "";
} else {
return hostname;
}
}
HTML5HTTPRequest.__fixPort = function(port,protocol) {
if(port == null || port == "") {
switch(protocol) {
case "ftp:":
return "21";
case "gopher:":
return "70";
case "http:":
return "80";
case "https:":
return "443";
case "ws:":
return "80";
case "wss:":
return "443";
default:
return "";
}
}
return port;
}
HTML5HTTPRequest.__fixProtocol = function(protocol) {
if(protocol == null || protocol == "") {
return "http:";
} else {
return protocol;
}
}
HTML5HTTPRequest.__isInMemoryURI = function(uri) {
if(!(StringTools().default).startsWith(uri,"data:")) {
return (StringTools().default).startsWith(uri,"blob:");
} else {
return true;
}
}
HTML5HTTPRequest.__isSameOrigin = function(path) {
if(path == null || path == "") {
return true;
}
if(HTML5HTTPRequest.__isInMemoryURI(path)) {
return true;
}
if(HTML5HTTPRequest.originElement == null) {
HTML5HTTPRequest.originElement = window.document.createElement("a");
HTML5HTTPRequest.originHostname = HTML5HTTPRequest.__fixHostname(window.location.hostname);
HTML5HTTPRequest.originProtocol = HTML5HTTPRequest.__fixProtocol(window.location.protocol);
HTML5HTTPRequest.originPort = HTML5HTTPRequest.__fixPort(window.location.port,HTML5HTTPRequest.originProtocol);
}
var a = HTML5HTTPRequest.originElement;
a.href = path;
if(a.hostname == "") {
a.href = a.href;
}
var hostname = HTML5HTTPRequest.__fixHostname(a.hostname);
var protocol = HTML5HTTPRequest.__fixProtocol(a.protocol);
var port = HTML5HTTPRequest.__fixPort(a.port,protocol);
var sameHost = hostname == "" || hostname == HTML5HTTPRequest.originHostname;
var samePort = port == "" || port == HTML5HTTPRequest.originPort;
if(protocol != "file:" && sameHost) {
return samePort;
} else {
return false;
}
}
HTML5HTTPRequest.__loadImage = function(uri,promise,options) {
var image = new window.Image ();
if(!HTML5HTTPRequest.__isSameOrigin(uri)) {
image.crossOrigin = "Anonymous";
}
if(HTML5HTTPRequest.supportsImageProgress == null) {
HTML5HTTPRequest.supportsImageProgress = 'onprogress' in image;
}
if(HTML5HTTPRequest.supportsImageProgress || HTML5HTTPRequest.__isInMemoryURI(uri)) {
image.addEventListener("load",function(event) {
HTML5HTTPRequest.__revokeBlobURI(uri,options);
var buffer = new (lime_graphics_ImageBuffer().default)(null,image.width,image.height);
buffer.__srcImage = image;
HTML5HTTPRequest.activeRequests--;
HTML5HTTPRequest.processQueue();
promise.complete(new (lime_graphics_Image().default)(buffer));
},false);
image.addEventListener("progress",function(event1) {
promise.progress(event1.loaded,event1.total);
},false);
image.addEventListener("error",function(event2) {
HTML5HTTPRequest.__revokeBlobURI(uri,options);
HTML5HTTPRequest.activeRequests--;
HTML5HTTPRequest.processQueue();
promise.error(new (lime_net__$HTTPRequestErrorResponse().default)(event2.detail,null));
},false);
image.src = uri;
} else {
var request = new XMLHttpRequest();
request.onload = function(_) {
HTML5HTTPRequest.activeRequests--;
HTML5HTTPRequest.processQueue();
var img = new (lime_graphics_Image().default)();
img.__fromBytes((haxe_io_Bytes().default).ofData(request.response),function(img1) {
promise.complete(img1);
});
};
request.onerror = function(event3) {
promise.error(new (lime_net__$HTTPRequestErrorResponse().default)(event3.message,null));
};
request.onprogress = function(event4) {
if(event4.lengthComputable) {
promise.progress(event4.loaded,event4.total);
}
};
request.open("GET",uri,true);
request.responseType = "arraybuffer";
request.overrideMimeType("text/plain; charset=x-user-defined");
request.send(null);
}
}
HTML5HTTPRequest.__revokeBlobURI = function(uri,options) {
if((options & 1) != 0) {
URL.revokeObjectURL(uri);
}
}
HTML5HTTPRequest.OPTION_REVOKE_URL = 1
HTML5HTTPRequest.activeRequests = 0
HTML5HTTPRequest.requestLimit = 17
HTML5HTTPRequest.requestQueue = new (haxe_ds_List().default)()
// Export
exports.default = HTML5HTTPRequest;