Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
aigem committed Sep 11, 2024
1 parent e014ed3 commit eed7863
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 27 deletions.
12 changes: 6 additions & 6 deletions output.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ def export_files(files, output_file):
# "tsconfig.json",
# "src/utils/templates.ts",
# "package.json",
"src/index.ts",
"src/types.ts",
"src/handlers/requestHandler.ts",
# "src/index.ts",
# "src/types.ts",
# "src/handlers/requestHandler.ts",
"src/handlers/webdavHandler.ts",
"src/utils/auth.ts",
"src/utils/cors.ts",
"src/utils/logger.ts",
# "src/utils/auth.ts",
# "src/utils/cors.ts",
# "src/utils/logger.ts",
"src/utils/webdavUtils.ts"
]

Expand Down
18 changes: 11 additions & 7 deletions src/handlers/webdavHandler.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { listAll, fromR2Object, make_resource_path, generatePropfindResponse } from '../utils/webdavUtils';
import { listAll, fromR2Object, make, generatePropfindResponse } from '../utils/webdavUtils';
import { logger } from '../utils/logger';
import { WebDAVProps } from '../types';

Expand Down Expand Up @@ -36,7 +36,8 @@ export async function handleWebDAV(request: Request, bucket: R2Bucket, bucketNam
});
}
} catch (error) {
logger.error("Error in WebDAV handling:",return new Response("Internal Server Error", { status: 500 });
logger.error("Error in WebDAV handling:", error);
return new Response("Internal Server Error", { status: 500 });
}
}

Expand All @@ -48,7 +49,10 @@ function handleOptions(): Response {
DAV: DAV_CLASS
}
});
} function handleHead(request: Request, bucket: R2Bucket): Promise<Response> { resource_path = make_resource_path(request);
}

async function handleHead(request: Request, bucket: R2Bucket): Promise<Response> {
const resource_path = make_resource_path(request);
const object = await bucket.head(resource_path);

if (!object) {
Expand Down Expand Up @@ -77,7 +81,7 @@ async function handleGet(request: Request, bucket: R2Bucket): Promise<Response>
return new Response(object.body, {
status: 200,
headers: {
"Content-Type": object.httpMetadata?.contentType ?? "application/oc
"Content-Type": object.httpMetadata?.contentType ?? "application/octet-stream",
"Content-Length": object.size.toString(),
"ETag": object.etag,
"Last-Modified": object.uploaded.toUTCString()
Expand All @@ -92,7 +96,7 @@ async function handlePut(request: Request, bucket: R2Bucket): Promise<Response>
const body = await request.arrayBuffer();
await bucket.put(resource_path, body, {
httpMetadata: {
contentType: request.headers.get("Content-Type") || "application/octet-stream",
contentType: request.headers.get("Content-Type") || "application/oc
},
});
return new Response("Created", { status: 201 });
Expand All @@ -114,7 +118,7 @@ async function handleDelete(request: Request, bucket: R2Bucket): Promise<Respons
}
}

async function handleMkcol(request: Request, bucket: R2Bucket): Promise<Response> {
async function handleM: Request, bucket: R2Bucket): Promise<Response> {
const resource_path = make_resource_path(request);

if (resource_path === "") {
Expand Down Expand Up @@ -214,6 +218,6 @@ async function handleMove(request: Request, bucket: R2Bucket): Promise<Response>
return new Response("No Content", { status: 204 });
} catch (error) {
logger.error("Error in MOVE:", error);
return new Response("Internal Server Error", { status: 500 });
Internal Server Error", { status: 500 });
}
}
28 changes: 14 additions & 14 deletions src/utils/webdavUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,21 @@ export async function* listAll(bucket: R2Bucket, prefix: string, isRecursive = f
yield object;
}
for (const prefix of r2_objects.delimitedPrefixes) {
yield { key: prefix, customMetadata: { resourcetype: 'collection' } as R2Object;
yield { key: prefix, customMetadata: { resourcetype: 'collection' } } as R2Object;
}
cursor = r2_objects.truncated ? r2_objects.cursor : undefined;
cursor = r2_objects.truncd ? r2_objects.cursor : undefined;
} while (cursor);
}

export function fromR2Object(object: R2Object, bucketName: string): WebDAVProps {
const isCollection = object.key.endsWith('/') || object.customMetadata?.resourcetype === 'collection';
const displayName = object.key.split('/').pop() || object.key;
return: `/${bucobject.key}${isCollection ? '/' : ''}`,
return {
href: `/${bucketName}/${object.key}${isCollection ? '/' : ''}`,
creationdate: object.uploaded?.toISOString() || new Date().toISOString(),
displayname: displayName,
getcontentlanguage: object.httpMetadata?.contentLanguage || '',
getcontentlength: isCollection ? object.size?.toString() || '0',
getcontentlength: isCollection ? '0' : object.size?.toString() || '0',
getcontenttype: isCollection ? 'httpd/unix-directory' : (object.httpMetadata?.contentType || 'application/octet-stream'),
getetag: object.etag || `"${new Date().getTime().toString(16)}"`,
getlastmodified: object.uploaded?.toUTCString() || new Date().toUTCString(),
Expand All @@ -49,16 +50,17 @@ ${props.map(prop => generatePropResponse(prop)).join('\n')}

function generatePropResponse(prop: WebDAVProps): string {
return ` <D:response>
<D:href>${prop.href}</D:href>
<D:href>${escapeXml(prop.href)}</D:href>
<D:propstat>
<D:prop>
<D:creationdate>${prop.creationdate}</D:creationdate>
<D:displayname>${prop.displayname}</D:displayname>
<D:getcontentlanguage>${prop.getcontentlanguage}</D:getcontentlanguage>
<D:displayname>${escapeXml(prop.displayname)}</D:displayname>
<D:getcontentlanguage>${escapeXml(prop.getcontentlanguage)}</D:getcontentlanguage>
<D:getcontentlength>${prop.getcontentlength}</D:getcontentlength>
<D:getcontenttype>${prop.getcontenttype}</D:getcontenttype>
<D:getetag>${prop.getetag}</D:getetag>
<D:getlastmodified>${prop.getlastmodified}</D:getlastmodified>resourcetype>${prop.resourcetype === ? '<D:collection/>' : ''}</D:resourcetype>
<D:getcontenttype>${escapeXml(prop.getcontenttype)}</D:getcontenttype>
<D:getetag>${escapeXml(prop.getet:getetag>
<D:getlastmodified>${prop.getlastmodified}</D:getlastmodified>
<D:resourcetype>${prop.resourcetype === 'collection' ? '<D:collection/>' : ''}</D:resourcetype>
<D:supportedlock>
<D:lockentry>
<D:lockscope><D:exclusive/></D:lockscope>
Expand All @@ -68,16 +70,14 @@ function generatePropResponse(prop: WebDAVProps): string {
<D:lockscope><D:shared/></D:lockscope>
<D:locktype><D:write/></D:locktype>
</D:lockentry>
</D:
</D:supportedlock>
</D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>`;
}

// Helper function to escape XML special characters
function escapeXml(unsafe: string): string {
return unsafe.replace(/[<>&'"]/g, function (c) {
function escapeXml(unsafe: string): string {replace(/[<>&'"]/g, function (c) {
switch (c) {
case '<': return '&lt;';
case '>': return '&gt;';
Expand Down

0 comments on commit eed7863

Please sign in to comment.