Log useful error messages on SSL errors in PhpHttpRequest

Work around PHP's crappy stream error handling to extract the
OpenSSL message that gives actually useful information.

Change-Id: I9eba0f90935e25e2d07995f6181fa90b7d52ea55
This commit is contained in:
Gergő Tisza 2015-09-04 23:15:03 +00:00 committed by BryanDavis
parent 82fdeb3c46
commit b020612f64

View file

@ -855,6 +855,8 @@ class CurlHttpRequest extends MWHttpRequest {
class PhpHttpRequest extends MWHttpRequest {
private $fopenErrors = array();
/**
* @param string $url
* @return string
@ -909,6 +911,16 @@ class PhpHttpRequest extends MWHttpRequest {
return $certOptions;
}
/**
* Custom error handler for dealing with fopen() errors. fopen() tends to fire multiple errors in succession, and the last one
* is completely useless (something like "fopen: failed to open stream") so normal methods of handling errors programmatically
* like get_last_error() don't work.
*/
public function errorHandler( $errno, $errstr ) {
$n = count( $this->fopenErrors ) + 1;
$this->fopenErrors += array( "errno$n" => $errno, "errstr$n" => $errstr );
}
public function execute() {
parent::execute();
@ -987,9 +999,10 @@ class PhpHttpRequest extends MWHttpRequest {
}
do {
$reqCount++;
MediaWiki\suppressWarnings();
$this->fopenErrors = array();
set_error_handler( array( $this, 'errorHandler' ) );
$fh = fopen( $url, "r", false, $context );
MediaWiki\restoreWarnings();
restore_error_handler();
if ( !$fh ) {
// HACK for instant commons.
@ -1035,6 +1048,10 @@ class PhpHttpRequest extends MWHttpRequest {
$this->setStatus();
if ( $fh === false ) {
if ( $this->fopenErrors ) {
LoggerFactory::getInstance( 'http' )->warning( __CLASS__
. ': error opening connection: {errstr1}', $this->fopenErrors );
}
$this->status->fatal( 'http-request-error' );
return $this->status;
}