This commit is contained in:
Andrew Stegmaier 2023-07-06 14:55:54 -04:00
Родитель 3b57cdf3f4
Коммит 2dcf244dab
4 изменённых файлов: 4 добавлений и 76 удалений

Просмотреть файл

@ -1,7 +1,6 @@
// Copyright (c) Microsoft Corporation. All rights reserved. // Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information. // Licensed under the MIT License. See License.txt in the project root for license information.
import * as tough from "tough-cookie";
import * as http from "http"; import * as http from "http";
import * as https from "https"; import * as https from "https";
import node_fetch from "node-fetch"; import node_fetch from "node-fetch";
@ -17,8 +16,6 @@ import { WebResourceLike } from "./webResource";
import { createProxyAgent, ProxyAgent } from "./proxyAgent"; import { createProxyAgent, ProxyAgent } from "./proxyAgent";
export class NodeFetchHttpClient extends FetchHttpClient { export class NodeFetchHttpClient extends FetchHttpClient {
private readonly cookieJar = new tough.CookieJar(undefined, { looseMode: true });
async fetch(input: CommonRequestInfo, init?: CommonRequestInit): Promise<CommonResponse> { async fetch(input: CommonRequestInfo, init?: CommonRequestInit): Promise<CommonResponse> {
return (node_fetch(input, init) as unknown) as Promise<CommonResponse>; return (node_fetch(input, init) as unknown) as Promise<CommonResponse>;
} }
@ -26,20 +23,6 @@ export class NodeFetchHttpClient extends FetchHttpClient {
async prepareRequest(httpRequest: WebResourceLike): Promise<Partial<RequestInit>> { async prepareRequest(httpRequest: WebResourceLike): Promise<Partial<RequestInit>> {
const requestInit: Partial<RequestInit & { agent?: any }> = {}; const requestInit: Partial<RequestInit & { agent?: any }> = {};
if (this.cookieJar && !httpRequest.headers.get("Cookie")) {
const cookieString = await new Promise<string>((resolve, reject) => {
this.cookieJar!.getCookieString(httpRequest.url, (err, cookie) => {
if (err) {
reject(err);
} else {
resolve(cookie);
}
});
});
httpRequest.headers.set("Cookie", cookieString);
}
if (httpRequest.agentSettings) { if (httpRequest.agentSettings) {
const { http: httpAgent, https: httpsAgent } = httpRequest.agentSettings; const { http: httpAgent, https: httpsAgent } = httpRequest.agentSettings;
if (httpsAgent && httpRequest.url.startsWith("https")) { if (httpsAgent && httpRequest.url.startsWith("https")) {
@ -71,25 +54,8 @@ export class NodeFetchHttpClient extends FetchHttpClient {
return requestInit; return requestInit;
} }
async processRequest(operationResponse: HttpOperationResponse): Promise<void> { async processRequest(_operationResponse: HttpOperationResponse): Promise<void> {
if (this.cookieJar) { /* no_op */
const setCookieHeader = operationResponse.headers.get("Set-Cookie"); return;
if (setCookieHeader != undefined) {
await new Promise((resolve, reject) => {
this.cookieJar!.setCookie(
setCookieHeader,
operationResponse.request.url,
{ ignoreError: true },
(err) => {
if (err) {
reject(err);
} else {
resolve();
}
}
);
});
}
}
} }
} }

Просмотреть файл

@ -55,7 +55,6 @@
"abort-controller": "^3.0.0", "abort-controller": "^3.0.0",
"form-data": "^2.5.0", "form-data": "^2.5.0",
"node-fetch": "^2.6.7", "node-fetch": "^2.6.7",
"tough-cookie": "^3.0.1",
"tslib": "^1.10.0", "tslib": "^1.10.0",
"tunnel": "0.0.6", "tunnel": "0.0.6",
"uuid": "^8.3.2", "uuid": "^8.3.2",
@ -78,7 +77,6 @@
"@types/node-fetch": "^2.3.7", "@types/node-fetch": "^2.3.7",
"@types/semver": "^6.0.1", "@types/semver": "^6.0.1",
"@types/sinon": "^7.0.13", "@types/sinon": "^7.0.13",
"@types/tough-cookie": "^2.3.5",
"@types/trusted-types": "^2.0.0", "@types/trusted-types": "^2.0.0",
"@types/tunnel": "0.0.1", "@types/tunnel": "0.0.1",
"@types/uuid": "^8.3.2", "@types/uuid": "^8.3.2",

Просмотреть файл

@ -199,7 +199,7 @@ export class DefaultHttpClient extends FetchHttpClient {
// (undocumented) // (undocumented)
prepareRequest(httpRequest: WebResourceLike): Promise<Partial<RequestInit>>; prepareRequest(httpRequest: WebResourceLike): Promise<Partial<RequestInit>>;
// (undocumented) // (undocumented)
processRequest(operationResponse: HttpOperationResponse): Promise<void>; processRequest(_operationResponse: HttpOperationResponse): Promise<void>;
} }
// @public // @public

Просмотреть файл

@ -11,11 +11,8 @@ import { RestError } from "../lib/restError";
import { isNode } from "../lib/util/utils"; import { isNode } from "../lib/util/utils";
import { WebResource, HttpRequestBody, TransferProgressEvent } from "../lib/webResource"; import { WebResource, HttpRequestBody, TransferProgressEvent } from "../lib/webResource";
import { getHttpMock, HttpMockFacade } from "./mockHttp"; import { getHttpMock, HttpMockFacade } from "./mockHttp";
import { TestFunction } from "mocha";
import { CommonResponse } from "../lib/fetchHttpClient"; import { CommonResponse } from "../lib/fetchHttpClient";
const nodeIt = (isNode ? it : it.skip) as TestFunction;
function getAbortController(): AbortController { function getAbortController(): AbortController {
let controller: AbortController; let controller: AbortController;
if (typeof AbortController === "function") { if (typeof AbortController === "function") {
@ -98,39 +95,6 @@ describe("defaultHttpClient", function () {
} }
}); });
nodeIt("should not overwrite a user-provided cookie (nodejs only)", async function () {
// Cookie is only allowed to be set by the browser based on an actual response Set-Cookie header
httpMock.get("http://my.fake.domain/set-cookie", {
status: 200,
headers: {
"Set-Cookie": "data=123456",
},
});
httpMock.get("http://my.fake.domain/cookie", async (_url, _method, _body, headers) => {
return {
status: 200,
headers: headers,
};
});
const client = getMockedHttpClient();
const request1 = new WebResource("http://my.fake.domain/set-cookie");
const response1 = await client.sendRequest(request1);
response1.headers.get("Set-Cookie")!.should.equal("data=123456");
const request2 = new WebResource("http://my.fake.domain/cookie");
const response2 = await client.sendRequest(request2);
response2.headers.get("Cookie")!.should.equal("data=123456");
const request3 = new WebResource("http://my.fake.domain/cookie", "GET", undefined, undefined, {
Cookie: "data=abcdefg",
});
const response3 = await client.sendRequest(request3);
response3.headers.get("Cookie")!.should.equal("data=abcdefg");
});
it("should allow canceling multiple requests with one token", async function () { it("should allow canceling multiple requests with one token", async function () {
httpMock.post("/fileupload", async () => { httpMock.post("/fileupload", async () => {
await sleep(1000); await sleep(1000);