diff --git a/ahserver/baseProcessor.py b/ahserver/baseProcessor.py index 68bb35e..a6aa106 100644 --- a/ahserver/baseProcessor.py +++ b/ahserver/baseProcessor.py @@ -11,12 +11,9 @@ from appPublic.jsonConfig import getConfig from appPublic.dictObject import DictObject from appPublic.folderUtils import listFile +from .utils import unicode_escape from .serverenv import ServerEnv -def unicode_escape(s): - x = [ch if ord(ch) < 256 else ch.encode('unicode_escape').decode('utf-8') for ch in s] - return ''.join(x) - class ObjectCache: def __init__(self): self.cache = {} diff --git a/ahserver/filedownload.py b/ahserver/filedownload.py index 8765405..9d7ea4b 100644 --- a/ahserver/filedownload.py +++ b/ahserver/filedownload.py @@ -18,10 +18,12 @@ def path_decode(dpath): rc4 = RC4() return rc4.decode(dpath,crypto_aim) -async def file_download(request, filepath): +async def file_download(request, filepath, content_type=None): filename = os.path.basename(filepath) r = web.FileResponse(filepath) - ct, encoding = mimetypes.guess_type(filepath) + ct = content_type + if ct is None: + ct, encoding = mimetypes.guess_type(filepath) if ct is not None: r.content_type = ct else: diff --git a/ahserver/processorResource.py b/ahserver/processorResource.py index d660417..87404df 100644 --- a/ahserver/processorResource.py +++ b/ahserver/processorResource.py @@ -1,5 +1,7 @@ import os import re +import codecs +from traceback import print_exc import asyncio @@ -40,6 +42,7 @@ from .filestorage import FileStorage from .restful import DBCrud from .dbadmin import DBAdmin from .filedownload import file_download, path_decode +from .utils import unicode_escape def getHeaderLang(request): al = request.headers.get('Accept-Language') @@ -226,13 +229,43 @@ class ProcessorResource(StaticResource,Url2File): processor = self.url2processor(request, str(request.url)) if processor: return await processor.handle(request) - + + filepath = self.url2file(str(request.url)) + print('filepath=',filepath,str(request.url)) + if filepath and self.isHtml(filepath): + return await self.html_handle(request, filepath) + print(f'path={path} handler by StaticResource..') if self.isFolder(path): config = getConfig() if not config.website.allowListFolder: raise HTTPNotFound return await super()._handle(request) + + async def html_handle(self,request,filepath): + with codecs.open(filepath,'r', 'utf-8') as f: + b = f.read() + b = unicode_escape(b) + headers = { + 'Content-Type': 'text/html; utf-8', + 'Accept-Ranges': 'bytes', + 'Content-Length': str(len(b)) + } + resp = Response(text=b,headers=headers) + return resp + + def isHtml(self,fn): + try: + with codecs.open(fn,'r','utf-8') as f: + b = f.read() + if b.startswith(''): + return True + if b.startswith(''): + return True + except Exception as e: + print_exc() + print(e) + return False def url2processor(self, request, url): config = getConfig() diff --git a/ahserver/url2file.py b/ahserver/url2file.py index dfabf91..6bc03b5 100644 --- a/ahserver/url2file.py +++ b/ahserver/url2file.py @@ -51,14 +51,17 @@ class Url2File: if url[-1] == '/': url = url[:-1] - if self.isFolder(url): - return self.defaultIndex(url) + paths = url.split('/')[3:] + f = os.path.join(self.path,*paths) + real_path = os.path.abspath(f) + if os.path.isdir(real_path): + for idx in self.indexes: + p = os.path.join(real_path,idx) + if os.path.isfile(p): + return p - if url.startswith(self.starts): - f = self.path + url[len(self.starts):] - real_path = os.path.abspath(f) - if os.path.isfile(real_path): - return f + if os.path.isfile(real_path): + return real_path if not self.inherit: return None diff --git a/ahserver/utils.py b/ahserver/utils.py new file mode 100644 index 0000000..1caec30 --- /dev/null +++ b/ahserver/utils.py @@ -0,0 +1,4 @@ +def unicode_escape(s): + x = [ch if ord(ch) < 256 else ch.encode('unicode_escape').decode('utf-8') for ch in s] + return ''.join(x) +