Jelajahi Sumber

Merge pull request #2638 from dpeek/http-cancel

Adds haxe.Http.cancel for js and flash9
Nicolas Cannasse 11 tahun lalu
induk
melakukan
ac05b79ab8
1 mengubah file dengan 40 tambahan dan 2 penghapusan
  1. 40 2
      std/haxe/Http.hx

+ 40 - 2
std/haxe/Http.hx

@@ -153,6 +153,30 @@ class Http {
 	}
 	#end
 
+	#if (js || flash9)
+
+	#if js
+	var req:js.html.XMLHttpRequest;
+	#elseif flash9
+	var req:flash.net.URLLoader;
+	#end
+	
+	/**
+		Cancels `this` Http request if `request` has been called and a response 
+		has not yet been received.
+	**/
+	public function cancel()
+	{
+		if (req == null) return;
+		#if js
+		req.abort();
+		#elseif flash9
+		req.close();
+		#end
+		req = null;
+	}
+	#end
+
 	/**
 		Sends `this` Http request to the Url specified by `this.url`.
 
@@ -174,7 +198,7 @@ class Http {
 		var me = this;
 	#if js
 		me.responseData = null;
-		var r = js.Browser.createXMLHttpRequest();
+		var r = req = js.Browser.createXMLHttpRequest();
 		var onreadystatechange = function(_) {
 			if( r.readyState != 4 )
 				return;
@@ -184,15 +208,24 @@ class Http {
 			if( s != null )
 				me.onStatus(s);
 			if( s != null && s >= 200 && s < 400 )
+			{
+				me.req = null;
 				me.onData(me.responseData = r.responseText);
+			}
 			else if ( s == null )
+			{
+				me.req = null;
 				me.onError("Failed to connect or resolve host")
+			}
 			else switch( s ) {
 			case 12029:
+				me.req = null;
 				me.onError("Failed to connect to host");
 			case 12007:
+				me.req = null;
 				me.onError("Unknown host");
 			default:
+				me.req = null;
 				me.responseData = r.responseText;
 				me.onError("Http Error #"+r.status);
 			}
@@ -219,6 +252,7 @@ class Http {
 			} else
 				r.open("GET",url,async);
 		} catch( e : Dynamic ) {
+			me.req = null;
 			onError(e.toString());
 			return;
 		}
@@ -232,8 +266,9 @@ class Http {
 			onreadystatechange(null);
 	#elseif flash9
 		me.responseData = null;
-		var loader = new flash.net.URLLoader();
+		var loader = req = new flash.net.URLLoader();
 		loader.addEventListener( "complete", function(e) {
+			me.req = null;
 			me.responseData = loader.data;
 			me.onData( loader.data );
 		});
@@ -243,10 +278,12 @@ class Http {
 				me.onStatus( e.status );
 		});
 		loader.addEventListener( "ioError", function(e:flash.events.IOErrorEvent){
+			me.req = null;
 			me.responseData = loader.data;
 			me.onError(e.text);
 		});
 		loader.addEventListener( "securityError", function(e:flash.events.SecurityErrorEvent){
+			me.req = null;
 			me.onError(e.text);
 		});
 
@@ -283,6 +320,7 @@ class Http {
 		try {
 			loader.load( request );
 		}catch( e : Dynamic ){
+			me.req = null;
 			onError("Exception: "+Std.string(e));
 		}
 	#elseif flash