Daniel Kinzler has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/66245


Change subject: Handle If-Modified-Since in Special:EntityData
......................................................................

Handle If-Modified-Since in Special:EntityData

Change-Id: I23fcd3996b858383e41d0bb67980334eb35ae820
---
M repo/includes/specials/EntityDataRequestHandler.php
M repo/tests/phpunit/includes/specials/EntityDataRequestHandlerTest.php
M repo/tests/phpunit/includes/specials/SpecialEntityDataTest.php
3 files changed, 49 insertions(+), 29 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Wikibase 
refs/changes/45/66245/1

diff --git a/repo/includes/specials/EntityDataRequestHandler.php 
b/repo/includes/specials/EntityDataRequestHandler.php
index 46f5990..4b86b59 100644
--- a/repo/includes/specials/EntityDataRequestHandler.php
+++ b/repo/includes/specials/EntityDataRequestHandler.php
@@ -412,8 +412,6 @@
         */
        public function showData( WebRequest $request, OutputPage $output, 
$format, EntityId $id, $revision ) {
 
-               //TODO: handle IfModifiedSince!
-
                $prefixedId = $this->entityIdFormatter->format( $id );
                $entity = $this->entityContentFactory->getFromId( $id );
 
@@ -452,6 +450,18 @@
                        $rev = $page->getRevision();
                }
 
+               // handle If-Modified-Since
+               $imsHeader = $request->getHeader( 'IF-MODIFIED-SINCE' );
+               if ( $imsHeader !== false ) {
+                       $ims = wfTimestamp( TS_MW, $imsHeader );
+
+                       if ( $rev->getTimestamp() <= $ims ) {
+                               $response = $output->getRequest()->response();
+                               $response->header( 'Status: 304', true, 304 );
+                               return;
+                       }
+               }
+
                list( $data, $contentType ) = 
$this->serializationService->getSerializedData(
                        $format, $entity->getEntity(), $rev
                );
diff --git 
a/repo/tests/phpunit/includes/specials/EntityDataRequestHandlerTest.php 
b/repo/tests/phpunit/includes/specials/EntityDataRequestHandlerTest.php
index 431b534..6bf64e1 100644
--- a/repo/tests/phpunit/includes/specials/EntityDataRequestHandlerTest.php
+++ b/repo/tests/phpunit/includes/specials/EntityDataRequestHandlerTest.php
@@ -6,6 +6,7 @@
 use Title;
 use ValueFormatters\FormatterOptions;
 use ValueParsers\ParserOptions;
+use Wikibase\Entity;
 use Wikibase\EntityContentFactory;
 use Wikibase\EntityDataSerializationService;
 use \Wikibase\Item;
@@ -491,10 +492,34 @@
                        )
                );
 
+               // If-Modified-Since handling
+
+               // #35: IMS from the deep bast should return a 200
+               $cases[] = array(
+                       '{testitemid}.xml',      // subpage
+                       array(), // parameters
+                       array( // headers
+                               'If-Modified-Since' => wfTimestamp( TS_RFC2822, 
'20000101000000' )
+                       ),
+                       '!!', // output regex
+                       200,  // http code
+               );
+
+               // #36: IMS from now should return a 304
+               $cases[] = array(
+                       '{testitemid}.json',      // subpage
+                       array(), // parameters
+                       array( // headers
+                               'If-Modified-Since' => '{testitemtimestamp}'
+                       ),
+                       '!!', // output regex
+                       304,  // http code
+               );
+
                return $cases;
        }
 
