From 6a009b93cbbde1388e17eb88fe603f952bfcd389 Mon Sep 17 00:00:00 2001 From: fyears <1142836+fyears@users.noreply.github.com> Date: Mon, 1 Jan 2024 00:43:59 +0800 Subject: [PATCH] fix webdav for new er --- src/remoteForWebdav.ts | 111 ++++++++++++++++++----------------------- 1 file changed, 49 insertions(+), 62 deletions(-) diff --git a/src/remoteForWebdav.ts b/src/remoteForWebdav.ts index d305e11..e9f517c 100644 --- a/src/remoteForWebdav.ts +++ b/src/remoteForWebdav.ts @@ -15,16 +15,16 @@ import type { FileStat, WebDAVClient, RequestOptionsWithState, - Response, - ResponseDataDetailed, + // Response, + // ResponseDataDetailed, } from "webdav"; -import { getPatcher } from "webdav"; + +// @ts-ignore +import { getPatcher } from "webdav/dist/web/index.js"; if (VALID_REQURL) { getPatcher().patch( "request", - async ( - options: RequestOptionsWithState - ): Promise> => { + async (options: RequestOptionsWithState): Promise => { const transformedHeaders = { ...options.headers }; delete transformedHeaders["host"]; delete transformedHeaders["Host"]; @@ -37,80 +37,65 @@ if (VALID_REQURL) { headers: transformedHeaders, }); - let r2: Response | ResponseDataDetailed = undefined; - if ((options as any).responseType === undefined) { - r2 = { - data: undefined, + let contentType: string | undefined = + r.headers["Content-Type"] || + r.headers["content-type"] || + options.headers["Content-Type"] || + options.headers["content-type"] || + options.headers["Accept"] || + options.headers["accept"]; + if (contentType !== undefined) { + contentType = contentType.toLowerCase(); + } + // console.log(`contentType=${contentType}`) + + let r2: Response = undefined; + if (contentType.includes("xml")) { + r2 = new Response(r.text, { status: r.status, statusText: getReasonPhrase(r.status), headers: r.headers, - }; - } else if ((options as any).responseType === "json") { - r2 = { - data: r.json, + }); + } else if ( + contentType.includes("json") || + contentType.includes("javascript") + ) { + r2 = new Response(r.json, { status: r.status, statusText: getReasonPhrase(r.status), headers: r.headers, - }; - } else if ((options as any).responseType === "text") { - r2 = { - data: r.text, + }); + } else if (contentType.includes("text")) { + // avoid text/json, + // so we split this out from the above xml or json branch + r2 = new Response(r.text, { status: r.status, statusText: getReasonPhrase(r.status), headers: r.headers, - }; - } else if ((options as any).responseType === "arraybuffer") { - r2 = { - data: r.arrayBuffer, + }); + } else if ( + contentType.includes("octet-stream") || + contentType.includes("binary") || + contentType.includes("buffer") + ) { + // application/octet-stream + r2 = new Response(r.arrayBuffer, { status: r.status, statusText: getReasonPhrase(r.status), headers: r.headers, - }; + }); } else { throw Error( - `do not know how to deal with responseType = ${ - (options as any).responseType - }` + `do not know how to deal with requested content type = ${contentType}` ); } return r2; } ); } -// getPatcher().patch("request", (options: any) => { -// // console.log("using fetch"); -// const r = fetch(options.url, { -// method: options.method, -// body: options.data as any, -// headers: options.headers, -// signal: options.signal, -// }) -// .then((rsp) => { -// if (options.responseType === undefined) { -// return Promise.all([undefined, rsp]); -// } -// if (options.responseType === "json") { -// return Promise.all([rsp.json(), rsp]); -// } -// if (options.responseType === "text") { -// return Promise.all([rsp.text(), rsp]); -// } -// if (options.responseType === "arraybuffer") { -// return Promise.all([rsp.arrayBuffer(), rsp]); -// } -// }) -// .then(([d, r]) => { -// return { -// data: d, -// status: r.status, -// statusText: r.statusText, -// headers: r.headers, -// }; -// }); -// // console.log("using fetch"); -// return r; -// }); -import { AuthType, BufferLike, createClient } from "webdav"; + +// @ts-ignore +import { AuthType, BufferLike, createClient } from "webdav/dist/web/index.js"; export type { WebDAVClient } from "webdav"; export const DEFAULT_WEBDAV_CONFIG = { @@ -234,8 +219,9 @@ export class WrappedWebdavClient { method: "PROPFIND", headers: { Depth: "infinity", + Accept: "text/plain,application/xml", }, - responseType: "text", + // responseType: "text", } as any); if (res.status === 403) { throw Error("not support Infinity, get 403"); @@ -255,8 +241,9 @@ export class WrappedWebdavClient { method: "PROPFIND", headers: { Depth: "1", + Accept: "text/plain,application/xml", }, - responseType: "text", + // responseType: "text", } as any ); testPassed = true;