Additional work on Flash and HTML5 HTTPRequest

This commit is contained in:
Joshua Granick
2016-11-08 13:48:50 -08:00
parent ab7c9f5589
commit 4cfb0d479c
3 changed files with 147 additions and 45 deletions

View File

@@ -2,8 +2,10 @@ package lime._backend.flash;
import flash.events.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent;
import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest;
@@ -19,7 +21,6 @@ import lime.net.HTTPRequest;
class FlashHTTPRequest {
private var binary:Bool;
private var parent:IHTTPRequest;
private var urlLoader:URLLoader;
private var urlRequest:URLRequest;
@@ -43,20 +44,20 @@ class FlashHTTPRequest {
}
public function init (parent:IHTTPRequest):Void {
this.parent = parent;
}
private function createURLLoader ():Void {
private function construct (binary:Bool):Void {
urlLoader = new URLLoader ();
urlRequest = new URLRequest ();
var query = "";
var uri = parent.uri;
if (parent.data != null) {
urlRequest.data = parent.data.getData ();
} else {
for (key in parent.formData.keys ()) {
if (query.length > 0) query += "&";
@@ -64,7 +65,7 @@ class FlashHTTPRequest {
}
if (parent.method == GET) {
if (query != "" && parent.method == GET) {
if (uri.indexOf ("?") > -1) {
@@ -80,14 +81,20 @@ class FlashHTTPRequest {
}
}
if (binary) {
urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
}
urlRequest = new URLRequest (uri);
urlRequest.url = uri;
urlRequest.contentType = parent.contentType;
//urlRequest.userAgent = parent.userAgent;
//urlRequest.followRedirects = parent.followRedirects;
urlRequest.method = switch (parent.method) {
case POST: URLRequestMethod.POST;
@@ -104,12 +111,17 @@ class FlashHTTPRequest {
}
public function init (parent:IHTTPRequest):Void {
this.parent = parent;
}
public function loadData (uri:String):Future<Bytes> {
var promise = new Promise<Bytes> ();
binary = true;
createURLLoader ();
construct (true);
urlLoader.addEventListener (ProgressEvent.PROGRESS, function (event) {
@@ -125,12 +137,30 @@ class FlashHTTPRequest {
});
urlLoader.addEventListener (HTTPStatusEvent.HTTP_STATUS, function (event) {
parent.responseStatus = event.status;
if (parent.enableResponseHeaders) {
parent.responseHeaders = event.responseHeaders;
}
});
urlLoader.addEventListener (IOErrorEvent.IO_ERROR, function (event) {
promise.error (event.errorID);
});
urlLoader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, function (event) {
promise.error (403);
});
urlLoader.addEventListener (Event.COMPLETE, function (event) {
promise.complete (Bytes.ofData (cast (urlLoader.data, ByteArray)));
@@ -146,9 +176,7 @@ class FlashHTTPRequest {
public function loadText (uri:String):Future<String> {
var promise = new Promise<String> ();
binary = false;
createURLLoader ();
construct (false);
urlLoader.addEventListener (ProgressEvent.PROGRESS, function (event) {
@@ -164,12 +192,30 @@ class FlashHTTPRequest {
});
urlLoader.addEventListener (HTTPStatusEvent.HTTP_STATUS, function (event) {
parent.responseStatus = event.status;
if (parent.enableResponseHeaders) {
parent.responseHeaders = event.responseHeaders;
}
});
urlLoader.addEventListener (IOErrorEvent.IO_ERROR, function (event) {
promise.error (event.errorID);
});
urlLoader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, function (event) {
promise.error (403);
});
urlLoader.addEventListener (Event.COMPLETE, function (event) {
promise.complete (cast (urlLoader.data, String));

View File

@@ -8,6 +8,7 @@ import haxe.io.Bytes;
import lime.app.Future;
import lime.app.Promise;
import lime.net.HTTPRequest;
import lime.net.HTTPRequestHeader;
class HTML5HTTPRequest {
@@ -57,6 +58,8 @@ class HTML5HTTPRequest {
var query = "";
if (parent.data == null) {
for (key in parent.formData.keys ()) {
if (query.length > 0) query += "&";
@@ -80,6 +83,8 @@ class HTML5HTTPRequest {
}
}
request.open (Std.string (parent.method), uri, true);
if (binary) {
@@ -88,16 +93,33 @@ class HTML5HTTPRequest {
}
var hasContentType = false;
for (header in parent.headers) {
if (header.name == "Content-Type") hasContentType = true;
request.setRequestHeader (header.name, header.value);
}
if (!hasContentType) {
request.setRequestHeader ("Content-Type", parent.contentType);
}
if (parent.data != null) {
request.send (parent.data.getData ());
} else {
request.send (query);
}
}
public function loadData (uri:String):Future<Bytes> {
@@ -125,10 +147,12 @@ class HTML5HTTPRequest {
bytes = Bytes.ofData (request.response);
processResponse ();
promise.complete (bytes);
} else {
processResponse ();
promise.error (request.status);
}
@@ -161,10 +185,12 @@ class HTML5HTTPRequest {
if (request.status != null && request.status >= 200 && request.status <= 400) {
processResponse ();
promise.complete (request.responseText);
} else {
processResponse ();
promise.error (request.status);
}
@@ -181,4 +207,31 @@ class HTML5HTTPRequest {
}
private function processResponse ():Void {
if (parent.enableResponseHeaders) {
parent.responseHeaders = [];
var name, value;
for (line in request.getAllResponseHeaders ().split ("\n")) {
name = StringTools.trim (line.substr (0, line.indexOf (":")));
value = StringTools.trim (line.substr (line.indexOf (":") + 1));
if (name != "") {
parent.responseHeaders.push (new HTTPRequestHeader (name, value));
}
}
}
parent.responseStatus = request.status;
}
}

View File

@@ -36,6 +36,9 @@ class HTTPRequest<T> implements IHTTPRequest {
this.uri = uri;
contentType = "application/x-www-form-urlencoded";
followRedirects = true;
enableResponseHeaders = true;
formData = new Map ();
headers = [];
method = GET;