Browse Source

WIP httprequest tweaks.

Mark Sibly 7 years ago
parent
commit
3d2f975cde

+ 21 - 11
bananas/httprequest/httprequest_test.monkey2

@@ -1,4 +1,3 @@
-
 Namespace myapp
 
 #Import "<std>"
@@ -17,22 +16,33 @@ Class MyWindow Extends Window
 
 		Super.New( title,width,height,flags )
 		
-		req=New HttpRequest( "GET","http://www.blitzbasic.com",Lambda()
+		req=New HttpRequest
+		
+		req.Timeout=10
+
+		req.ReadyStateChanged=Lambda()
 		
 			Print "Ready state changed to "+Int( req.ReadyState )
 			
-			If req.ReadyState=4 
-				Print "ReponseText="+req.ResponseText
-				Print "Status="+req.Status
-			Endif
+			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
 		
-		End )
+		End
 		
-		New Fiber( Lambda()
+	#If __TARGET__="emscripten"
+		Const url:="test.txt"
+	#else
+		Const url:="https://www.github.com"
+	#endif
 		
-			req.Send()
-			
-		End )
+		req.Open( "GET",url )
+		
+		req.Send()
 	End
 
 	Method OnRender( canvas:Canvas ) Override

+ 134 - 2
modules/httprequest/httprequest.monkey2

@@ -1,12 +1,144 @@
 
 Namespace httprequest
 
-#If __TARGET__="android"
+#Import "<std>"
 
-#Import "httprequest_android"
+Using std..
+
+#If __TARGET__="windows" Or __TARGET__="linux"
+
+#Import "httprequest_desktop"
+
+#Import "bin/wget.exe"
 
 #Else If __TARGET__="macos" Or  __TARGET__="ios"
 
 #Import "httprequest_ios"
 
+#Elseif __TARGET__="emscripten"
+
+#Import "httprequest_emscripten"
+
+#Elseif __TARGET__="android"
+
+#Import "httprequest_android"
+
 #Endif
+
+Enum ReadyState
+	Unsent=0
+	Opened=1
+	HeadersReceived=2
+	Loading=3
+	Done=4
+	Error=5
+End
+
+Class HttpRequestBase
+	
+	Field ReadyStateChanged:Void()
+	
+	Method New()
+		
+		_readyState=ReadyState.Unsent
+		_timeout=10
+		_status=-1
+	End
+	
+	Method New( req:String,url:String,readyStateChanged:Void()=Null )
+		
+		Self.New()
+		
+		Open( req,url )
+		
+		ReadyStateChanged=readyStateChanged
+	End
+	
+	Property Timeout:Float()
+		
+		Return _timeout
+		
+	Setter( timeout:Float )
+		
+		_timeout=timeout
+	End
+	
+	Property ReadyState:ReadyState()
+		
+		Return _readyState
+	End
+	
+	Property ResponseText:String()
+		
+		Return _response
+	End
+	
+	Property Status:Int()
+		
+		Return _status
+	End
+	
+	Method Open( req:String,url:String )
+		
+		If _readyState<>ReadyState.Unsent Return
+		
+		_method=req
+		
+		_url=url
+		
+		OnOpen()
+		
+		_readyState=ReadyState.Opened
+		
+		ReadyStateChanged()
+	End
+	
+	Method SetHeader( header:String,value:String )
+		
+		If _readyState<>ReadyState.Opened Return
+		
+		OnSetHeader( header,value )
+	End
+	
+	Method Send()
+		
+		Send( "" )
+	End
+	
+	Method Send( text:String )
+
+		If _readyState<>ReadyState.Opened Return
+		
+		OnSend( text )
+	End
+	
+	Protected
+	
+	Field _timeout:Float=10.0
+	Field _response:String
+	Field _status:Int=-1
+	Field _method:String
+	Field _url:String
+	
+	Method OnOpen() Virtual
+	End
+
+	Method OnSetHeader( header:String,value:String ) Abstract
+	
+	Method OnSend( text:String ) Abstract
+	
+	Method SetReadyState( readyState:ReadyState )
+		
+		If readyState=_readyState Return
+		
+		_readyState=readyState
+		
+		ReadyStateChanged()
+	End
+	
+	Private
+	
+	Field _readyState:ReadyState
+	
+End
+

+ 150 - 35
modules/httprequest/httprequest_android.monkey2

@@ -26,21 +26,141 @@ private
 Function OnMainFiber( func:Void() )
 	
 	If Fiber.Current()=Fiber.Main() func() Else App.Idle+=func
-	
 End
 
 Public
 
-Enum ReadyState
+Class HttpRequest Extends HttpRequestBase
+	
+	Method New()
+		
+		Init()
+
+		Local env:=Android_JNI_GetEnv()
+		
+		Local obj:=env.AllocObject( _class )
+		
+		_obj=env.NewGlobalRef( obj )
+		
+		_requests.Add( Self )
+	End
+	
+	Protected
+	
+	Method OnOpen() Override
+		
+		OnMainFiber( Lambda()
+		
+			Local env:=Android_JNI_GetEnv()
+		
+			env.CallVoidMethod( _obj,_open,New Variant[]( _method,_url ) )
+			
+		End )
+	End
+	
+	Method OnSetHeader( header:String,value:String ) Override
+		
+		OnMainFiber( Lambda()
+
+			Local env:=Android_JNI_GetEnv()
+		
+			env.CallVoidMethod( _obj,_setHeader,New Variant[]( header,value ) )
+			
+		End )
+	End
 	
