private async executeRestCallStep()

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);
  }