This commit is contained in:
yumoqing 2020-12-19 14:00:27 +08:00
commit 072cad2343
5 changed files with 53 additions and 14 deletions

View File

@ -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 = {}

View File

@ -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:

View File

@ -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('<html>'):
return True
if b.startswith('<!doctype html>'):
return True
except Exception as e:
print_exc()
print(e)
return False
def url2processor(self, request, url):
config = getConfig()

View File

@ -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

4
ahserver/utils.py Normal file
View File

@ -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)