Update.
This commit is contained in:
parent
d2e2bb8117
commit
d23ed3711a
@ -15,11 +15,21 @@ import aiohttp
|
||||
import aiohttp.web
|
||||
from lxml import etree
|
||||
|
||||
@aiohttp.web.middleware
|
||||
async def debug_middleware(request, handler):
|
||||
print(request.method, request.path, request.headers)
|
||||
return await handler(request)
|
||||
|
||||
|
||||
class WebdavApplication(aiohttp.web.Application):
|
||||
def __init__(self, parent, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
middlewares = [debug_middleware]
|
||||
|
||||
super().__init__(middlewares=middlewares, *args, **kwargs)
|
||||
self.locks = {}
|
||||
|
||||
self.relative_url = "/webdav"
|
||||
print(self.router)
|
||||
|
||||
self.router.add_route("OPTIONS", "/{filename:.*}", self.handle_options)
|
||||
self.router.add_route("GET", "/{filename:.*}", self.handle_get)
|
||||
@ -30,8 +40,8 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
self.router.add_route("COPY", "/{filename:.*}", self.handle_copy)
|
||||
self.router.add_route("PROPFIND", "/{filename:.*}", self.handle_propfind)
|
||||
self.router.add_route("PROPPATCH", "/{filename:.*}", self.handle_proppatch)
|
||||
# self.router.add_route("LOCK", "/{filename:.*}", self.handle_lock)
|
||||
# self.router.add_route("UNLOCK", "/{filename:.*}", self.handle_unlock)
|
||||
self.router.add_route("LOCK", "/{filename:.*}", self.handle_lock)
|
||||
self.router.add_route("UNLOCK", "/{filename:.*}", self.handle_unlock)
|
||||
self.parent = parent
|
||||
|
||||
@property
|
||||
@ -46,11 +56,11 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
# session = request.session
|
||||
# if session.get('uid'):
|
||||
# request['user'] = await self.services.user.get(uid=session['uid'])
|
||||
# try:
|
||||
# request['home'] = await self.services.user.get_home_folder(user_uid=request['user']['uid'])
|
||||
# except:
|
||||
# pass
|
||||
# return request['user']
|
||||
#try:
|
||||
# request['home'] = await self.services.user.get_home_folder(user_uid=request['user']['uid'])
|
||||
#except:
|
||||
# pass
|
||||
#return request['user']
|
||||
|
||||
auth_header = request.headers.get("Authorization", "")
|
||||
if not auth_header.startswith("Basic "):
|
||||
@ -66,6 +76,7 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
request["user"]["uid"]
|
||||
)
|
||||
except Exception as ex:
|
||||
print("GRRRRRRRRRR")
|
||||
print(ex)
|
||||
pass
|
||||
return request["user"]
|
||||
@ -98,6 +109,7 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
status=401, headers={"WWW-Authenticate": 'Basic realm="WebDAV"'}
|
||||
)
|
||||
file_path = request["home"] / request.match_info["filename"]
|
||||
print("WRITETO_", file_path)
|
||||
file_path.parent.mkdir(parents=True, exist_ok=True)
|
||||
async with aiofiles.open(file_path, "wb") as f:
|
||||
while chunk := await request.content.read(1024):
|
||||
@ -195,9 +207,11 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
abs_path = pathlib.Path(full_path)
|
||||
relative_path = str(full_path.relative_to(request["home"]))
|
||||
|
||||
href_path = f"{relative_path}".strip("/")
|
||||
# href_path = href_path.replace("./","/")
|
||||
|
||||
href_path = f"{self.relative_url}/{relative_path}".strip(".")
|
||||
href_path = href_path.replace("./","/")
|
||||
href_path = href_path.replace("//", "/")
|
||||
|
||||
response = etree.SubElement(response_xml, "{DAV:}response")
|
||||
href = etree.SubElement(response, "{DAV:}href")
|
||||
href.text = href_path
|
||||
@ -240,7 +254,7 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
etree.SubElement(lock_type_2, "{DAV:}write")
|
||||
etree.SubElement(propstat, "{DAV:}status").text = "HTTP/1.1 200 OK"
|
||||
|
||||
if abs_path.is_dir() and depth != -1:
|
||||
if abs_path.is_dir():
|
||||
for item in abs_path.iterdir():
|
||||
await self.create_node(request, response_xml, item, depth - 1)
|
||||
|
||||
@ -255,7 +269,11 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
depth = int(request.headers.get("Depth", "0"))
|
||||
except ValueError:
|
||||
pass
|
||||
|
||||
print(request)
|
||||
|
||||
requested_path = request.match_info.get("filename", "")
|
||||
|
||||
abs_path = request["home"] / requested_path
|
||||
if not abs_path.exists():
|
||||
return aiohttp.web.Response(status=404, text="Directory not found")
|
||||
@ -267,6 +285,7 @@ class WebdavApplication(aiohttp.web.Application):
|
||||
xml_output = etree.tostring(
|
||||
response_xml, encoding="utf-8", xml_declaration=True
|
||||
).decode()
|
||||
print(xml_output)
|
||||
return aiohttp.web.Response(
|
||||
status=207, text=xml_output, content_type="application/xml"
|
||||
)
|
||||
|
Loading…
Reference in New Issue
Block a user