|
发表于 2023-5-29 18:37:36
|
显示全部楼层
借楼问个问题,让chatgpt写了一版worker代码,挂载webdav为文件列表,但好像下载时不能获取文件大小,让他尝试修了修没用,但是直接访问toi那个网站下载就能用,但是需要账号密码。有会的大佬可以解决一下:
- addEventListener('fetch', event => {
- event.respondWith(handleRequest(event.request));
- });
- async function handleRequest(request) {
- const basicAuth = 'Basic ' + btoa('用户ID:webdav密码'); // 编码用户名和密码
- const authHeaders = { 'Authorization': basicAuth };
- const url = new URL(request.url);
- url.hostname = 'toi.teracloud.jp'; // 更新目标 URL 的主机名
- // 如果请求的路径是根路径,则将其重定向到 /dav
- if (url.pathname === '/') {
- url.pathname = '/dav';
- } else {
- // 否则,将请求的路径追加到目标 URL 的路径中
- url.pathname = '/dav' + url.pathname;
- }
- // 创建新的请求,并将 Basic Auth 头部添加到请求中
- const newRequest = new Request(url.toString(), {
- headers: { ...request.headers, ...authHeaders },
- method: request.method,
- body: request.body,
- redirect: 'follow',
- });
- // 使用 fetch 发送带有 Basic Auth 头部的请求,并获取响应
- const response = await fetch(newRequest);
- // 从响应中提取文件大小等信息,并将其添加到响应头中
- const responseHeaders = new Headers(response.headers);
- responseHeaders.set('Access-Control-Expose-Headers', 'Content-Length'); // 允许访问 Content-Length
- responseHeaders.set('Content-Length', response.headers.get('Content-Length')); // 将 Content-Length 添加到响应头中
- // 处理 WebDAV 相关响应头
- responseHeaders.delete('WWW-Authenticate'); // 删除原始响应中的 WWW-Authenticate 头部,以避免与 Workers 中的 Basic Auth 头部冲突
- // 获取响应体内容
- const responseBody = await response.text();
- // 将网页元素中的 Parent Directory 超链接从 /dav/... 替换为空文本
- const modifiedResponseBody = responseBody.replace(/\/dav\//g, '/');
- // 创建新的响应,并将响应头和修改后的响应体传递给新响应
- const newResponse = new Response(modifiedResponseBody, {
- status: response.status,
- statusText: response.statusText,
- headers: responseHeaders,
- });
- return newResponse;
- }
复制代码 |
|