From 97285c488128789766c7f814b15658d8d4b46a46 Mon Sep 17 00:00:00 2001 From: Joshua Granick Date: Wed, 9 Nov 2016 13:34:20 -0800 Subject: [PATCH] Make HTTPRequest rely less on macros --- lime/_backend/flash/FlashHTTPRequest.hx | 4 +- lime/_backend/html5/HTML5HTTPRequest.hx | 4 +- lime/_backend/native/NativeHTTPRequest.hx | 4 +- lime/graphics/Image.hx | 2 +- lime/net/HTTPRequest.hx | 335 +++++++++++----------- 5 files changed, 175 insertions(+), 174 deletions(-) diff --git a/lime/_backend/flash/FlashHTTPRequest.hx b/lime/_backend/flash/FlashHTTPRequest.hx index 0faee93b2..e90324e9d 100644 --- a/lime/_backend/flash/FlashHTTPRequest.hx +++ b/lime/_backend/flash/FlashHTTPRequest.hx @@ -21,7 +21,7 @@ import lime.net.HTTPRequest; class FlashHTTPRequest { - private var parent:IHTTPRequest; + private var parent:_IHTTPRequest; private var urlLoader:URLLoader; private var urlRequest:URLRequest; @@ -111,7 +111,7 @@ class FlashHTTPRequest { } - public function init (parent:IHTTPRequest):Void { + public function init (parent:_IHTTPRequest):Void { this.parent = parent; diff --git a/lime/_backend/html5/HTML5HTTPRequest.hx b/lime/_backend/html5/HTML5HTTPRequest.hx index 2dead6233..4d0a027f7 100644 --- a/lime/_backend/html5/HTML5HTTPRequest.hx +++ b/lime/_backend/html5/HTML5HTTPRequest.hx @@ -15,7 +15,7 @@ class HTML5HTTPRequest { private var binary:Bool; - private var parent:IHTTPRequest; + private var parent:_IHTTPRequest; private var request:XMLHttpRequest; @@ -37,7 +37,7 @@ class HTML5HTTPRequest { } - public function init (parent:IHTTPRequest):Void { + public function init (parent:_IHTTPRequest):Void { this.parent = parent; diff --git a/lime/_backend/native/NativeHTTPRequest.hx b/lime/_backend/native/NativeHTTPRequest.hx index d07037720..13245cab0 100644 --- a/lime/_backend/native/NativeHTTPRequest.hx +++ b/lime/_backend/native/NativeHTTPRequest.hx @@ -20,7 +20,7 @@ class NativeHTTPRequest { private var bytesLoaded:Int; private var bytesTotal:Int; private var curl:CURL; - private var parent:IHTTPRequest; + private var parent:_IHTTPRequest; private var promise:Promise; @@ -44,7 +44,7 @@ class NativeHTTPRequest { } - public function init (parent:IHTTPRequest):Void { + public function init (parent:_IHTTPRequest):Void { this.parent = parent; diff --git a/lime/graphics/Image.hx b/lime/graphics/Image.hx index 20225b107..eb5360ee5 100644 --- a/lime/graphics/Image.hx +++ b/lime/graphics/Image.hx @@ -1181,7 +1181,7 @@ class Image { #else - throw "ImageBuffer.loadFromBytes not supported on this target"; + throw "Image.fromBytes not supported on this target"; #end diff --git a/lime/net/HTTPRequest.hx b/lime/net/HTTPRequest.hx index 8e7d9a818..a176eb866 100644 --- a/lime/net/HTTPRequest.hx +++ b/lime/net/HTTPRequest.hx @@ -1,16 +1,27 @@ package lime.net; #if !macro -#if (!macro && !display) +import haxe.io.Bytes; +import lime.app.Event; +import lime.app.Future; +import lime.app.Promise; + + +#if display + +class HTTPRequest { + +#else + @:genericBuild(lime.net.HTTPRequest.build()) -#end +class HTTPRequest extends AbstractHTTPRequest {} - -class HTTPRequest implements IHTTPRequest { +private class AbstractHTTPRequest implements _IHTTPRequest { +#end public var contentType:String; - public var data:haxe.io.Bytes; + public var data:Bytes; public var enableResponseHeaders:Bool; public var followRedirects:Bool; public var formData:Map; @@ -23,13 +34,7 @@ class HTTPRequest implements IHTTPRequest { public var uri:String; public var userAgent:String; - #if flash - private var backend = new lime._backend.flash.FlashHTTPRequest (); - #elseif (js && html5) - private var backend = new lime._backend.html5.HTML5HTTPRequest (); - #else - private var backend = new lime._backend.native.NativeHTTPRequest (); - #end + private var backend:HTTPRequestBackend; public function new (uri:String = null) { @@ -43,6 +48,7 @@ class HTTPRequest implements IHTTPRequest { method = GET; timeout = 30000; + backend = new HTTPRequestBackend (); backend.init (this); } @@ -55,7 +61,7 @@ class HTTPRequest implements IHTTPRequest { } - public function load (uri:String = null):lime.app.Future { + public function load (uri:String = null):Future { return null; @@ -65,7 +71,95 @@ class HTTPRequest implements IHTTPRequest { } -@:dox(hide) @:noCompletion interface IHTTPRequest { +#if !display + + +class _HTTPRequest_Bytes extends AbstractHTTPRequest { + + + public function new (uri:String = null) { + + super (uri); + + } + + + private function fromBytes (bytes:Bytes):T { + + return cast bytes; + + } + + + public override function load (uri:String = null):Future { + + if (uri != null) { + + this.uri = uri; + + } + + var promise = new lime.app.Promise (); + var future = backend.loadData (this.uri); + + future.onProgress (promise.progress); + future.onError (promise.error); + + future.onComplete (function (bytes) { + + responseData = fromBytes (bytes); + promise.complete (responseData); + + }); + + return promise.future; + + } + + +} + + +class _HTTPRequest_String extends AbstractHTTPRequest { + + + public function new (uri:String = null) { + + super (uri); + + } + + + public override function load (uri:String = null):Future { + + if (uri != null) { + + this.uri = uri; + + } + + var promise = new lime.app.Promise (); + var future = backend.loadText (this.uri); + + future.onProgress (promise.progress); + future.onError (promise.error); + + future.onComplete (function (text) { + + responseData = cast text; + promise.complete (responseData); + + }); + + return promise.future; + + } + + +} + + +interface _IHTTPRequest { public var contentType:String; public var data:haxe.io.Bytes; @@ -86,6 +180,18 @@ class HTTPRequest implements IHTTPRequest { } +#end + + +#if flash +private typedef HTTPRequestBackend = lime._backend.flash.FlashHTTPRequest; +#elseif (js && html5) +private typedef HTTPRequestBackend = lime._backend.html5.HTML5HTTPRequest; +#else +private typedef HTTPRequestBackend = lime._backend.native.NativeHTTPRequest; +#end + + #else @@ -171,161 +277,71 @@ class HTTPRequest { } - var typeParamString = typeString; + if (typeString == "String" || stringAbstract) { + + return TPath ( { pack: [ "lime", "net" ], name: "HTTPRequest", sub: "_HTTPRequest_String", params: [ TPType (paramType.toComplexType ()) ] } ).toType (); + + } else if (typeString == "haxe.io.Bytes" || bytesAbstract) { + + return TPath ( { pack: [ "lime", "net" ], name: "HTTPRequest", sub: "_HTTPRequest_Bytes", params: [ TPType (paramType.toComplexType ()) ] } ).toType (); + + } else { - if (typeArgs.length > 0) { + var typeParamString = typeString; - typeParamString += "<"; - - for (i in 0...typeArgs.length) { + if (typeArgs.length > 0) { - if (i > 0) typeParamString += ","; - typeParamString += typeArgs[i].toString (); + typeParamString += "<"; - } - - typeParamString += ">"; - - } - - var flattenedTypeString = typeParamString; - - flattenedTypeString = StringTools.replace (flattenedTypeString, "->", "_"); - flattenedTypeString = StringTools.replace (flattenedTypeString, ".", "_"); - flattenedTypeString = StringTools.replace (flattenedTypeString, "<", "_"); - flattenedTypeString = StringTools.replace (flattenedTypeString, ">", "_"); - - var name = "_HTTPRequest_" + flattenedTypeString; - - try { - - Context.getType ("lime.net." + name); - - } catch (e:Dynamic) { - - var pos = Context.currentPos (); - var fields = Context.getBuildFields (); - var load = null; - - for (field in fields) { - - if (field.name == "load") { + for (i in 0...typeArgs.length) { - load = field; - break; + if (i > 0) typeParamString += ","; + typeParamString += typeArgs[i].toString (); } + typeParamString += ">"; + } - switch (load.kind) { + var flattenedTypeString = typeParamString; + + flattenedTypeString = StringTools.replace (flattenedTypeString, "->", "_"); + flattenedTypeString = StringTools.replace (flattenedTypeString, ".", "_"); + flattenedTypeString = StringTools.replace (flattenedTypeString, "<", "_"); + flattenedTypeString = StringTools.replace (flattenedTypeString, ">", "_"); + + var name = "_HTTPRequest_" + flattenedTypeString; + + try { - case FFun (fun): + Context.getType ("lime.net." + name); + + } catch (e:Dynamic) { + + var pos = Context.currentPos (); + + var fields = [ + { name: "new", access: [ APublic ], kind: FFun({ args: [ { name: "uri", type: macro :String, opt: true } ], expr: macro { super (uri); }, params: [], ret: macro :Void }), pos: Context.currentPos () }, + { name: "fromBytes", access: [ APrivate, AOverride ], kind: FFun ( { args: [ { name: "bytes", type: macro :haxe.io.Bytes } ], expr: Context.parse ("return " + typeString + ".fromBytes (bytes)", pos), params: [], ret: paramType.toComplexType () } ), pos: pos } + ]; + + Context.defineType ({ - if (typeString == "String") { - - fun.expr = macro { - - if (uri != null) { - - this.uri = uri; - - } - - return cast backend.loadText (this.uri); - - }; - - } else if (stringAbstract) { - - fun.expr = macro { - - if (uri != null) { - - this.uri = uri; - - } - - var promise = new lime.app.Promise (); - var future = backend.loadText (this.uri); - - future.onProgress (promise.progress); - future.onError (promise.error); - - future.onComplete (function (text) { - - responseData = cast text; - promise.complete (responseData); - - }); - - return promise.future; - - }; - - } else { - - fun.expr = macro { - - if (uri != null) { - - this.uri = uri; - - } - - var promise = new lime.app.Promise (); - var future = backend.loadData (this.uri); - - future.onProgress (promise.progress); - future.onError (promise.error); - - future.onComplete (function (bytes) { - - responseData = cast fromBytes (bytes); - promise.complete (responseData); - - }); - - return promise.future; - - }; - - var fromBytes = null; - - if (typeString == "haxe.io.Bytes" || bytesAbstract) { - - fromBytes = macro { return bytes; } - - } else { - - fromBytes = Context.parse ("return " + typeString + ".fromBytes (bytes)", pos); - - } - - fields.push ( { name: "fromBytes", access: [ APrivate, AInline ], kind: FFun ( { args: [ { name: "bytes", type: macro :haxe.io.Bytes } ], expr: fromBytes, params: [], ret: paramType.toComplexType () } ), pos: pos } ); - - } - - default: + name: name, + pack: [ "lime", "net" ], + kind: TDClass ({ pack: [ "lime", "net" ], name: "HTTPRequest", sub: "_HTTPRequest_Bytes", params: [ TPType (paramType.toComplexType ()) ] }, null, false), + fields: fields, + pos: pos + + }); } - Context.defineType ({ - - pos: pos, - pack: [ "lime", "net" ], - name: name, - kind: TDClass (null, [ { pack: [ "lime", "net" ], name: "HTTPRequest", sub: "IHTTPRequest", params: [] } ], null), - fields: fields, - params: [ { name: "T" } ], - meta: [ { name: ":dox", params: [ macro hide ], pos: pos }, { name: ":noCompletion", pos: pos } ] - - }); + return TPath ( { pack: [ "lime", "net" ], name: name, params: [] } ).toType (); } - return TPath ( { pack: [ "lime", "net" ], name: name, params: [ TPType (paramType.toComplexType ()) ] } ).toType (); - } @@ -337,7 +353,7 @@ class HTTPRequest { case TInst (t, _): - return isBytesType (t.get ()); + return t.get ().module == "haxe.io.Bytes"; case TAbstract (t, _): @@ -356,21 +372,6 @@ class HTTPRequest { } - private static function isBytesType (type:ClassType):Bool { - - while (true) { - - if (type.module == "haxe.io.Bytes") return true; - if (type.superClass == null) break; - type = type.superClass.t.get (); - - } - - return false; - - } - - private static function isStringAbstract (type:AbstractType):Bool { while (type != null) {