2024-11-19 08:02:04 +01:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpClient ;
use Psr\Log\LoggerAwareInterface ;
use Psr\Log\LoggerInterface ;
use Symfony\Component\HttpClient\Response\ResponseStream ;
use Symfony\Component\HttpClient\Response\TraceableResponse ;
use Symfony\Component\Stopwatch\Stopwatch ;
use Symfony\Contracts\HttpClient\HttpClientInterface ;
use Symfony\Contracts\HttpClient\ResponseInterface ;
use Symfony\Contracts\HttpClient\ResponseStreamInterface ;
use Symfony\Contracts\Service\ResetInterface ;
/**
* @ author Jérémy Romey < jeremy @ free - agent . fr >
*/
final class TraceableHttpClient implements HttpClientInterface , ResetInterface , LoggerAwareInterface
{
private $client ;
private $stopwatch ;
private $tracedRequests ;
public function __construct ( HttpClientInterface $client , ? Stopwatch $stopwatch = null )
{
$this -> client = $client ;
$this -> stopwatch = $stopwatch ;
$this -> tracedRequests = new \ArrayObject ();
}
/**
* { @ inheritdoc }
*/
public function request ( string $method , string $url , array $options = []) : ResponseInterface
{
$content = null ;
$traceInfo = [];
$this -> tracedRequests [] = [
'method' => $method ,
'url' => $url ,
'options' => $options ,
'info' => & $traceInfo ,
'content' => & $content ,
];
$onProgress = $options [ 'on_progress' ] ? ? null ;
if ( false === ( $options [ 'extra' ][ 'trace_content' ] ? ? true )) {
unset ( $content );
$content = false ;
}
2024-11-19 09:59:00 +01:00
$options [ 'on_progress' ] = function ( int $dlNow , int $dlSize , array $info , ? \Closure $resolve = null ) use ( & $traceInfo , $onProgress ) {
2024-11-19 08:02:04 +01:00
$traceInfo = $info ;
if ( null !== $onProgress ) {
2024-11-19 09:59:00 +01:00
$onProgress ( $dlNow , $dlSize , $info , $resolve );
2024-11-19 08:02:04 +01:00
}
};
return new TraceableResponse ( $this -> client , $this -> client -> request ( $method , $url , $options ), $content , null === $this -> stopwatch ? null : $this -> stopwatch -> start ( " $method $url " , 'http_client' ));
}
/**
* { @ inheritdoc }
*/
public function stream ( $responses , ? float $timeout = null ) : ResponseStreamInterface
{
if ( $responses instanceof TraceableResponse ) {
$responses = [ $responses ];
} elseif ( ! is_iterable ( $responses )) {
throw new \TypeError ( sprintf ( '"%s()" expects parameter 1 to be an iterable of TraceableResponse objects, "%s" given.' , __METHOD__ , get_debug_type ( $responses )));
}
return new ResponseStream ( TraceableResponse :: stream ( $this -> client , $responses , $timeout ));
}
public function getTracedRequests () : array
{
return $this -> tracedRequests -> getArrayCopy ();
}
public function reset ()
{
if ( $this -> client instanceof ResetInterface ) {
$this -> client -> reset ();
}
$this -> tracedRequests -> exchangeArray ([]);
}
/**
* { @ inheritdoc }
*/
public function setLogger ( LoggerInterface $logger ) : void
{
if ( $this -> client instanceof LoggerAwareInterface ) {
$this -> client -> setLogger ( $logger );
}
}
/**
* { @ inheritdoc }
*/
public function withOptions ( array $options ) : self
{
$clone = clone $this ;
$clone -> client = $this -> client -> withOptions ( $options );
return $clone ;
}
}