From c06691d27c08f8863f4c0007208d36f578bbf4a6 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 18 Dec 2020 13:27:53 +0800 Subject: [PATCH] bugfix --- ahserver/baseProcessor.py | 5 +---- ahserver/filedownload.py | 6 ++++-- ahserver/processorResource.py | 30 +++++++++++++++++++++++++++++- ahserver/utils.py | 4 ++++ 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 ahserver/utils.py diff --git a/ahserver/baseProcessor.py b/ahserver/baseProcessor.py index c64c78b..60abc15 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 c2084c6..ed05072 100644 --- a/ahserver/processorResource.py +++ b/ahserver/processorResource.py @@ -40,6 +40,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') @@ -232,13 +233,40 @@ class ProcessorResource(StaticResource,Url2File): processor = self.url2processor(request, str(request.url)) if processor: return await processor.handle(request) - + + filepath = self.url2filepath(str(request.url)) + if filepath and self.isHtml(filepath): + return await 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) + + 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.stratswith(''): + return True + except: + return False def url2processor(self, request, url): url = self.entireUrl(request, url) 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) +