Skip to content

Commit

Permalink
Add delay between retried requests
Browse files Browse the repository at this point in the history
  • Loading branch information
addshore committed Dec 18, 2015
1 parent b50b89d commit 16e7f7d
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 7 deletions.
1 change: 1 addition & 0 deletions RELEASENOTES.md
Expand Up @@ -2,6 +2,7 @@ These are the release notes for the [mediawiki-api-base](README.md).

## Version 2.0.1
* Retry throttled actions that return a failed-save code and anti-abuse message
* Added delay between retried requests

## Version 2.0.0 (18 December 2015)
* Added `MediawikiApi::newFromApiEndpoint` and `MediawikiApi::newFromPage`
Expand Down
24 changes: 22 additions & 2 deletions src/Guzzle/MiddlewareFactory.php
Expand Up @@ -32,10 +32,30 @@ public function setLogger( LoggerInterface $logger ) {
}

/**
* @access private
*
* @param bool $delay default to true, can be false to speed up tests
*
* @return callable
*/
public function retry() {
return Middleware::retry( $this->newRetryDecider() );
public function retry( $delay = true ) {
if( $delay ) {
return Middleware::retry( $this->newRetryDecider(), $this->getRetryDelay() );
} else {
return Middleware::retry( $this->newRetryDecider() );
}
}

/**
* Returns a method that takes the number of retries and returns the number of miliseconds
* to wait
*
* @return callable
*/
private function getRetryDelay() {
return function( $numberOfRetries ) {
return 1000 * $numberOfRetries;
};
}

/**
Expand Down
33 changes: 28 additions & 5 deletions tests/unit/Guzzle/MiddlewareFactoryTest.php
Expand Up @@ -30,7 +30,7 @@ public function testRetriesConnectException() {
);

$handler = HandlerStack::create( $mock );
$handler->push( $middlewareFactory->retry() );
$handler->push( $middlewareFactory->retry( false ) );
$client = new Client( [ 'handler' => $handler ] );

$this->assertEquals( 200, $client->request( 'GET', '/' )->getStatusCode() );
Expand All @@ -47,7 +47,7 @@ public function testRetries500Errors() {
);

$handler = HandlerStack::create( $mock );
$handler->push( $middlewareFactory->retry() );
$handler->push( $middlewareFactory->retry( false ) );
$client = new Client( [ 'handler' => $handler ] );

$this->assertEquals( 200, $client->request( 'GET', '/' )->getStatusCode() );
Expand All @@ -66,7 +66,7 @@ public function testRetriesSomeMediawikiApiErrorHeaders() {
);

$handler = HandlerStack::create( $mock );
$handler->push( $middlewareFactory->retry() );
$handler->push( $middlewareFactory->retry( false ) );
$client = new Client( [ 'handler' => $handler ] );

$response = $client->request( 'GET', '/' );
Expand Down Expand Up @@ -96,7 +96,7 @@ public function testRetryAntiAbuseMeasure() {
);

$handler = HandlerStack::create( $mock );
$handler->push( $middlewareFactory->retry() );
$handler->push( $middlewareFactory->retry( false ) );
$client = new Client( [ 'handler' => $handler ] );

$response = $client->request( 'GET', '/' );
Expand All @@ -122,7 +122,7 @@ public function testRetryLimit() {
);

$handler = HandlerStack::create( $mock );
$handler->push( $middlewareFactory->retry() );
$handler->push( $middlewareFactory->retry( false ) );
$client = new Client( [ 'handler' => $handler ] );

$this->setExpectedException(
Expand All @@ -132,4 +132,27 @@ public function testRetryLimit() {

$client->request( 'GET', '/' )->getStatusCode();
}

public function testRetryDelay() {
$middlewareFactory = new MiddlewareFactory();

$mock = new MockHandler(
array(
new ConnectException( "+1 second delay", new Request( 'GET', 'test' ) ),
new ConnectException( "+2 second delay", new Request( 'GET', 'test' ) ),
new Response( 200 ),
)
);

$handler = HandlerStack::create( $mock );
$handler->push( $middlewareFactory->retry( true ) );
$client = new Client( [ 'handler' => $handler ] );

$startTime = time();
$client->request( 'GET', '/' )->getStatusCode();
$endTime = time();

$this->assertGreaterThan( $startTime + 2, $endTime );
}

}

0 comments on commit 16e7f7d

Please sign in to comment.