Files
haxework/haxework/net/BaseURLLoader.hx
2014-04-25 16:47:35 +04:00

113 lines
3.3 KiB
Haxe
Executable File

package haxework.net;
import haxe.Timer;
import flash.utils.ByteArray;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import haxework.net.callback.ICallback;
import flash.net.URLVariables;
import flash.events.ProgressEvent;
import flash.net.URLLoaderDataFormat;
import flash.events.SecurityErrorEvent;
import flash.events.IOErrorEvent;
import flash.net.URLRequest;
import flash.events.Event;
import flash.net.URLLoader;
class BaseURLLoader<T> extends BaseLoader<T> {
private var dataFormat:URLLoaderDataFormat;
private var loader:URLLoader;
public function new(dateFormat:URLLoaderDataFormat = null) {
super();
this.dataFormat = (dateFormat == null ? URLLoaderDataFormat.TEXT : dateFormat);
}
override private function internalRequest(url:String):Void {
cockTimeout();
loader = buildLoader();
var request:URLRequest = new URLRequest(url);
if (method != URLRequestMethod.POST && method != URLRequestMethod.GET) {
request.method = URLRequestMethod.POST;
request.requestHeaders.push(new URLRequestHeader("X-HTTP-Method-Override", method));
} else {
request.method = method;
}
if (data != null && method == URLRequestMethod.POST) {
var variables:URLVariables = new URLVariables();
for (key in Reflect.fields(data)) {
Reflect.setField(variables, key, Reflect.field(data, key));
}
request.data = variables;
}
loader.load(request);
}
override private function internalFromBytes(data:ByteArray):Void {
var c:ICallback<T> = callback;
if (data == null) {
c.callFailAsync("Content not found");
} else {
var data:T = extrudeResultFromBytes(data);
c.callSuccessAsync(data);
}
Timer.delay(dispose, 1);
}
private function extrudeResultFromBytes(bytes:ByteArray):T {
throw "Abstract";
return null;
}
private function buildLoader():URLLoader {
var loader:URLLoader = new URLLoader();
loader.dataFormat = dataFormat;
loader.addEventListener(Event.COMPLETE, onComplete);
loader.addEventListener(IOErrorEvent.IO_ERROR, onError);
loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
loader.addEventListener(ProgressEvent.PROGRESS, onProgress);
return loader;
}
override private function dispose():Void {
super.dispose();
if (loader != null) {
loader.removeEventListener(Event.COMPLETE, onComplete);
loader.removeEventListener(IOErrorEvent.IO_ERROR, onError);
loader.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError);
loader.removeEventListener(ProgressEvent.PROGRESS, onProgress);
try { loader.close(); } catch (error:Dynamic) {}
loader = null;
}
}
override public function cancel():Void {
if (loader != null) {
try {loader.close();} catch (error:Dynamic) {}
}
super.cancel();
}
override private function onError(e:Event):Void {
var c:ICallback<T> = callback;
var error:String = extrudeError(loader.data);
if (error != null) error = url + ": " + error;
dispose();
c.callFail(error != null ? error : e);
}
private function extrudeError(data:Dynamic):String {
return if (data == null) null else {
var s:String = Std.string(data);
var r:EReg = ~/<h1>(.*?)<\/h1>/;
if (r.match(s)) {
r.matched(1);
} else {
s;
}
}
}
}