/** @var array callable|bool Override these in the base class */
protected $oldFileFactoryKey = false;
+ /** @var string URL of where to proxy thumb.php requests to.
+ * Example: http://127.0.0.1:8888/wiki/dev/thumb/
+ */
+ protected $thumbProxyUrl;
+ /** @var string Secret key to pass as an X-Swift-Secret header to the proxied thumb service */
+ protected $thumbProxySecret;
+
/**
* @param array|null $info
* @throws MWException
$optionalSettings = [
'descBaseUrl', 'scriptDirUrl', 'articleUrl', 'fetchDescription',
'thumbScriptUrl', 'pathDisclosureProtection', 'descriptionCacheExpiry',
- 'scriptExtension', 'favicon'
+ 'scriptExtension', 'favicon', 'thumbProxyUrl', 'thumbProxySecret'
];
foreach ( $optionalSettings as $var ) {
if ( isset( $info[$var] ) ) {
return $this->thumbScriptUrl;
}
+ /**
+ * Get the URL thumb.php requests are being proxied to
+ *
+ * @return string
+ */
+ public function getThumbProxyUrl() {
+ return $this->thumbProxyUrl;
+ }
+
+ /**
+ * Get the secret key for the proxied thumb service
+ *
+ * @return string
+ */
+ public function getThumbProxySecret() {
+ return $this->thumbProxySecret;
+ }
+
/**
* Returns true if the repository can transform files via a 404 handler
*
return;
}
- list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
+ $thumbProxyUrl = $img->getRepo()->getThumbProxyUrl();
+
+ if ( strlen( $thumbProxyUrl ) ) {
+ wfProxyThumbnailRequest( $img, $thumbName );
+ // No local fallback when in proxy mode
+ return;
+ } else {
+ // Generate the thumbnail locally
+ list( $thumb, $errorMsg ) = wfGenerateThumbnail( $img, $params, $thumbName, $thumbPath );
+ }
/** @var MediaTransformOutput|MediaTransformError|bool $thumb */
}
}
+/**
+ * Proxies thumbnail request to a service that handles thumbnailing
+ *
+ * @param File $img
+ * @param string $thumbName
+ */
+function wfProxyThumbnailRequest( $img, $thumbName ) {
+ $thumbProxyUrl = $img->getRepo()->getThumbProxyUrl();
+
+ // Instead of generating the thumbnail ourselves, we proxy the request to another service
+ $thumbProxiedUrl = $thumbProxyUrl . $img->getThumbRel( $thumbName );
+
+ $req = MWHttpRequest::factory( $thumbProxiedUrl );
+ $secret = $img->getRepo()->getThumbProxySecret();
+
+ // Pass a secret key shared with the proxied service if any
+ if ( strlen( $secret ) ) {
+ $req->setHeader( 'X-Swift-Secret', $secret );
+ }
+
+ // Send request to proxied service
+ $status = $req->execute();
+
+ // Simply serve the response from the proxied service as-is
+ header( 'HTTP/1.1 ' . $req->getStatus() );
+
+ $headers = $req->getResponseHeaders();
+
+ foreach ( $headers as $key => $values ) {
+ foreach ( $values as $value ) {
+ header( $key . ': ' . $value, false );
+ }
+ }
+
+ echo $req->getContent();
+}
+
/**
* Actually try to generate a new thumbnail
*