in lib/apiScenario/apiScenarioRunner.ts [273:354]
private async executeRestCallStep(step: StepRestCall, env: VariableEnv) {
let host: string | undefined;
let pathPrefix = "";
if (step.isManagementPlane) {
host = env.getRequiredString("armEndpoint");
} else {
const spec = step.operation!._path._spec;
if (spec.host) {
host = `https://${spec.host}`;
} else {
const xHost = spec[xmsParameterizedHost];
if (xHost) {
host = xHost.hostTemplate.replace(pathVariableRegex, (_, p1) => `$(${p1})`);
if (xHost.useSchemePrefix === undefined || xHost.useSchemePrefix) {
host = `https://${host}`;
}
// for cases where there're path prefix after host, e.g., "{Endpoint}/language"
const pathPrefixIndex = host.search(/[^\/](\/[^\/].*)/g);
if (pathPrefixIndex >= 0) {
pathPrefix = host.substring(pathPrefixIndex + 1);
host = host.substring(0, pathPrefixIndex + 1);
}
} else {
throw new Error("Unknown host");
}
}
}
let req: ApiScenarioClientRequest = {
host,
method: step.operation!._method.toUpperCase() as HttpMethods,
path:
pathPrefix +
step.operation!._path._pathTemplate.replace(pathVariableRegex, (_, p1) => `$(${p1})`),
pathParameters: {},
headers: {},
query: {},
};
for (const p of step.operation!.parameters ?? []) {
const param = this.jsonLoader.resolveRefObj(p);
const paramVal = step.parameters[param.name];
if (paramVal === undefined) {
if (param.required) {
throw new Error(`Parameter value for "${param.name}" is not found in step: ${step.step}`);
} else {
continue;
}
}
switch (param.in) {
case "path":
req.pathParameters![param.name] = paramVal;
break;
case "query":
req.query[param.name] = paramVal;
break;
case "header":
req.headers[param.name] = paramVal;
break;
case "body":
if (param.schema?.format === "binary") {
req.file = paramVal;
} else {
req.body = paramVal;
}
break;
case "formData":
if (req.formData === undefined) {
req.formData = {};
}
req.formData[param.name] = { type: param.type, value: paramVal };
break;
default:
throw new Error(`Unknown parameter: ${param}`);
}
}
await this.client.sendRestCallRequest(req, step, env);
}