public function callSSEApi()

in php/src/OpenApiClient.php [1487:1678]


  public function callSSEApi($params, $request, $runtime)
  {
    $_runtime = [
      'key' => ''.($runtime->key ? $runtime->key : $this->_key),
      'cert' => ''.($runtime->cert ? $runtime->cert : $this->_cert),
      'ca' => ''.($runtime->ca ? $runtime->ca : $this->_ca),
      'readTimeout' => (($runtime->readTimeout ? $runtime->readTimeout : $this->_readTimeout) + 0),
      'connectTimeout' => (($runtime->connectTimeout ? $runtime->connectTimeout : $this->_connectTimeout) + 0),
      'httpProxy' => ''.($runtime->httpProxy ? $runtime->httpProxy : $this->_httpProxy),
      'httpsProxy' => ''.($runtime->httpsProxy ? $runtime->httpsProxy : $this->_httpsProxy),
      'noProxy' => ''.($runtime->noProxy ? $runtime->noProxy : $this->_noProxy),
      'socks5Proxy' => ''.($runtime->socks5Proxy ? $runtime->socks5Proxy : $this->_socks5Proxy),
      'socks5NetWork' => ''.($runtime->socks5NetWork ? $runtime->socks5NetWork : $this->_socks5NetWork),
      'maxIdleConns' => (($runtime->maxIdleConns ? $runtime->maxIdleConns : $this->_maxIdleConns) + 0),
      'retryOptions' => $this->_retryOptions,
      'ignoreSSL' => $runtime->ignoreSSL,
      'tlsMinVersion' => $this->_tlsMinVersion,
    ];

    $_retriesAttempted = 0;
    $_lastRequest = null;
    $_lastResponse = null;
    $_context = new RetryPolicyContext([
      'retriesAttempted' => $_retriesAttempted,
    ]);
    while (Dara::shouldRetry($_runtime['retryOptions'], $_context)) {
      if ($_retriesAttempted > 0) {
        $_backoffTime = Dara::getBackoffDelay($_runtime['retryOptions'], $_context);
        if ($_backoffTime > 0) {
          Dara::sleep($_backoffTime);
        }
      }

      $_retriesAttempted++;
      try {
        $_request = new Request();
        $_request->protocol = ''.($this->_protocol ? $this->_protocol : $params->protocol);
        $_request->method = $params->method;
        $_request->pathname = $params->pathname;
        $globalQueries = [ ];
        $globalHeaders = [ ];
        if (!is_null($this->_globalParameters)) {
          $globalParams = $this->_globalParameters;
          if (!is_null($globalParams->queries)) {
            $globalQueries = $globalParams->queries;
          }

          if (!is_null($globalParams->headers)) {
            $globalHeaders = $globalParams->headers;
          }

        }

        $extendsHeaders = [ ];
        $extendsQueries = [ ];
        if (!is_null($runtime->extendsParameters)) {
          $extendsParameters = $runtime->extendsParameters;
          if (!is_null($extendsParameters->headers)) {
            $extendsHeaders = $extendsParameters->headers;
          }

          if (!is_null($extendsParameters->queries)) {
            $extendsQueries = $extendsParameters->queries;
          }

        }

        $_request->query = Dara::merge([
        ], $globalQueries, $extendsQueries, $request->query);
        // endpoint is setted in product client
        $_request->headers = Dara::merge([
          'host' => $this->_endpoint,
          'x-acs-version' => $params->version,
          'x-acs-action' => $params->action,
          'user-agent' => Utils::getUserAgent($this->_userAgent),
          'x-acs-date' => Utils::getTimestamp(),
          'x-acs-signature-nonce' => Utils::getNonce(),
          'accept' => 'application/json',
        ], $extendsHeaders, $globalHeaders, $request->headers);
        if ($params->style == 'RPC') {
          $headers = $this->getRpcHeaders();
          if (!is_null($headers)) {
            $_request->headers = Dara::merge([
            ], $_request->headers, $headers);
          }

        }

        $signatureAlgorithm = ''.($this->_signatureAlgorithm ? $this->_signatureAlgorithm : 'ACS3-HMAC-SHA256');
        $hashedRequestPayload = Utils::hash(BytesUtil::from('', 'utf-8'), $signatureAlgorithm);
        if (!is_null($request->stream)) {
          $tmp = StreamUtil::readAsBytes($request->stream);
          $hashedRequestPayload = Utils::hash($tmp, $signatureAlgorithm);
          $_request->body = $tmp;
          @$_request->headers['content-type'] = 'application/octet-stream';
        } else {
          if (!is_null($request->body)) {
            if ($params->reqBodyType == 'byte') {
              $byteObj = unpack('C*', $request->body);
              $hashedRequestPayload = Utils::hash($byteObj, $signatureAlgorithm);
              $_request->body = $byteObj;
            } else if ($params->reqBodyType == 'json') {
              $jsonObj = json_encode($request->body, JSON_UNESCAPED_UNICODE + JSON_UNESCAPED_SLASHES);
              $hashedRequestPayload = Utils::hash(StringUtil::toBytes($jsonObj, 'utf8'), $signatureAlgorithm);
              $_request->body = $jsonObj;
              @$_request->headers['content-type'] = 'application/json; charset=utf-8';
            } else {
              $m = $request->body;
              $formObj = Utils::toForm($m);
              $hashedRequestPayload = Utils::hash(StringUtil::toBytes($formObj, 'utf8'), $signatureAlgorithm);
              $_request->body = $formObj;
              @$_request->headers['content-type'] = 'application/x-www-form-urlencoded';
            }

          }

        }

        @$_request->headers['x-acs-content-sha256'] = bin2hex(BytesUtil::toString($hashedRequestPayload));
        if ($params->authType != 'Anonymous') {
          $credentialModel = $this->_credential->getCredential();
          if (!is_null($credentialModel->providerName)) {
            @$_request->headers['x-acs-credentials-provider'] = $credentialModel->providerName;
          }

          $authType = $credentialModel->type;
          if ($authType == 'bearer') {
            $bearerToken = $credentialModel->bearerToken;
            @$_request->headers['x-acs-bearer-token'] = $bearerToken;
          } else {
            $accessKeyId = $credentialModel->accessKeyId;
            $accessKeySecret = $credentialModel->accessKeySecret;
            $securityToken = $credentialModel->securityToken;
            if (!is_null($securityToken) && $securityToken != '') {
              @$_request->headers['x-acs-accesskey-id'] = $accessKeyId;
              @$_request->headers['x-acs-security-token'] = $securityToken;
            }

            @$_request->headers['Authorization'] = Utils::getAuthorization($_request, $signatureAlgorithm, bin2hex(BytesUtil::toString($hashedRequestPayload)), $accessKeyId, $accessKeySecret);
          }

        }

        $_runtime['stream'] = true;
        $_response = Dara::send($_request, $_runtime);
        $_lastRequest = $_request;
        $_lastResponse = $_response;

        if (($_response->statusCode >= 400) && ($_response->statusCode < 600)) {
          $err = [ ];
          if (!is_null(@$_response->headers['content-type']) && @$_response->headers['content-type'] == 'text/xml;charset=utf-8') {
            $_str = StreamUtil::readAsString($_response->body);
            $respMap = XML::parseXml($_str, null);
            $err = @$respMap['Error'];
          } else {
            $_res = StreamUtil::readAsJSON($_response->body);
            $err = $_res;
          }

          @$err['statusCode'] = $_response->statusCode;
          throw new DaraException([
            'code' => '' . (string)(@$err['Code'] ? @$err['Code'] : @$err['code']) . '',
            'message' => 'code: ' . (string)$_response->statusCode . ', ' . (string)(@$err['Message'] ? @$err['Message'] : @$err['message']) . ' request id: ' . (string)(@$err['RequestId'] ? @$err['RequestId'] : @$err['requestId']) . '',
            'data' => $err,
            'description' => '' . (string)(@$err['Description'] ? @$err['Description'] : @$err['description']) . '',
            'accessDeniedDetail' => (@$err['AccessDeniedDetail'] ? @$err['AccessDeniedDetail'] : @$err['accessDeniedDetail']),
          ]);
        }

        $events = StreamUtil::readAsSSE($_response->body);

        foreach($events as $event) {
          yield new SSEResponse([
            'statusCode' => $_response->statusCode,
            'headers' => $_response->headers,
            'event' => $event,
          ]);
        }
        return null;
      } catch (DaraException $e) {
        $_context = new RetryPolicyContext([
          'retriesAttempted' => $_retriesAttempted,
          'lastRequest' => $_lastRequest,
          'lastResponse' => $_lastResponse,
          'exception' => $e,
        ]);
        continue;
      }
    }

    throw new DaraUnableRetryException($_context);
  }