From: Aaron Schulz Date: Thu, 7 Nov 2013 00:55:55 +0000 (-0800) Subject: Handle Swift JSON listings with unqualified timestamps X-Git-Tag: 1.31.0-rc.0~18259^2 X-Git-Url: http://git.cyclocoop.org/%22.%20generer_url_ecrire%28%22sites_tous%22%2C%22%22%29.%20%22?a=commitdiff_plain;h=eaa917adad163c50eaa90378db99ed1d0cb13048;p=lhc%2Fweb%2Fwiklou.git Handle Swift JSON listings with unqualified timestamps * Throw errors next time invalid timestamps are encountered Change-Id: Ie5d6c63863cacbf7dc3bc3f408b395bdce859db9 --- diff --git a/includes/Timestamp.php b/includes/Timestamp.php index edcd6a88b5..c1c64551e9 100644 --- a/includes/Timestamp.php +++ b/includes/Timestamp.php @@ -93,9 +93,9 @@ class MWTimestamp { # TS_ORACLE // session altered to DD-MM-YYYY HH24:MI:SS.FF6 $strtime = preg_replace( '/(\d\d)\.(\d\d)\.(\d\d)(\.(\d+))?/', "$1:$2:$3", str_replace( '+00:00', 'UTC', $ts ) ); - } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z$/', $ts, $da ) ) { + } elseif ( preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) { # TS_ISO_8601 - } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z$/', $ts, $da ) ) { + } elseif ( preg_match( '/^(\d{4})(\d{2})(\d{2})T(\d{2})(\d{2})(\d{2})(?:\.*\d*)?Z?$/', $ts, $da ) ) { #TS_ISO_8601_BASIC } elseif ( preg_match( '/^(\d{4})\-(\d\d)\-(\d\d) (\d\d):(\d\d):(\d\d)\.*\d*[\+\- ](\d\d)$/', $ts, $da ) ) { # TS_POSTGRES diff --git a/includes/filebackend/SwiftFileBackend.php b/includes/filebackend/SwiftFileBackend.php index db090a98ed..fc598dbd14 100644 --- a/includes/filebackend/SwiftFileBackend.php +++ b/includes/filebackend/SwiftFileBackend.php @@ -759,8 +759,8 @@ class SwiftFileBackend extends FileBackendStore { $srcObj = $contObj->get_object( $srcRel, $this->headersFromParams( $params ) ); $this->addMissingMetadata( $srcObj, $params['src'] ); $stat = array( - // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW - 'mtime' => wfTimestamp( TS_MW, $srcObj->last_modified ), + // Convert various random Swift dates to TS_MW + 'mtime' => $this->convertSwiftDate( $srcObj->last_modified, TS_MW ), 'size' => (int)$srcObj->content_length, 'sha1' => $srcObj->getMetadataValue( 'Sha1base36' ) ); @@ -774,6 +774,21 @@ class SwiftFileBackend extends FileBackendStore { return $stat; } + /** + * Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT"/"2013-05-11T07:37:27.678360Z". + * Dates might also come in like "2013-05-11T07:37:27.678360" from Swift listings, + * missing the timezone suffix (though Ceph RGW does not appear to have this bug). + * + * @param string $ts + * @param int $format Output format (TS_* constant) + * @return string + * @throws MWException + */ + protected function convertSwiftDate( $ts, $format = TS_MW ) { + $timestamp = new MWTimestamp( $ts ); + return $timestamp->getTimestamp( $format ); + } + /** * Fill in any missing object metadata and save it to Swift * @@ -1070,8 +1085,8 @@ class SwiftFileBackend extends FileBackendStore { $object = current( $cfObjects ); $path = "{$storageDir}/" . substr( $object->name, $suffixStart ); $val = array( - // Convert dates like "Tue, 03 Jan 2012 22:01:04 GMT" to TS_MW - 'mtime' => wfTimestamp( TS_MW, $object->last_modified ), + // Convert various random Swift dates to TS_MW + 'mtime' => $this->convertSwiftDate( $object->last_modified, TS_MW ), 'size' => (int)$object->content_length, 'latest' => false // eventually consistent );