bewcloud/pages/caldav.ts
Bruno Bernardino f50423028b
Some checks are pending
Build Docker Image / build-and-push (push) Waiting to run
Deploy / deploy (push) Waiting to run
Run Tests / test (push) Waiting to run
Implement max file upload config options and simplify request method handling
Fixes #154
Related to #155
2026-03-02 19:52:00 +00:00

80 lines
2 KiB
TypeScript

import page, { RequestHandlerParams } from '/lib/page.ts';
import { AppConfig } from '/lib/config.ts';
async function get({ request, user, match }: RequestHandlerParams) {
const calendarConfig = await AppConfig.getCalendarConfig();
if (!calendarConfig.enableCalDavServer) {
return new Response('Not Found', { status: 404 });
}
if (!user) {
return new Response('Unauthorized', {
status: 401,
headers: { 'www-authenticate': 'Basic realm="bewCloud", charset="UTF-8"' },
});
}
let { path } = match.pathname.groups;
if (!path) {
path = '/';
}
const userId = user.id;
try {
const requestBodyText = await request.clone().text();
// Remove the `/caldav/` prefix from the hrefs in the request
let parsedRequestBodyText: string | undefined = requestBodyText.replaceAll('<href>/caldav/', `<href>/`).replaceAll(
':href>/caldav/',
`:href>/`,
);
// The spec doesn't allow a body for GET or HEAD requests (and Deno fails if you try)
if (request.method === 'GET' || request.method === 'HEAD') {
parsedRequestBodyText = undefined;
}
const response = await fetch(`${calendarConfig.calDavUrl}/${path}`, {
headers: {
...Object.fromEntries(request.headers.entries()),
'X-Remote-User': `${userId}`,
},
method: request.method,
body: parsedRequestBodyText,
});
if (response.status === 204) {
return new Response(null, { status: 204 });
}
const responseBodyText = await response.clone().text();
// Add the `/caldav/` prefix to the hrefs in the response
const parsedBodyResponseText = responseBodyText.replaceAll('<href>/', `<href>/caldav/`).replaceAll(
':href>/',
`:href>/caldav/`,
);
return new Response(parsedBodyResponseText, {
status: response.status,
headers: response.headers,
});
} catch (error) {
console.error(error);
}
return new Response(null, { status: 405 });
}
export default page({
get,
put: get,
delete: get,
options: get,
catchAll: get,
accessMode: 'public',
});