Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. PsrTransport.php

function PsrTransport::send

@psalm-suppress ArgumentTypeCoercion

Overrides TransportInterface::send

File

vendor/open-telemetry/sdk/Common/Export/Http/PsrTransport.php, line 59

Class

PsrTransport
@psalm-template CONTENT_TYPE of string @template-implements TransportInterface<CONTENT_TYPE>

Namespace

OpenTelemetry\SDK\Common\Export\Http

Code

public function send(string $payload, ?CancellationInterface $cancellation = null) : FutureInterface {
    if ($this->closed) {
        return new ErrorFuture(new BadMethodCallException('Transport closed'));
    }
    $body = PsrUtils::encode($payload, $this->compression, $appliedEncodings);
    $request = $this->requestFactory
        ->createRequest('POST', $this->endpoint)
        ->withBody($this->streamFactory
        ->createStream($body))
        ->withHeader('Content-Type', $this->contentType);
    if ($appliedEncodings) {
        $request = $request->withHeader('Content-Encoding', $appliedEncodings);
    }
    foreach ($this->headers as $header => $value) {
        $request = $request->withAddedHeader($header, $value);
    }
    for ($retries = 0;; $retries++) {
        $response = null;
        $e = null;
        try {
            $response = $this->client
                ->sendRequest($request);
            if ($response->getStatusCode() >= 200 && $response->getStatusCode() < 300) {
                break;
            }
            if ($response->getStatusCode() >= 400 && $response->getStatusCode() < 500 && !in_array($response->getStatusCode(), [
                408,
                429,
            ], true)) {
                throw new RuntimeException($response->getReasonPhrase(), $response->getStatusCode());
            }
        } catch (NetworkExceptionInterface $e) {
        } catch (Throwable $e) {
            return new ErrorFuture($e);
        }
        if ($retries >= $this->maxRetries) {
            return new ErrorFuture(new RuntimeException('Export retry limit exceeded', 0, $e));
        }
        $delay = PsrUtils::retryDelay($retries, $this->retryDelay, $response);
        $sec = (int) $delay;
        $nsec = (int) (($delay - $sec) * 1000000000.0);
        
        /** @psalm-suppress ArgumentTypeCoercion */
        if (time_nanosleep($sec, $nsec) !== true) {
            return new ErrorFuture(new RuntimeException('Export cancelled', 0, $e));
        }
    }
    assert(isset($response));
    try {
        $body = PsrUtils::decode($response->getBody()
            ->__toString(), self::parseContentEncoding($response));
    } catch (Throwable $e) {
        return new ErrorFuture($e);
    }
    return new CompletedFuture($body);
}
RSS feed
Powered by Drupal