-       protected static function injectIds( &$data, \Wikibase\Entity $entity ) 
{
+       public static function injectIds( &$data, Entity $entity ) {
                if ( is_array( $data ) ) {
                        foreach ( $data as $k => &$v ) {
                                self::injectIds( $v, $entity );
@@ -503,10 +528,11 @@
                        $data = str_replace( '{testitemid}', strtoupper( 
$entity->getId()->getPrefixedId() ), $data );
                        $data = str_replace( '{lowertestitemid}', strtolower( 
$entity->getId()->getPrefixedId() ), $data );
 
-                       if ( strpos( $data, '{testitemrev}' ) >= 0 ) {
-                               $content = 
\Wikibase\EntityContentFactory::singleton()->getFromId( $entity->getId() );
-                               $data = str_replace( '{testitemrev}', 
$content->getWikiPage()->getLatest(), $data );
-                       }
+                       $content = 
EntityContentFactory::singleton()->getFromId( $entity->getId() );
+                       $data = str_replace( '{testitemrev}', 
$content->getWikiPage()->getLatest(), $data );
+
+                       $ts = wfTimestamp( TS_RFC2822, 
$content->getWikiPage()->getTimestamp() );
+                       $data = str_replace( '{testitemtimestamp}', $ts, $data 
);
                }
        }
 
@@ -555,6 +581,7 @@
                // inject actual ID of test items
                self::injectIds( $subpage, $item );
                self::injectIds( $params, $item );
+               self::injectIds( $headers, $item );
                self::injectIds( $expRegExp, $item );
                self::injectIds( $expHeaders, $item );
 
diff --git a/repo/tests/phpunit/includes/specials/SpecialEntityDataTest.php 
b/repo/tests/phpunit/includes/specials/SpecialEntityDataTest.php
index 98b8136..0d6b3e0 100644
--- a/repo/tests/phpunit/includes/specials/SpecialEntityDataTest.php
+++ b/repo/tests/phpunit/includes/specials/SpecialEntityDataTest.php
@@ -84,24 +84,6 @@
                return $cases;
        }
 
-       protected static function injectIds( &$data, \Wikibase\Entity $entity ) 
{
-               //TODO: Same as in EntityDataRequestHandlerTest. Factor out.
-
-               if ( is_array( $data ) ) {
-                       foreach ( $data as $k => &$v ) {
-                               self::injectIds( $v, $entity );
-                       }
-               } else if ( is_string( $data ) ) {
-                       $data = str_replace( '{testitemid}', strtoupper( 
$entity->getId()->getPrefixedId() ), $data );
-                       $data = str_replace( '{lowertestitemid}', strtolower( 
$entity->getId()->getPrefixedId() ), $data );
-
-                       if ( strpos( $data, '{testitemrev}' ) >= 0 ) {
-                               $content = 
\Wikibase\EntityContentFactory::singleton()->getFromId( $entity->getId() );
-                               $data = str_replace( '{testitemrev}', 
$content->getWikiPage()->getLatest(), $data );
-                       }
-               }
-       }
-
        /**
         * @dataProvider provideExecute
         *
@@ -115,10 +97,11 @@
        public function testExecute( $subpage, $params, $headers, $expRegExp, 
$expCode = 200, $expHeaders = array() ) {
                $item = $this->getTestItem();
 
-               self::injectIds( $subpage, $item );
-               self::injectIds( $params, $item );
-               self::injectIds( $expRegExp, $item );
-               self::injectIds( $expHeaders, $item );
+               EntityDataRequestHandlerTest::injectIds( $subpage, $item );
+               EntityDataRequestHandlerTest::injectIds( $params, $item );
+               EntityDataRequestHandlerTest::injectIds( $headers, $item );
+               EntityDataRequestHandlerTest::injectIds( $expRegExp, $item );
+               EntityDataRequestHandlerTest::injectIds( $expHeaders, $item );
 
                $request = new \FauxRequest( $params );
                $request->response()->header( 'Status: 200 OK', true, 200 ); // 
init/reset

-- 
To view, visit https://gerrit.wikimedia.org/r/66245
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I23fcd3996b858383e41d0bb67980334eb35ae820
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/Wikibase
Gerrit-Branch: master
Gerrit-Owner: Daniel Kinzler <daniel.kinz...@wikimedia.de>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to