Skip to content

Instantly share code, notes, and snippets.

@vinod8990
Last active August 13, 2022 19:44
Show Gist options
  • Save vinod8990/c8d291fcceab271ec45d to your computer and use it in GitHub Desktop.
Save vinod8990/c8d291fcceab271ec45d to your computer and use it in GitHub Desktop.
Http downloader class for Godot
#Http downloader class for Godot
#This is a simple http downloader class which can be used to download anything from an http url
#USAGE
#Create a new scene "http.xml", with a root Node and attach this script
#Then in other scripts where you want to download something
#var http = preload("res://http.xml").instance()
#http.connect("loading",self,"_ondownloading")
#http.connect("loaded",self,"_ondownloaded")
#http.get(domain,url,port,useSSL)
##Callbacks
#func _ondownloading(l,t):
# print(l*100/t) #download progress
#func _ondownloaded(r):
# r.get_string_from_ascii() #if the result expected is a string
# ##OR if it is a file
# var f = File.new()
# f.open("res://filename.ext",File.WRITE)
# f.store_buffer(r)
# f.close()
#
extends Node
var t = Thread.new()
func _init():
var arg_bytes_loaded = {"name":"bytes_loaded","type":TYPE_INT}
var arg_bytes_total = {"name":"bytes_total","type":TYPE_INT}
add_user_signal("loading",[arg_bytes_loaded,arg_bytes_total])
var arg_result = {"name":"result","type":TYPE_RAW_ARRAY}
add_user_signal("loaded",[arg_result])
pass
func get(domain,url,port,ssl):
if(t.is_active()):
return
t.start(self,"_load",{"domain":domain,"url":url,"port":port,"ssl":ssl})
func _load(params):
var err = 0
var http = HTTPClient.new()
err = http.connect(params.domain,params.port,params.ssl)
while(http.get_status() == HTTPClient.STATUS_CONNECTING or http.get_status() == HTTPClient.STATUS_RESOLVING):
http.poll()
OS.delay_msec(100)
var headers = [
"User-Agent: Pirulo/1.0 (Godot)",
"Accept: */*"
]
err = http.request(HTTPClient.METHOD_GET,params.url,headers)
while (http.get_status() == HTTPClient.STATUS_REQUESTING):
http.poll()
OS.delay_msec(500)
#
var rb = RawArray()
if(http.has_response()):
var headers = http.get_response_headers_as_dictionary()
while(http.get_status()==HTTPClient.STATUS_BODY):
http.poll()
var chunk = http.read_response_body_chunk()
if(chunk.size()==0):
OS.delay_usec(100)
else:
rb = rb+chunk
call_deferred("_send_loading_signal",rb.size(),http.get_response_body_length())
call_deferred("_send_loaded_signal")
http.close()
return rb
func _send_loading_signal(l,t):
emit_signal("loading",l,t)
pass
func _send_loaded_signal():
var r = t.wait_to_finish()
emit_signal("loaded",r)
pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment