httpgetter updated to receive php
Monkey Forums/Monkey Code/httpgetter updated to receive php
| ||
| I noticed that the httpgetter in the examples only allowed you to grab 'web pages' where I always grab php code. (hiscores, sql results etc ...) The only real change is with GetPage, where now you supply the host url then the actual page you require. getter.GetPage "www.monkeycoder.co.nz", "/Community/posts.php?topic=3637#38950", 80, Self Im building up a string called "last_received" which will be populated upon page completion Seeing that Im only ever receiving small data back there shouldn't be that much need for Async, but its nice to have an animation running whilst your waiting. You'll notice im stripping out the header text from the server. So heres what im using :-
#If TARGET<>"glfw" And TARGET<>"android" And TARGET<>"ios"
#Error "c++ or java Mojo target required"
#Endif
Import mojo
Import brl.asynctcpstream
'***** Hypothetical HTTP module *****
Interface HTTPListener
Method OnHTTPConnected:Void( getter:HTTPGetter )
Method OnHTTPDataReceived:Void( data:DataBuffer,offset:Int,count:Int,getter:HTTPGetter )
Method OnHTTPPageComplete:Void( getter:HTTPGetter )
End
Class HTTPGetter Implements IOnConnectComplete,IOnReadComplete,IOnWriteComplete
Field _page:String = ""
Field Text:String = ""
Field last_received:String = ""
Field dataflag:Bool = False
Method GetPage:Void(host:String, page:String, port:Int, listener:HTTPListener)
_host=host
_port=port
_listener=listener
_page = page
Text = ""
dataflag = False ' marker for start of web page data
_stream=New AsyncTcpStream
_stream.Connect _host, _port, Self
End
Method Update:Bool()
If _stream Return _stream.Update()
Return False
End
Private
Method Finish:Void()
_listener.OnHTTPPageComplete Self
_strqueue.Clear
_stream.Close
_stream=Null
End
'start up another read op
Method ReadMore:Void()
'read another block
_stream.ReadAll _rbuf, 0, _rbuf.Length, Self
End
'start up another write op
Method WriteMore:Void()
If _strqueue.IsEmpty() Return
Local str:= _strqueue.RemoveFirst()
_wbuf.PokeString 0, str
_stream.WriteAll _wbuf, 0, str.Length, Self
End
Method WriteString:Void( str:String )
_strqueue.AddLast str
End
Method OnConnectComplete:Void(connected:Bool, source:IAsyncEventSource)
If Not connected
Finish
Return
Endif
' which page onthe website do you want
WriteString "GET " + _page + " HTTP/1.0~r~n"
WriteString "Host: " + _host + "~r~n"
WriteString "~r~n"
_listener.OnHTTPConnected Self
WriteMore
ReadMore
End
Method OnReadComplete:Void( buf:DataBuffer,offset:Int,count:Int,source:IAsyncEventSource )
If Not count 'EOF!
Finish
Return
Endif
_listener.OnHTTPDataReceived buf,offset,count,Self
ReadMore
End
Method OnWriteComplete:Void( buf:DataBuffer,offset:Int,count:Int,source:IAsyncEventSource )
WriteMore
End
Field _host:String
Field _port:Int
Field _listener:HTTPListener
Field _stream:AsyncTcpStream
Field _strqueue:=New StringList
Field _rbuf:= New DataBuffer(1024) 'thrash it!
Field _wbuf:=New DataBuffer( 256 )
End
'***** The app! *****
Class MyApp Extends App Implements HTTPListener
Field dataflag:Bool = False
Field getter:= New HTTPGetter
Method OnHTTPConnected:Void(getter:HTTPGetter)
'Print "HTTP connected!"
End
Method OnHTTPDataReceived:Void( data:DataBuffer,offset:Int,count:Int,getter:HTTPGetter )
' Print "HTTP data received! length="+count
Local str:= data.PeekString(offset, count)
For Local line:=Eachin str.Split( "~n" )
' have we already gone past the start of data marker ?
If getter.dataflag Then
getter.Text = getter.Text + line
Else
' we at the data marker for data? (i.e. first blank line)
If line = "~r" Then
getter.dataflag = True ' from here on in comes data !
EndIf
EndIf
Next
End
Method OnHTTPPageComplete:Void( getter:HTTPGetter )
getter.last_received = getter.Text
getter.Text = ""
End
Method OnCreate()
getter.GetPage "www.monkeycoder.co.nz", "/Community/posts.php?topic=3637#38950", 80, Self
SetUpdateRate 60
End
Method OnUpdate()
UpdateAsyncEvents
End
Method OnRender()
Cls
' we got any text ?
If getter.last_received <> "" Then
DrawText getter.last_received, 0, 0
EndIf
End
End
Function Main()
New MyApp
End
/Stu |
| ||
| Thanks for this :) Was struggling to get sub directory content |