From 16666c261b6983c304c77cf898f895785a72349b Mon Sep 17 00:00:00 2001
From: Reinhold Kainhofer <reinhold@kainhofer.com>
Date: Sun, 17 Nov 2013 00:14:23 +0100
Subject: [PATCH] ersion 1.5.4: Fix large downloads,

-) Send file size in http header
-) Check if the file exists and is readable on disk
-) Don't flush the queue before trying to change the header (will break if the header was already set before)
---
 downloads_for_sale.php                        |  10 +++++-----
 downloads_for_sale/tmpl/product_compact.php   |   2 +-
 ...plg_vmcustom_downloads_for_sale_v1.5.4.zip | Bin 26477 -> 26497 bytes
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/downloads_for_sale.php b/downloads_for_sale.php
index 5738b69..d7f6ccf 100644
--- a/downloads_for_sale.php
+++ b/downloads_for_sale.php
@@ -184,16 +184,16 @@ class plgVmCustomDownloads_for_Sale extends vmCustomPlugin {
 				JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_DLSALE_ERROR_MEDIA_NOT_CONFIGURED', $media_id), 'error');
 				return false;
 			}
-			flush();
-			ob_flush();
+			if (!is_file($media->file_url) || !is_readable($media->file_url)) {
+				JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_DLSALE_ERROR_NO_FILE_SET', $media_id, $media->file_url), 'error');
+				return false;
+			}
 			header("Content-Type: " . $media->file_mimetype);
 			header("Content-Disposition: attachment; filename=\"".JFile::getName($media->file_url)."\"");
+			header("Content-Length: ".filesize($media->file_url));
 			if (@$this->readfile_chunked($media->file_url)) {
 				return true;
 			} else { 
-				header_remove("Content-Type");
-				header_remove("Content-Disposition");
-				JFactory::getApplication()->enqueueMessage(JText::sprintf('VMCUSTOM_DLSALE_ERROR_NO_FILE_SET', $media_id, $media->file_url), 'error');
 				return false;
 			}
 		} else {
diff --git a/downloads_for_sale/tmpl/product_compact.php b/downloads_for_sale/tmpl/product_compact.php
index b96ef00..ec4758f 100644
--- a/downloads_for_sale/tmpl/product_compact.php
+++ b/downloads_for_sale/tmpl/product_compact.php
@@ -11,4 +11,4 @@
  
 defined('_JEXEC') or die();
 ?>
-<p><img style="vertical-align:middle; display: inline;" src="<?php echo JURI::root().VMDLSALE_PLUGINWEBROOT.'/downloads_for_sale/assets/download_small.png'; ?>" alt=""/> <a href="<?php echo $viewData[0]; ?>"><?php echo $viewData[2]->file_title; ?></a></p>
+<p><img style="vertical-align:middle; display: inline;" src="<?php echo JURI::root().VMDLSALE_PLUGINWEBROOT.'/downloads_for_sale/assets/download_small.png'; ?>" alt=""/>&nbsp;<a href="<?php echo $viewData[0]; ?>"><?php echo $viewData[2]->file_title; ?></a></p>
diff --git a/releases/plg_vmcustom_downloads_for_sale_v1.5.4.zip b/releases/plg_vmcustom_downloads_for_sale_v1.5.4.zip
index 019ca0909ab9bc5e8e84b078318e9ddfce9237d1..61d87f92a084c4ea51b262c0575b3a30088716c7 100644
GIT binary patch
delta 6978
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
UrpZix5W_RsF<p&KDi&ld0D|Z`9RL6T

delta 6932
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
U0P~6%5L<e(XSxv^TP(;f0LcwJ5C8xG

-- 
GitLab