Update remaining Axios calls (#22525)

* initial commit adding put and delete operations

* change response.data => response.body

* add client response interface

* add error to interface

* add reqHeaders
This commit is contained in:
Christopher Suh
2023-03-31 12:22:31 -07:00
committed by GitHub
parent 152eb32278
commit ccd5775093
3 changed files with 102 additions and 52 deletions

View File

@@ -14,7 +14,9 @@ import { NetworkUtils } from './networkUtils';
*/
export enum HttpMethod {
GET = 'get',
POST = 'post'
POST = 'post',
PUT = 'put',
DELETE = 'delete'
}
export enum HttpStatus {
@@ -81,6 +83,40 @@ export class HttpClient implements INetworkModule {
return networkRequestViaHttps(url, HttpMethod.POST, options, this.customAgentOptions as https.AgentOptions, cancellationToken);
}
}
/**
* Http Put request
* @param url
* @param options
*/
async sendPutRequestAsync<T>(
url: string,
options?: NetworkRequestOptions,
cancellationToken?: number
): Promise<NetworkResponse<T>> {
if (this.proxyUrl) {
return networkRequestViaProxy(url, this.proxyUrl, HttpMethod.PUT, options, this.customAgentOptions as http.AgentOptions, cancellationToken);
} else {
return networkRequestViaHttps(url, HttpMethod.PUT, options, this.customAgentOptions as https.AgentOptions, cancellationToken);
}
}
/**
* Http Delete request
* @param url
* @param options
*/
async sendDeleteRequestAsync<T>(
url: string,
options?: NetworkRequestOptions
): Promise<NetworkResponse<T>> {
if (this.proxyUrl) {
return networkRequestViaProxy(url, this.proxyUrl, HttpMethod.DELETE, options, this.customAgentOptions as http.AgentOptions);
} else {
return networkRequestViaHttps(url, HttpMethod.DELETE, options, this.customAgentOptions as https.AgentOptions);
}
}
}
const networkRequestViaProxy = <T>(
@@ -114,7 +150,7 @@ const networkRequestViaProxy = <T>(
// compose a request string for the socket
let postRequestStringContent: string = '';
if (httpMethod === HttpMethod.POST) {
if (httpMethod === HttpMethod.POST || httpMethod === HttpMethod.PUT) {
const body = options?.body || '';
postRequestStringContent =
'Content-Type: application/x-www-form-urlencoded\r\n' +
@@ -247,6 +283,7 @@ const networkRequestViaHttps = <T>(
timeout?: number
): Promise<NetworkResponse<T>> => {
const isPostRequest = httpMethod === HttpMethod.POST;
const isPutRequest = httpMethod === HttpMethod.PUT;
const body: string = options?.body || '';
const url = new URL(urlString);
const optionHeaders = options?.headers || {} as Record<string, string>;
@@ -264,7 +301,7 @@ const networkRequestViaHttps = <T>(
customOptions.agent = new https.Agent(agentOptions);
}
if (isPostRequest) {
if (isPostRequest || isPutRequest) {
// needed for post request to work
customOptions.headers = {
...customOptions.headers,

View File

@@ -5,7 +5,6 @@
import { ResourceGraphClient } from '@azure/arm-resourcegraph';
import { TokenCredentials } from '@azure/ms-rest-js';
import axios, { AxiosRequestConfig, AxiosResponse } from 'axios';
import * as azdata from 'azdata';
import { AzureRestResponse, GetResourceGroupsResult, GetSubscriptionsResult, ResourceQueryResult, GetBlobContainersResult, GetFileSharesResult, HttpRequestMethod, GetLocationsResult, GetManagedDatabasesResult, CreateResourceGroupResult, GetBlobsResult, GetStorageAccountAccessKeyResult, AzureAccount, azureResource, AzureAccountProviderMetadata } from 'azurecore';
import { EOL } from 'os';
@@ -18,9 +17,19 @@ import { AzureResourceGroupService } from './providers/resourceGroup/resourceGro
import { BlobServiceClient, StorageSharedKeyCredential } from '@azure/storage-blob';
import providerSettings from '../account-provider/providerSettings';
import * as Constants from '../constants';
import { getProxyEnabledHttpClient } from '../utils';
import { HttpClient } from '../account-provider/auths/httpClient';
import { NetworkRequestOptions } from '@azure/msal-common';
const localize = nls.loadMessageBundle();
export interface HttpClientResponse {
body: any;
headers: any;
status: Number;
error: any;
}
function getErrorMessage(error: Error | string): string {
return (error instanceof Error) ? error.message : error;
}
@@ -162,7 +171,7 @@ export async function getLocations(appContext: AppContext, account?: AzureAccoun
const path = `/subscriptions/${subscription.id}/locations?api-version=2020-01-01`;
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
result.locations.push(...response.response.data.value);
result.locations.push(...response.response.body.value);
result.errors.push(...response.errors);
} catch (err) {
const error = new Error(localize('azure.accounts.getLocations.queryError', "Error fetching locations for account {0} ({1}) subscription {2} ({3}) tenant {4} : {5}",
@@ -341,6 +350,7 @@ export async function getSelectedSubscriptions(appContext: AppContext, account?:
*/
export async function makeHttpRequest(account: AzureAccount, subscription: azureResource.AzureResourceSubscription, path: string, requestType: HttpRequestMethod, requestBody?: any, ignoreErrors: boolean = false, host: string = 'https://management.azure.com', requestHeaders: { [key: string]: string } = {}): Promise<AzureRestResponse> {
const result: AzureRestResponse = { response: {}, errors: [] };
const httpClient: HttpClient = getProxyEnabledHttpClient();
if (!account?.properties?.tenants || !Array.isArray(account.properties.tenants)) {
const error = new Error(invalidAzureAccount);
@@ -380,15 +390,15 @@ export async function makeHttpRequest(account: AzureAccount, subscription: azure
return result;
}
const reqHeaders = {
let reqHeaders = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${securityToken.token}`,
...requestHeaders
};
}
const config: AxiosRequestConfig = {
let networkRequestOptions: NetworkRequestOptions = {
headers: reqHeaders,
validateStatus: () => true // Never throw
body: requestBody
};
// Adding '/' if path does not begin with it.
@@ -403,19 +413,23 @@ export async function makeHttpRequest(account: AzureAccount, subscription: azure
requestUrl = `${account.properties.providerSettings.settings.armResource.endpoint}${path}`;
}
let response: AxiosResponse | undefined;
let response;
switch (requestType) {
case HttpRequestMethod.GET:
response = await axios.get(requestUrl, config);
response = await httpClient.sendGetRequestAsync<any>(requestUrl, {
headers: reqHeaders
});
break;
case HttpRequestMethod.POST:
response = await axios.post(requestUrl, requestBody, config);
response = await httpClient.sendPostRequestAsync<HttpClientResponse>(requestUrl, networkRequestOptions);
break;
case HttpRequestMethod.PUT:
response = await axios.put(requestUrl, requestBody, config);
response = await httpClient.sendPutRequestAsync<HttpClientResponse>(requestUrl, networkRequestOptions);
break;
case HttpRequestMethod.DELETE:
response = await axios.delete(requestUrl, config);
response = await httpClient.sendDeleteRequestAsync<any>(requestUrl, {
headers: reqHeaders
});
break;
default:
const error = new Error(`Unknown RequestType "${requestType}"`);
@@ -434,9 +448,8 @@ export async function makeHttpRequest(account: AzureAccount, subscription: azure
} else if (response.status < 200 || response.status > 299) {
let errorMessage: string[] = [];
errorMessage.push(response.status.toString());
errorMessage.push(response.statusText);
if (response.data && response.data.error) {
errorMessage.push(`${response.data.error.code} : ${response.data.error.message}`);
if (response.body && response.body.error) {
errorMessage.push(`${response.body.error.code} : ${response.body.error.message}`);
}
const error = new Error(errorMessage.join(EOL));
if (!ignoreErrors) {
@@ -455,7 +468,7 @@ export async function getManagedDatabases(account: AzureAccount, subscription: a
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
return {
databases: response?.response?.data?.value ?? [],
databases: response?.response?.body?.value ?? [],
errors: response.errors ? response.errors : []
};
}
@@ -465,7 +478,7 @@ export async function getBlobContainers(account: AzureAccount, subscription: azu
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
return {
blobContainers: response?.response?.data?.value ?? [],
blobContainers: response?.response?.body?.value ?? [],
errors: response.errors ? response.errors : []
};
}
@@ -475,7 +488,7 @@ export async function getFileShares(account: AzureAccount, subscription: azureRe
const host = getProviderMetadataForAccount(account).settings.armResource.endpoint;
const response = await makeHttpRequest(account, subscription, path, HttpRequestMethod.GET, undefined, ignoreErrors, host);
return {
fileShares: response?.response?.data?.value ?? [],
fileShares: response?.response?.body?.value ?? [],
errors: response.errors ? response.errors : []
};
}