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.Event;
import flash.events.HTTPStatusEvent;
import flash.events.IOErrorEvent; import flash.events.IOErrorEvent;
import flash.events.ProgressEvent; import flash.events.ProgressEvent;
import flash.events.SecurityErrorEvent;
import flash.net.URLLoader; import flash.net.URLLoader;
import flash.net.URLLoaderDataFormat; import flash.net.URLLoaderDataFormat;
import flash.net.URLRequest; import flash.net.URLRequest;
@@ -19,7 +21,6 @@ import lime.net.HTTPRequest;
class FlashHTTPRequest { class FlashHTTPRequest {
private var binary:Bool;
private var parent:IHTTPRequest; private var parent:IHTTPRequest;
private var urlLoader:URLLoader; private var urlLoader:URLLoader;
private var urlRequest:URLRequest; private var urlRequest:URLRequest;
@@ -43,40 +44,42 @@ class FlashHTTPRequest {
} }
public function init (parent:IHTTPRequest):Void { private function construct (binary:Bool):Void {
this.parent = parent;
}
private function createURLLoader ():Void {
urlLoader = new URLLoader (); urlLoader = new URLLoader ();
urlRequest = new URLRequest ();
var query = ""; var query = "";
var uri = parent.uri; var uri = parent.uri;
for (key in parent.formData.keys ()) { if (parent.data != null) {
if (query.length > 0) query += "&"; urlRequest.data = parent.data.getData ();
query += StringTools.urlEncode (key) + "=" + StringTools.urlEncode (Std.string (parent.formData.get (key)));
} } else {
if (parent.method == GET) {
if (uri.indexOf ("?") > -1) { for (key in parent.formData.keys ()) {
uri += "&" + query; if (query.length > 0) query += "&";
query += StringTools.urlEncode (key) + "=" + StringTools.urlEncode (Std.string (parent.formData.get (key)));
} else {
uri += "?" + query;
} }
query = ""; if (query != "" && parent.method == GET) {
if (uri.indexOf ("?") > -1) {
uri += "&" + query;
} else {
uri += "?" + query;
}
query = "";
}
} }
@@ -86,8 +89,12 @@ class FlashHTTPRequest {
} }
urlRequest = new URLRequest (uri); urlRequest.url = uri;
urlRequest.contentType = parent.contentType;
//urlRequest.userAgent = parent.userAgent; //urlRequest.userAgent = parent.userAgent;
//urlRequest.followRedirects = parent.followRedirects;
urlRequest.method = switch (parent.method) { urlRequest.method = switch (parent.method) {
case POST: URLRequestMethod.POST; 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> { public function loadData (uri:String):Future<Bytes> {
var promise = new Promise<Bytes> (); var promise = new Promise<Bytes> ();
construct (true);
binary = true;
createURLLoader ();
urlLoader.addEventListener (ProgressEvent.PROGRESS, function (event) { 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) { urlLoader.addEventListener (IOErrorEvent.IO_ERROR, function (event) {
promise.error (event.errorID); promise.error (event.errorID);
}); });
urlLoader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, function (event) {
promise.error (403);
});
urlLoader.addEventListener (Event.COMPLETE, function (event) { urlLoader.addEventListener (Event.COMPLETE, function (event) {
promise.complete (Bytes.ofData (cast (urlLoader.data, ByteArray))); promise.complete (Bytes.ofData (cast (urlLoader.data, ByteArray)));
@@ -146,9 +176,7 @@ class FlashHTTPRequest {
public function loadText (uri:String):Future<String> { public function loadText (uri:String):Future<String> {
var promise = new Promise<String> (); var promise = new Promise<String> ();
construct (false);
binary = false;
createURLLoader ();
urlLoader.addEventListener (ProgressEvent.PROGRESS, function (event) { 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) { urlLoader.addEventListener (IOErrorEvent.IO_ERROR, function (event) {
promise.error (event.errorID); promise.error (event.errorID);
}); });
urlLoader.addEventListener (SecurityErrorEvent.SECURITY_ERROR, function (event) {
promise.error (403);
});
urlLoader.addEventListener (Event.COMPLETE, function (event) { urlLoader.addEventListener (Event.COMPLETE, function (event) {
promise.complete (cast (urlLoader.data, String)); promise.complete (cast (urlLoader.data, String));

View File

@@ -8,6 +8,7 @@ import haxe.io.Bytes;
import lime.app.Future; import lime.app.Future;
import lime.app.Promise; import lime.app.Promise;
import lime.net.HTTPRequest; import lime.net.HTTPRequest;
import lime.net.HTTPRequestHeader;
class HTML5HTTPRequest { class HTML5HTTPRequest {
@@ -57,26 +58,30 @@ class HTML5HTTPRequest {
var query = ""; var query = "";
for (key in parent.formData.keys ()) { if (parent.data == null) {
if (query.length > 0) query += "&"; for (key in parent.formData.keys ()) {
query += StringTools.urlEncode (key) + "=" + StringTools.urlEncode (Std.string (parent.formData.get (key)));
}
if (parent.method == GET) {
if (uri.indexOf ("?") > -1) {
uri += "&" + query; if (query.length > 0) query += "&";
query += StringTools.urlEncode (key) + "=" + StringTools.urlEncode (Std.string (parent.formData.get (key)));
} else {
uri += "?" + query;
} }
query = ""; if (parent.method == GET) {
if (uri.indexOf ("?") > -1) {
uri += "&" + query;
} else {
uri += "?" + query;
}
query = "";
}
} }
@@ -88,13 +93,30 @@ class HTML5HTTPRequest {
} }
var hasContentType = false;
for (header in parent.headers) { for (header in parent.headers) {
if (header.name == "Content-Type") hasContentType = true;
request.setRequestHeader (header.name, header.value); request.setRequestHeader (header.name, header.value);
} }
request.send (query); if (!hasContentType) {
request.setRequestHeader ("Content-Type", parent.contentType);
}
if (parent.data != null) {
request.send (parent.data.getData ());
} else {
request.send (query);
}
} }
@@ -125,10 +147,12 @@ class HTML5HTTPRequest {
bytes = Bytes.ofData (request.response); bytes = Bytes.ofData (request.response);
processResponse ();
promise.complete (bytes); promise.complete (bytes);
} else { } else {
processResponse ();
promise.error (request.status); promise.error (request.status);
} }
@@ -161,10 +185,12 @@ class HTML5HTTPRequest {
if (request.status != null && request.status >= 200 && request.status <= 400) { if (request.status != null && request.status >= 200 && request.status <= 400) {
processResponse ();
promise.complete (request.responseText); promise.complete (request.responseText);
} else { } else {
processResponse ();
promise.error (request.status); 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; this.uri = uri;
contentType = "application/x-www-form-urlencoded";
followRedirects = true;
enableResponseHeaders = true;
formData = new Map (); formData = new Map ();
headers = []; headers = [];
method = GET; method = GET;