in sdk/core/core-client/src/serviceClient.ts [133:229]
async sendOperationRequest<T>(
operationArguments: OperationArguments,
operationSpec: OperationSpec,
): Promise<T> {
const endpoint: string | undefined = operationSpec.baseUrl || this._endpoint;
if (!endpoint) {
throw new Error(
"If operationSpec.baseUrl is not specified, then the ServiceClient must have a endpoint string property that contains the base URL to use.",
);
}
// Templatized URLs sometimes reference properties on the ServiceClient child class,
// so we have to pass `this` below in order to search these properties if they're
// not part of OperationArguments
const url = getRequestUrl(endpoint, operationSpec, operationArguments, this);
const request: OperationRequest = createPipelineRequest({
url,
});
request.method = operationSpec.httpMethod;
const operationInfo = getOperationRequestInfo(request);
operationInfo.operationSpec = operationSpec;
operationInfo.operationArguments = operationArguments;
const contentType = operationSpec.contentType || this._requestContentType;
if (contentType && operationSpec.requestBody) {
request.headers.set("Content-Type", contentType);
}
const options = operationArguments.options;
if (options) {
const requestOptions = options.requestOptions;
if (requestOptions) {
if (requestOptions.timeout) {
request.timeout = requestOptions.timeout;
}
if (requestOptions.onUploadProgress) {
request.onUploadProgress = requestOptions.onUploadProgress;
}
if (requestOptions.onDownloadProgress) {
request.onDownloadProgress = requestOptions.onDownloadProgress;
}
if (requestOptions.shouldDeserialize !== undefined) {
operationInfo.shouldDeserialize = requestOptions.shouldDeserialize;
}
if (requestOptions.allowInsecureConnection) {
request.allowInsecureConnection = true;
}
}
if (options.abortSignal) {
request.abortSignal = options.abortSignal;
}
if (options.tracingOptions) {
request.tracingOptions = options.tracingOptions;
}
}
if (this._allowInsecureConnection) {
request.allowInsecureConnection = true;
}
if (request.streamResponseStatusCodes === undefined) {
request.streamResponseStatusCodes = getStreamingResponseStatusCodes(operationSpec);
}
try {
const rawResponse = await this.sendRequest(request);
const flatResponse = flattenResponse(
rawResponse,
operationSpec.responses[rawResponse.status],
) as T;
if (options?.onResponse) {
options.onResponse(rawResponse, flatResponse);
}
return flatResponse;
} catch (error: any) {
if (typeof error === "object" && error?.response) {
const rawResponse = error.response;
const flatResponse = flattenResponse(
rawResponse,
operationSpec.responses[error.statusCode] || operationSpec.responses["default"],
);
error.details = flatResponse;
if (options?.onResponse) {
options.onResponse(rawResponse, flatResponse, error);
}
}
throw error;
}
}