$this->logger = new Psr\Log\NullLogger();
$this->http = new MultiHttpClient( [
'connTimeout' => $this->timeout,
- 'reqTimeout' => $this->timeout
+ 'reqTimeout' => $this->timeout,
+ 'logger' => $this->logger
] );
}
public function setLogger( LoggerInterface $logger ) {
$this->logger = $logger;
+ $this->http->setLogger( $logger );
}
public function has( $name ) {
* @return string|bool (bool)false on failure or a string on success
*/
public static function request( $method, $url, $options = [], $caller = __METHOD__ ) {
- wfDebug( "HTTP: $method: $url\n" );
+ $logger = LoggerFactory::getInstance( 'http' );
+ $logger->debug( "$method: $url" );
$options['method'] = strtoupper( $method );
return $req->getContent();
} else {
$errors = $status->getErrorsByType( 'error' );
- $logger = LoggerFactory::getInstance( 'http' );
$logger->warning( Status::wrap( $status )->getWikiText( false, false, 'en' ),
[ 'error' => $errors, 'caller' => $caller, 'content' => $req->getContent() ] );
return false;
return "";
}
+
+ /**
+ * Get a configured MultiHttpClient
+ * @param array $options
+ */
+ public static function createMultiClient( $options = [] ) {
+ global $wgHTTPConnectTimeout, $wgHTTPTimeout, $wgHTTPProxy;
+
+ return new MultiHttpClient( $options + [
+ 'connTimeout' => $wgHTTPConnectTimeout,
+ 'reqTimeout' => $wgHTTPTimeout,
+ 'userAgent' => self::userAgent(),
+ 'proxy' => $wgHTTPProxy,
+ 'logger' => LoggerFactory::getInstance( 'http' )
+ ] );
+ }
}
* @file
*/
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
+
/**
* Class to handle concurrent HTTP requests
*
* @author Aaron Schulz
* @since 1.23
*/
-class MultiHttpClient {
+class MultiHttpClient implements LoggerAwareInterface {
/** @var resource */
protected $multiHandle = null; // curl_multi handle
/** @var string|null SSL certificates path */
protected $proxy;
/** @var string */
protected $userAgent = 'wikimedia/multi-http-client v1.0';
+ /** @var LoggerInterface */
+ protected $logger;
/**
* @param array $options
}
}
static $opts = [
- 'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost', 'proxy', 'userAgent'
+ 'connTimeout', 'reqTimeout', 'usePipelining', 'maxConnsPerHost',
+ 'proxy', 'userAgent', 'logger'
];
foreach ( $opts as $key ) {
if ( isset( $options[$key] ) ) {
$this->$key = $options[$key];
}
}
+ if ( $this->logger === null ) {
+ $this->logger = new NullLogger;
+ }
}
/**
} elseif ( !isset( $req['url'] ) ) {
throw new Exception( "Request has no 'url' field set." );
}
+ $this->logger->debug( "{$req['method']}: {$req['url']}" );
$req['query'] = isset( $req['query'] ) ? $req['query'] : [];
$headers = []; // normalized headers
if ( isset( $req['headers'] ) ) {
if ( function_exists( 'curl_strerror' ) ) {
$req['response']['error'] .= " " . curl_strerror( $errno );
}
+ $this->logger->warning( "Error fetching URL \"{$req['url']}\": " .
+ $req['response']['error'] );
}
} else {
$req['response']['error'] = "(curl error: no status set)";
return $this->multiHandle;
}
+ /**
+ * Register a logger
+ *
+ * @param LoggerInterface
+ */
+ public function setLogger( LoggerInterface $logger ) {
+ $this->logger = $logger;
+ }
+
function __destruct() {
if ( $this->multiHandle ) {
curl_multi_close( $this->multiHandle );