function getMetadataGcp()

in lib/cloud-metadata/gcp.js [27:94]


function getMetadataGcp(
  connectTimeoutMs,
  resTimeoutMs,
  logger,
  baseUrlOverride,
  cb,
) {
  const baseUrl = baseUrlOverride || DEFAULT_BASE_URL;
  const options = {
    method: 'GET',
    timeout: resTimeoutMs,
    connectTimeout: connectTimeoutMs,
    headers: {
      'Metadata-Flavor': 'Google',
    },
  };
  const url = baseUrl + 'computeMetadata/v1/?recursive=true';
  const req = httpRequest(url, options, function (res) {
    const finalData = [];
    res.on('data', function (data) {
      finalData.push(data);
    });

    res.on('end', function (data) {
      if (res.statusCode !== 200) {
        logger.debug('gcp metadata: unexpected statusCode: %s', res.statusCode);
        cb(
          new Error(
            'error fetching gcp metadata: unexpected statusCode: ' +
              res.statusCode,
          ),
        );
        return;
      }
      // Note: We could also guard on the response having the
      // 'Metadata-Flavor: Google' header as done by:
      // https://github.com/googleapis/gcp-metadata/blob/v6.0.0/src/index.ts#L109-L112

      let result;
      try {
        result = formatMetadataStringIntoObject(finalData.join(''));
      } catch (err) {
        logger.debug(
          'gcp metadata server responded, but there was an ' +
            'error parsing the result: %o',
          err,
        );
        cb(err);
        return;
      }
      cb(null, result);
    });
  });

  req.on('timeout', function () {
    req.destroy(new Error('request to metadata server timed out'));
  });

  req.on('connectTimeout', function () {
    req.destroy(new Error('could not ping metadata server'));
  });

  req.on('error', function (err) {
    cb(err);
  });

  req.end();
}