Fix resourcetype assignment in fromR2Object

function
This commit is contained in:
abersheeran 2023-12-06 09:43:25 +08:00
parent 337a952e81
commit f8c25a23c1

View File

@ -74,7 +74,7 @@ function fromR2Object(object: R2Object | null | undefined): DavProperties {
getcontenttype: object.httpMetadata?.contentType, getcontenttype: object.httpMetadata?.contentType,
getetag: object.etag, getetag: object.etag,
getlastmodified: object.uploaded.toUTCString(), getlastmodified: object.uploaded.toUTCString(),
resourcetype: object.key.endsWith('/') ? '<collection />' : '', resourcetype: object.customMetadata?.resourcetype ?? '',
}; };
} }
@ -111,12 +111,13 @@ export default {
let r2_objects = await bucket.list({ let r2_objects = await bucket.list({
prefix: resource_path, prefix: resource_path,
delimiter: '/', delimiter: '/',
include: ['httpMetadata', 'customMetadata'],
}); });
let page = ''; let page = '';
for (let dirname of r2_objects.delimitedPrefixes) { // for (let dirname of r2_objects.delimitedPrefixes) {
page += `<a href="${dirname}">${dirname}</a><br>`; // page += `<a href="${dirname}">${dirname}</a><br>`;
} // }
for (let object of r2_objects.objects.filter(object => !object.key.endsWith('/'))) { for (let object of r2_objects.objects) {
page += `<a href="${object.key}">${object.httpMetadata?.contentDisposition ?? object.key}</a><br>`; page += `<a href="${object.key}">${object.httpMetadata?.contentDisposition ?? object.key}</a><br>`;
} }
response = new Response(page, { status: 200, headers: { 'Content-Type': 'text/html' } }); response = new Response(page, { status: 200, headers: { 'Content-Type': 'text/html' } });
@ -203,7 +204,7 @@ export default {
break; break;
} }
resource_path = resource_path.endsWith('/') ? resource_path : resource_path + '/'; resource_path = resource_path.endsWith('/') ? resource_path.slice(0, -1) : resource_path;
// Check if the resource already exists // Check if the resource already exists
if (await bucket.head(resource_path)) { if (await bucket.head(resource_path)) {
@ -212,14 +213,17 @@ export default {
} }
// Check if the parent directory exists // Check if the parent directory exists
let parent_dir = resource_path.split('/').slice(0, -2).join("/") + '/'; let parent_dir = resource_path.split('/').slice(0, -2).join("/");
if (parent_dir !== '/' && !await bucket.head(parent_dir)) { if (parent_dir !== '' && !await bucket.head(parent_dir)) {
response = new Response('Conflict', { status: 409 }); response = new Response('Conflict', { status: 409 });
break; break;
} }
await bucket.put(resource_path, new Uint8Array(), { httpMetadata: request.headers }); await bucket.put(resource_path, new Uint8Array(), {
httpMetadata: request.headers,
customMetadata: { resourcetype: '<collection />' }
});
response = new Response('', { status: 201 }); response = new Response('', { status: 201 });
} }
break; break;
@ -289,22 +293,23 @@ export default {
prefix: resource_path, prefix: resource_path,
delimiter: '/', delimiter: '/',
cursor: cursor, cursor: cursor,
include: ['httpMetadata', 'customMetadata'],
}); });
for (let dirname of r2_objects.delimitedPrefixes) { // for (let dirname of r2_objects.delimitedPrefixes) {
page += ` // page += `
<response> // <response>
<href>${dirname}</href> // <href>${dirname}</href>
<propstat> // <propstat>
<prop> // <prop>
<resourcetype><collection /></resourcetype> // <resourcetype><collection /></resourcetype>
</prop> // </prop>
<status>HTTP/1.1 200 OK</status> // <status>HTTP/1.1 200 OK</status>
</propstat> // </propstat>
</response>`; // </response>`;
} // }
for (let object of r2_objects.objects.filter(object => !object.key.endsWith('/'))) { for (let object of r2_objects.objects) {
page += ` page += `
<response> <response>
<href>${object.key}</href> <href>${object.key}</href>