-	Unsent=0
-	Opened=1
-	HeadersReceived=2
-	Loading=3
-	Done=4
-	Error=5
+	Method OnSend( text:String ) Override
+		
+		OnMainFiber( Lambda()
+
+			Local env:=Android_JNI_GetEnv()
+			
+			Local timeout:=Int( _timeout * 1000 )
+		
+			env.CallVoidMethod( _obj,_send,New Variant[]( text,timeout ) )
+		
+		End )
+	
+	End
+	
+	Private
+	
+	Field _obj:jobject
+	
+	Global _class:jclass
+	Global _open:jmethodID
+	Global _setHeader:jmethodID
+	Global _send:jmethodID
+	
+	Global _requests:=New Stack<HttpRequest>
+	
+	Method Close()
+		
+		Local env:=Android_JNI_GetEnv()
+		
+		env.DeleteGlobalRef( _obj )
+		
+		_requests.Remove( Self )
+	End
+	
+	Function OnReadyStateChanged( obj:jobject,state:Int )
+		
+		Local env:=Android_JNI_GetEnv()
+		
+		For Local request:=Eachin _requests
+			
+			If Not env.IsSameObject( obj,request._obj ) Continue
+				
+			request.SetReadyState( Cast<ReadyState>( state ) )
+
+			If state=4 Or state=5 request.Close()
+			
+			Exit
+		Next
+		
+	End
+	
+	Function OnResponseReceived( obj:jobject,response:String,status:Int,state:Int )
+
+		Local env:=Android_JNI_GetEnv()
+		
+		For Local request:=Eachin _requests
+			
+			If Not env.IsSameObject( obj,request._obj ) Continue
+				
+			request._response=response
+			
+			request._status=status
+			
+			request.SetReadyState( Cast<ReadyState>( state ) )
+			
+			Exit
+		Next
+	End
+	
+	Function Init()
+		
+		If _class Return
+
+		Local env:=Android_JNI_GetEnv()
+	
+		_class=env.FindClass( "com/monkey2/lib/Monkey2HttpRequest" )
+		If Not _class RuntimeError( "Can't find com.monkey2.lib.Monkey2HttpRequest class" )
+		
+		_open=env.GetMethodID( _class,"open","(Ljava/lang/String;Ljava/lang/String;)V" )
+		
+		_setHeader=env.GetMethodID( _class,"setHeader","(Ljava/lang/String;Ljava/lang/String;)V" )
+		
+		_send=env.GetMethodID( _class,"send","(Ljava/lang/String;I)V" )
+		
+		onReadyStateChanged=OnReadyStateChanged
+		
+		onResponseReceived=OnResponseReceived
+	End
 End
 
+#rem
+
 Class HttpRequest
 	
 	Field ReadyStateChanged:Void()
@@ -142,6 +262,9 @@ Class HttpRequest
 	
 	Private
 	
+	Global _sending:=New Stack<HttpRequest>
+	
+	
 	Global _list:HttpRequest
 	
 	Field _succ:HttpRequest
@@ -185,21 +308,14 @@ Class HttpRequest
 		
 		Local env:=Android_JNI_GetEnv()
 		
-		Local inst:=_list
-		
-		While inst
+		For Local request:=Eachin _requests
 			
-			If env.IsSameObject( obj,inst._obj )
-				
-				inst._readyState=state
+			If Not env.IsSameObject( obj,request._obj ) Continue
 				
-				inst.ReadyStateChanged()
+			request.SetReadyState( state )
 				
-				Return
-			Endif
-			
-			inst=inst._succ
-		Wend
+			Return
+		Next
 		
 	End
 	
@@ -207,28 +323,27 @@ Class HttpRequest
 
 		Local env:=Android_JNI_GetEnv()
 		
-		Local inst:=_list
-		
-		While inst
+		For Local request:=Eachin _requests
 			
-			If env.IsSameObject( obj,inst._obj )
-				
-				inst._response=response
+			If Not env.IsSameObject( obj,request._obj ) Continue
 				
-				inst._status=status
-				
-				inst._readyState=state
+			inst._response=response
+			
+			inst._status=status
+			
+			inst._readyState=state
 				
-				inst.ReadyStateChanged()
+			inst.ReadyStateChanged()
 			
-			Endif
-
-			inst=inst._succ
-		wend
+			Return
+		Next
 	End
 	
-	Function Init( env:JNIEnv )
+	Function Init()
+		
 		If _class Return
+
+		Local env:=Android_JNI_GetEnv()
 	
 		_class=env.FindClass( "com/monkey2/lib/Monkey2HttpRequest" )
 		If Not _class RuntimeError( "Can't find com.monkey2.lib.Monkey2HttpRequest class" )

+ 0 - 6
modules/httprequest/httprequest_ios.monkey2

@@ -7,12 +7,6 @@ Namespace httprequest
 
 Extern
 
-Enum ReadyState="bbReadyState"
-	Unsent
-	Done
-	Error
-End
-
 Class HttpRequest="bbHttpRequest"
 	
 	Field ReadyStateChanged:Void()="readyStateChanged"

+ 1 - 1
modules/httprequest/module.json

@@ -3,6 +3,6 @@
 	"about":"HttpRequest module",
 	"author":"Mark Sibly",
 	"version":"1.0.0",
-	"depends":["jni","std","sdl2","mojo"]
+	"depends":["libc","jni","std","sdl2","mojo"]
 }