Merge "ApiResult: Fix size checking"

This commit is contained in:
jenkins-bot 2015-09-09 23:42:49 +00:00 committed by Gerrit Code Review
commit a007bbecc2
2 changed files with 41 additions and 6 deletions

View file

@ -288,7 +288,7 @@ class ApiResult implements ApiSerializable {
* @param int $flags Zero or more OR-ed flags like OVERRIDE | ADD_ON_TOP.
*/
public static function setValue( array &$arr, $name, $value, $flags = 0 ) {
if ( !( $flags & ApiResult::NO_VALIDATE ) ) {
if ( ( $flags & ApiResult::NO_VALIDATE ) !== ApiResult::NO_VALIDATE ) {
$value = self::validateValue( $value );
}
@ -402,6 +402,11 @@ class ApiResult implements ApiSerializable {
$arr = &$this->path( $path, ( $flags & ApiResult::ADD_ON_TOP ) ? 'prepend' : 'append' );
if ( $this->checkingSize && !( $flags & ApiResult::NO_SIZE_CHECK ) ) {
// self::valueSize needs the validated value. Then flag
// to not re-validate later.
$value = self::validateValue( $value );
$flags |= ApiResult::NO_VALIDATE;
$newsize = $this->size + self::valueSize( $value );
if ( $this->maxSize !== false && $newsize > $this->maxSize ) {
/// @todo Add i18n message when replacing calls to ->setWarning()
@ -1079,14 +1084,12 @@ class ApiResult implements ApiSerializable {
* or the sum of the strlen()s of the elements if the item is an array.
* @note Once the deprecated public self::size is removed, we can rename
* this back to a less awkward name.
* @param mixed $value
* @param mixed $value Validated value (see self::validateValue())
* @return int
*/
private static function valueSize( $value ) {
$s = 0;
if ( is_array( $value ) ||
is_object( $value ) && !is_callable( array( $value, '__toString' ) )
) {
if ( is_array( $value ) ) {
foreach ( $value as $k => $v ) {
if ( !self::isMetadataKey( $s ) ) {
$s += self::valueSize( $v );
@ -1488,7 +1491,7 @@ class ApiResult implements ApiSerializable {
*/
public static function size( $value ) {
wfDeprecated( __METHOD__, '1.25' );
return self::valueSize( $value );
return self::valueSize( self::validateValue( $value ) );
}
/**

View file

@ -181,6 +181,19 @@ class ApiResultTest extends MediaWikiTestCase {
);
}
ApiResult::setValue( $arr, null, NAN, ApiResult::NO_VALIDATE );
try {
ApiResult::setValue( $arr, null, NAN, ApiResult::NO_SIZE_CHECK );
$this->fail( 'Expected exception not thrown' );
} catch ( InvalidArgumentException $ex ) {
$this->assertSame(
'Cannot add non-finite floats to ApiResult',
$ex->getMessage(),
'Expected exception'
);
}
$arr = array();
$result2 = new ApiResult( 8388608 );
$result2->addValue( null, 'foo', 'bar' );
@ -408,6 +421,19 @@ class ApiResultTest extends MediaWikiTestCase {
);
}
$result->addValue( null, null, NAN, ApiResult::NO_VALIDATE );
try {
$result->addValue( null, null, NAN, ApiResult::NO_SIZE_CHECK );
$this->fail( 'Expected exception not thrown' );
} catch ( InvalidArgumentException $ex ) {
$this->assertSame(
'Cannot add non-finite floats to ApiResult',
$ex->getMessage(),
'Expected exception'
);
}
$result->reset();
$result->addParsedLimit( 'foo', 12 );
$this->assertSame( array(
@ -444,6 +470,12 @@ class ApiResultTest extends MediaWikiTestCase {
$result->removeValue( null, 'foo' );
$this->assertTrue( $result->addValue( null, 'foo', '1' ) );
$result = new ApiResult( 10 );
$obj = new ApiResultTestSerializableObject( 'ok' );
$obj->foobar = 'foobaz';
$this->assertTrue( $result->addValue( null, 'foo', $obj ) );
$this->assertSame( 2, $result->getSize() );
$result = new ApiResult( 8388608 );
$result2 = new ApiResult( 8388608 );
$result2->addValue( null, 'foo', 'bar' );