Skip to content

Commit

Permalink
Upgrade axios for v4
Browse files Browse the repository at this point in the history
  • Loading branch information
perry-mitchell committed Sep 7, 2024
1 parent 07fbfb7 commit 55d7c2c
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 43 deletions.
46 changes: 29 additions & 17 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
},
"homepage": "https://github.com/perry-mitchell/webdav-client#readme",
"dependencies": {
"axios": "^0.27.2",
"axios": "^1.7.4",
"base-64": "^1.0.0",
"byte-length": "^1.0.2",
"fast-xml-parser": "^4.2.4",
Expand Down
38 changes: 38 additions & 0 deletions source/compat/axios.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
import { AxiosHeaders, AxiosResponse, AxiosResponseHeaders, RawAxiosResponseHeaders } from "axios";
import { Headers, Response } from "../types";

function convertAxiosHeaders(
axiosHeaders: AxiosHeaders | RawAxiosResponseHeaders | AxiosResponseHeaders | undefined
): Headers {
if (typeof axiosHeaders === "undefined") return {};
return Object.keys(axiosHeaders).reduce((output: Headers, headerName: string) => {
if (typeof axiosHeaders[headerName] === "string") {
return { ...output, [headerName]: axiosHeaders[headerName] };
} else if (Array.isArray(axiosHeaders[headerName])) {
// Take the first only
return { ...output, [headerName]: axiosHeaders[headerName][0] };
} else if (typeof axiosHeaders[headerName] === "number") {
return { ...output, [headerName]: `${axiosHeaders[headerName]}` };
} else if (typeof axiosHeaders[headerName] === "boolean") {
return { ...output, [headerName]: axiosHeaders[headerName].toString() };
} else if (axiosHeaders[headerName] instanceof AxiosHeaders) {
return {
...output,
...convertAxiosHeaders(axiosHeaders[headerName])
};
} else {
throw new Error(
`Invalid header value type: ${headerName}: ${typeof axiosHeaders[headerName]}`
);
}
}, {});
}

export function mapAxiosResponseToInterface(axiosResponse: AxiosResponse<any, any>): Response {
return {
data: axiosResponse.data,
status: axiosResponse.status,
headers: convertAxiosHeaders(axiosResponse.headers),
statusText: axiosResponse.statusText
};
}
57 changes: 32 additions & 25 deletions source/request.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import axios from "axios";
import axios, { AxiosResponse } from "axios";
import { getPatcher } from "./compat/patcher";
import { mapAxiosResponseToInterface } from "./compat/axios";
import { generateDigestAuthHeader, parseDigestAuth } from "./auth/digest";
import { cloneShallow, merge } from "./tools/merge";
import { mergeHeaders } from "./tools/headers";
Expand All @@ -12,7 +13,7 @@ import {
WebDAVMethodOptions
} from "./types";

function _request(requestOptions: RequestOptions) {
function _request(requestOptions: RequestOptions): Promise<AxiosResponse<any, any>> {
return getPatcher().patchInline(
"request",
(options: RequestOptions) => axios(options as any),
Expand Down Expand Up @@ -69,7 +70,9 @@ export function prepareRequestOptions(
export function request(requestOptions: RequestOptionsWithState): Promise<Response> {
// Client not configured for digest authentication
if (!requestOptions._digest) {
return _request(requestOptions);
return _request(requestOptions).then(axiosResponse =>
mapAxiosResponseToInterface(axiosResponse)
);
}

// Remove client's digest authentication object from request options
Expand All @@ -86,29 +89,33 @@ export function request(requestOptions: RequestOptionsWithState): Promise<Respon
}

// Perform the request and handle digest authentication
return _request(requestOptions).then(function (response: Response) {
if (response.status == 401) {
_digest.hasDigestAuth = parseDigestAuth(response, _digest);
return _request(requestOptions)
.then(axiosResponse => mapAxiosResponseToInterface(axiosResponse))
.then(function (response: Response) {
if (response.status == 401) {
_digest.hasDigestAuth = parseDigestAuth(response, _digest);

if (_digest.hasDigestAuth) {
requestOptions = merge(requestOptions, {
headers: {
Authorization: generateDigestAuthHeader(requestOptions, _digest)
}
});
if (_digest.hasDigestAuth) {
requestOptions = merge(requestOptions, {
headers: {
Authorization: generateDigestAuthHeader(requestOptions, _digest)
}
});

return _request(requestOptions).then(function (response2: Response) {
if (response2.status == 401) {
_digest.hasDigestAuth = false;
} else {
_digest.nc++;
}
return response2;
});
return _request(requestOptions)
.then(axiosResponse => mapAxiosResponseToInterface(axiosResponse))
.then(function (response2: Response) {
if (response2.status == 401) {
_digest.hasDigestAuth = false;
} else {
_digest.nc++;
}
return response2;
});
}
} else {
_digest.nc++;
}
} else {
_digest.nc++;
}
return response;
});
return response;
});
}

0 comments on commit 55d7c2c

Please sign in to comment.