Fix PROPFIND /

This commit is contained in:
abersheeran 2023-12-11 17:30:15 +08:00
parent 55d561b789
commit 0e6f45e368

View File

@ -319,41 +319,43 @@ export default {
} }
break; break;
case '1': { case '1': {
let object = await bucket.head(resource_path); if (resource_path !== "") {
if (object === null && resource_path.endsWith('/')) { let object = await bucket.head(resource_path);
object = await bucket.head(resource_path.slice(0, -1)); if (object === null && resource_path.endsWith('/')) {
} object = await bucket.head(resource_path.slice(0, -1));
}
if (object === null) { if (object === null) {
response = new Response('Not Found', { status: 404 }); response = new Response('Not Found', { status: 404 });
break; break;
} }
if (object.customMetadata?.resourcetype !== '<collection />') { if (object.customMetadata?.resourcetype !== '<collection />') {
let page = `<?xml version="1.0" encoding="utf-8"?> let page = `<?xml version="1.0" encoding="utf-8"?>
<multistatus xmlns="DAV:"> <multistatus xmlns="DAV:">
<response> <response>
<href>/${resource_path}</href> <href>/${resource_path}</href>
<propstat> <propstat>
<prop> <prop>
${Object.entries(fromR2Object(object)) ${Object.entries(fromR2Object(object))
.filter(([_, value]) => value !== undefined) .filter(([_, value]) => value !== undefined)
.map(([key, value]) => `<${key}>${value}</${key}>`) .map(([key, value]) => `<${key}>${value}</${key}>`)
.join('\n ') .join('\n ')
} }
</prop> </prop>
<status>HTTP/1.1 200 OK</status> <status>HTTP/1.1 200 OK</status>
</propstat> </propstat>
</response> </response>
</multistatus> </multistatus>
`; `;
response = new Response(page, { response = new Response(page, {
status: 207, status: 207,
headers: { headers: {
'Content-Type': 'text/xml', 'Content-Type': 'text/xml',
}, },
}); });
break; break;
}
} }
let page = `<?xml version="1.0" encoding="utf-8"?> let page = `<?xml version="1.0" encoding="utf-8"?>
@ -362,7 +364,7 @@ export default {
let cursor: string | undefined = undefined; let cursor: string | undefined = undefined;
do { do {
var r2_objects = await bucket.list({ var r2_objects = await bucket.list({
prefix: resource_path.endsWith('/') ? resource_path : resource_path + '/', prefix: resource_path.endsWith('/') || resource_path === "" ? resource_path : resource_path + '/',
delimiter: '/', delimiter: '/',
cursor: cursor, cursor: cursor,
include: ['httpMetadata', 'customMetadata'], include: ['httpMetadata', 'customMetadata'],
@ -400,41 +402,43 @@ export default {
} }
break; break;
case 'infinity': { case 'infinity': {
let object = await bucket.head(resource_path); if (resource_path !== "") {
if (object === null && resource_path.endsWith('/')) { let object = await bucket.head(resource_path);
object = await bucket.head(resource_path.slice(0, -1)); if (object === null && resource_path.endsWith('/')) {
} object = await bucket.head(resource_path.slice(0, -1));
}
if (object === null) { if (object === null) {
response = new Response('Not Found', { status: 404 }); response = new Response('Not Found', { status: 404 });
break; break;
} }
if (object.customMetadata?.resourcetype !== '<collection />') { if (object.customMetadata?.resourcetype !== '<collection />') {
let page = `<?xml version="1.0" encoding="utf-8"?> let page = `<?xml version="1.0" encoding="utf-8"?>
<multistatus xmlns="DAV:"> <multistatus xmlns="DAV:">
<response> <response>
<href>/${resource_path}</href> <href>/${resource_path}</href>
<propstat> <propstat>
<prop> <prop>
${Object.entries(fromR2Object(object)) ${Object.entries(fromR2Object(object))
.filter(([_, value]) => value !== undefined) .filter(([_, value]) => value !== undefined)
.map(([key, value]) => `<${key}>${value}</${key}>`) .map(([key, value]) => `<${key}>${value}</${key}>`)
.join('\n ') .join('\n ')
} }
</prop> </prop>
<status>HTTP/1.1 200 OK</status> <status>HTTP/1.1 200 OK</status>
</propstat> </propstat>
</response> </response>
</multistatus> </multistatus>
`; `;
response = new Response(page, { response = new Response(page, {
status: 207, status: 207,
headers: { headers: {
'Content-Type': 'text/xml', 'Content-Type': 'text/xml',
}, },
}); });
break; break;
}
} }
let page = `<?xml version="1.0" encoding="utf-8"?> let page = `<?xml version="1.0" encoding="utf-8"?>
@ -443,7 +447,7 @@ export default {
let cursor: string | undefined = undefined; let cursor: string | undefined = undefined;
do { do {
var r2_objects = await bucket.list({ var r2_objects = await bucket.list({
prefix: resource_path.endsWith('/') ? resource_path : resource_path + '/', prefix: resource_path.endsWith('/') || resource_path === "" ? resource_path : resource_path + '/',
cursor: cursor, cursor: cursor,
include: ['httpMetadata', 'customMetadata'], include: ['httpMetadata', 'customMetadata'],
}); });