瀏覽代碼

WIP httprequest tweaks

Mark Sibly 7 年之前
父節點
當前提交
8acbfd41ae

+ 2 - 13
bananas/httprequest/httprequest_test.monkey2

@@ -29,14 +29,7 @@ Class MyWindow Extends Window
 		
 			label.Text="Ready state changed to "+Int( req.ReadyState )+" status="+req.Status
 			
-			Select req.ReadyState
-			Case ReadyState.Done
-				Print "Request done ReponseText=~q"+req.ResponseText+"~q Status="+req.Status
-				Print "Length="+req.ResponseText.Length
-			Case ReadyState.Error
-				Print "Request error Status="+req.Status
-			End
-		
+			If req.ReadyState=ReadyState.Done Print "Request response:~n"+req.ResponseText
 		End
 		
 	#If __TARGET__="emscripten"
@@ -65,14 +58,10 @@ Class MyWindow Extends Window
 		req.Send()
 	End
 
-#rem
 	Method OnRender( canvas:Canvas ) Override
 	
-		App.RequestRender()
-	
-		canvas.DrawText( "Hello World!",Width/2,Height/2,.5,.5 )
+		App.RequestRender()	'need this for ios?
 	End
-#end
 	
 	Method OnMeasure:Vec2i() Override
 		

+ 16 - 1
modules/httprequest/httprequest_ios.monkey2

@@ -17,6 +17,7 @@ Class bbHttpRequest
 	Method open( req:String,url:String )
 	Method setHeader( name:String,value:String )
 	Method send( text:String,timeout:float )
+	Method cancel()
 End
 
 Public
@@ -29,7 +30,16 @@ Class HttpRequest Extends HttpRequestBase
 		
 		_peer.readyStateChanged=OnReadyStateChanged
 	End
-
+	
+	Method New( req:String,url:String,readyStateChanged:Void()=Null )
+	
+		Self.New()
+		
+		Open( req,url )
+		
+		ReadyStateChanged=readyStateChanged
+	End
+	
 	Protected
 	
 	Method OnReadyStateChanged()
@@ -57,6 +67,11 @@ Class HttpRequest Extends HttpRequestBase
 		_peer.send( text,_timeout )
 	End
 	
+	Method OnCancel() Override
+	
+		_peer.cancel()
+	End
+	
 	Private
 	
 	Field _peer:bbHttpRequest

+ 2 - 0
modules/httprequest/native/httprequest.h

@@ -16,10 +16,12 @@ struct bbHttpRequest : public bbObject{
 	bbFunction<void()> readyStateChanged;
 	
 	bbHttpRequest();
+	~bbHttpRequest();
 	
 	void open( bbString req,bbString url );
 	void setHeader( bbString name,bbString value );
 	void send( bbString text,float timeout );
+	void cancel();
 	
 	void setReadyState( int state );
 	

+ 49 - 58
modules/httprequest/native/httprequest.mm

@@ -4,63 +4,40 @@
 #include "../../std/async/native/async.h"
 
 struct bbHttpRequest::Rep{
-	NSMutableURLRequest *_req;
-	NSString *_response;
-	int _status;	
-};
-
-namespace{
-
-	struct ReadyStateChangedEvent : public bbAsync::Event{
 
-		bbHttpRequest *req;
-		int state;
+	NSMutableURLRequest *_req=0;
 
-		ReadyStateChangedEvent( bbHttpRequest *req ):req( req ),state( req->readyState ){
-		}
-		
-		void dispatch(){
-		
-			if( state==req->readyState ){
-		
-				if( req->readyState==4 ){
-					req->response=bbString( req->_rep->_response );
-					req->status=req->_rep->_status;
-				}
-			
-				req->readyStateChanged();
-			}
-			
-			bbGC::release( req );
-			
-			delete this;
-		}
-	};
-
-}
+	NSURLSessionDataTask *_dataTask=0;
+};
 
 bbHttpRequest::bbHttpRequest(){
 
 	_rep=new Rep;
 }
 
+bbHttpRequest::~bbHttpRequest(){
+
+#if !__has_feature(objc_arc)
+	if( _rep->_req ) [_rep->_req release];
+#endif
+
+	delete _rep;
+}
 	
 void bbHttpRequest::open( bbString req,bbString url ){
 	
 	if( readyState!=0 ) return;
 	
-	NSMutableURLRequest *nsreq=[[NSMutableURLRequest alloc] init];
+	_rep->_req=[[NSMutableURLRequest alloc] init];
 		
-	[nsreq setHTTPMethod:req.ToNSString()];
+	[_rep->_req setHTTPMethod:req.ToNSString()];
 	
-	[nsreq setURL:[NSURL URLWithString:url.ToNSString()]];
+	[_rep->_req setURL:[NSURL URLWithString:url.ToNSString()]];
 	
-	if( [nsreq respondsToSelector:@selector(setAllowsCellularAccess:)] ){
-		[nsreq setAllowsCellularAccess:YES];
+	if( [_rep->_req respondsToSelector:@selector(setAllowsCellularAccess:)] ){
+		[_rep->_req setAllowsCellularAccess:YES];
 	}
 	
-	_rep->_req=nsreq;
-	
 	setReadyState( 1 );
 }
 	
@@ -70,39 +47,53 @@ void bbHttpRequest::setHeader( bbString name,bbString value ){
 		
 	[_rep->_req setValue:value.ToNSString() forHTTPHeaderField:name.ToNSString()];
 }
-	
+
 void bbHttpRequest::send( bbString text,float timeout ){
 	
 	if( readyState!=1 ) return;
+	
+	NSURLSession *session=[NSURLSession sharedSession];
 		
-	bbGC::retain( this );
+	_rep->_dataTask=[session dataTaskWithRequest:_rep->_req completionHandler:
 	
-    std::thread( [=](){
-    
-    	_rep->_req.timeoutInterval=(NSTimeInterval)timeout;
-
-		NSURLResponse *response=0;
-			
-		NSData *data=[NSURLConnection sendSynchronousRequest:_rep->_req returningResponse:&response error:0];
+	^( NSData *data,NSURLResponse *response,NSError *error ){
+	
+		if( !error ){
+		
+			NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
 		
-		if( data && response ){
+			this->response=bbString( str );
 			
-		  	_rep->_response=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
+#if !__has_feature(objc_arc)
+			[str release];
+#endif
+
+		    status=[(NSHTTPURLResponse*)response statusCode];
+		    
+		    setReadyState( 4 );
+		    
+		}else{
 		
-		    _rep->_status=[(NSHTTPURLResponse*)response statusCode];
+			setReadyState( 5 );
 		}
-
-		readyState=4;
-		
-		ReadyStateChangedEvent *ev=new ReadyStateChangedEvent( this );
 		
-		ev->post();
-			
-	} ).detach();
+		bbGC::release( this );
+	}
+	
+	];
+	
+	[_rep->_dataTask resume];
 
+	bbGC::retain( this );
+	
 	setReadyState( 3 );
 }
 
+void bbHttpRequest::cancel(){
+
+	if( _rep->_dataTask ) [_rep->_dataTask cancel];
+}
+
 void bbHttpRequest::setReadyState( int state ){
 
 	readyState=state;