Fix extension manager access to sites with long 404 messages

This commit is contained in:
Theo Arends 2025-10-03 14:11:16 +02:00
parent 37e097e378
commit 878cb0c085
2 changed files with 742 additions and 802 deletions

View File

@ -10,6 +10,7 @@ class Extension_manager
static var EXT_REPO = "https://ota.tasmota.com/extensions/" static var EXT_REPO = "https://ota.tasmota.com/extensions/"
static var EXT_REPO_MANIFEST = "extensions.jsonl" static var EXT_REPO_MANIFEST = "extensions.jsonl"
static var EXT_REPO_FOLDER = "tapp/" static var EXT_REPO_FOLDER = "tapp/"
var ext_repo
##################################################################################################### #####################################################################################################
# init - constructor # init - constructor
@ -17,6 +18,7 @@ class Extension_manager
# Register as driver # Register as driver
# #
def init() def init()
self.ext_repo = ""
tasmota.add_driver(self) tasmota.add_driver(self)
end end
@ -66,23 +68,6 @@ class Extension_manager
return wd[from .. to] return wd[from .. to]
end end
#####################################################################################################
# ext_repo_local()
#
# Takes OtaUrl, extract the host url and adds extensions/
# Ex: 'http://otaserver/ota/tasmota/tasmota32.bin' becomes 'http://otaserver/extensions/'
#
# @return string - the url of the local extensions repository
#####################################################################################################
static def ext_repo_local()
import string
var ota_url = tasmota.cmd("_OtaUrl", true)['OtaUrl']
var url = string.split(ota_url, "/")
var result = f"{url[0]}//{url[2]}/extensions/" # http://otaserver/extensions/
return result
end
##################################################################################################### #####################################################################################################
# General functions to get information about tapp files (installed or from store) # General functions to get information about tapp files (installed or from store)
##################################################################################################### #####################################################################################################
@ -311,31 +296,20 @@ class Extension_manager
# sanitize # sanitize
tapp_fname = self.tapp_name(tapp_fname) + ".tapp" tapp_fname = self.tapp_name(tapp_fname) + ".tapp"
# full url # full url
var ext_url = f"{self.EXT_REPO}{self.EXT_REPO_FOLDER}{tapp_fname}" var ext_url = f"{self.ext_repo}{self.EXT_REPO_FOLDER}{tapp_fname}"
var ext_repo = self.ext_repo_local() log(f"EXT: installing from '{ext_url}'", 3)
var ext_url_local = f"{ext_repo}{self.EXT_REPO_FOLDER}{tapp_fname}"
# load from web # load from web
try try
# check if directory exists # check if directory exists
self.check_or_create_dir(self.EXT_FOLDER) # raises an exception if failed self.check_or_create_dir(self.EXT_FOLDER) # raises an exception if failed
var local_file = f"{self.EXT_FOLDER}{tapp_fname}" var local_file = f"{self.EXT_FOLDER}{tapp_fname}"
var cl = webclient() var cl = webclient()
log(f"EXT: installing from '{ext_url_local}'", 3) cl.begin(ext_url)
cl.begin(ext_url_local)
var r = cl.GET() var r = cl.GET()
if r != 200 if r != 200
cl.close() log(f"EXT: return_code={r}", 2)
cl = webclient() return false
if self.EXT_REPO != ext_repo
log(f"EXT: installing from '{ext_url}'", 3)
cl.begin(ext_url)
r = cl.GET()
end
if r != 200
log(f"EXT: return_code={r}", 2)
return false
end
end end
var ret = cl.write_file(local_file) var ret = cl.write_file(local_file)
cl.close() cl.close()
@ -658,24 +632,35 @@ class Extension_manager
##################################################################################################### #####################################################################################################
def load_manifest() def load_manifest()
try try
import string
var arch = tasmota.arch() # architecture, ex: "esp32" - not used currently but might be useful var arch = tasmota.arch() # architecture, ex: "esp32" - not used currently but might be useful
var version = f"0x{tasmota.version():08X}" var version = f"0x{tasmota.version():08X}"
var url = f"{self.EXT_REPO}{self.EXT_REPO_MANIFEST}?a={arch}&v={version}" # if !self.ext_repo
var ext_repo = self.ext_repo_local() var ota_url = tasmota.cmd("OtaUrl", true)['OtaUrl']
var url_local = f"{ext_repo}{self.EXT_REPO_MANIFEST}?a={arch}&v={version}" var url_parts = string.split(ota_url, "/")
self.ext_repo = f"{url_parts[0]}//{url_parts[2]}/extensions/" # http://otaserver/extensions/
# end
var url = f"{self.ext_repo}{self.EXT_REPO_MANIFEST}?a={arch}&v={version}"
log(f"EXT: fetching extensions manifest '{url}'", 3)
# Add architeture and version information # Add architeture and version information
# They are not used for now but may be interesting in the future to serve # They are not used for now but may be interesting in the future to serve
# different content based on architecture (Ex: ESP32) and version (ex: 0x0E060001 for 14.6.0.1) # different content based on architecture (Ex: ESP32) and version (ex: 0x0E060001 for 14.6.0.1)
# load the template # load extensions manifest
var cl = webclient() var cl = webclient()
log(f"EXT: fetching extensions manifest '{url_local}'", 3) cl.begin(url)
cl.begin(url_local)
var r = cl.GET() var r = cl.GET()
if r != 200 if r != 200
cl.close() if self.EXT_REPO != self.ext_repo
cl = webclient() if cl.get_size() < 0 # Happens on https://github.com/extensions/extensions.jsonl where 404 page is a lot of data
if self.EXT_REPO != ext_repo cl.deinit()
cl = webclient()
else
cl.close() # Fails to close if cl.get_size() < 0
end
self.ext_repo = self.EXT_REPO
url = f"{self.ext_repo}{self.EXT_REPO_MANIFEST}?a={arch}&v={version}"
log(f"EXT: fetching extensions manifest '{url}'", 3) log(f"EXT: fetching extensions manifest '{url}'", 3)
cl.begin(url) cl.begin(url)
r = cl.GET() r = cl.GET()