v5.0-git
--------
+[mms] When generating and sending compressed ZIP data, use server-side temp
+ streams to minimize memory usage.
[mms] Decode bodypart data on server if possible (RFC 3516).
[mms] Use PHP temporary streams when working with message body data to reduce
memory usage (Request #3359).
if (!empty($folder_list)) {
$mbox = $imp_folder->generateMbox($folder_list);
if ($actionID == 'download_folder') {
- $browser->downloadHeaders($folder_list[0] . '.mbox', null, false, strlen($mbox));
+ $data = $mbox;
+ fseek($data, 0, SEEK_END);
+ $browser->downloadHeaders($folder_list[0] . '.mbox', null, false, ftell($data));
} else {
$horde_compress = Horde_Compress::factory('zip');
try {
- $mbox = $horde_compress->compress(array(array('data' => $mbox, 'name' => $folder_list[0] . '.mbox')));
+ $data = $horde_compress->compress(array(array('data' => $mbox, 'name' => $folder_list[0] . '.mbox')), array('stream' => true));
+ fclose($mbox);
} catch (Horde_Exception $e) {
+ fclose($mbox);
$notification->push($e, 'horde.error');
break;
}
- $browser->downloadHeaders($folder_list[0] . '.zip', 'application/zip', false, strlen($mbox));
+ fseek($data, 0, SEEK_END);
+ $browser->downloadHeaders($folder_list[0] . '.zip', 'application/zip', false, ftell($data));
}
- echo $mbox;
+ rewind($data);
+ fpassthru($data);
exit;
}
break;
* @param array $folder_list A list of folder names to generate a mbox
* file for (UTF7-IMAP).
*
- * @return string An mbox format mailbox file.
+ * @return resource A stream resource containing the text of a mbox
+ * format mailbox file.
*/
public function generateMbox($folder_list)
{
- $body = '';
+ $body = fopen('php://temp', 'r+');
if (empty($folder_list)) {
return $body;
foreach ($folder_list as $folder) {
try {
- $status = $GLOBALS['imp_imap']->status($folder, Horde_Imap_Client::STATUS_MESSAGES);
+ $status = $GLOBALS['imp_imap']->ob->status($folder, Horde_Imap_Client::STATUS_MESSAGES);
} catch (Horde_Imap_Client_Exception $e) {
continue;
}
* overhead. */
try {
$res = $GLOBALS['imp_imap']->ob->fetch($folder, array(
- Horde_Imap_Client::FETCH_FULLMSG => array('peek' => true),
+ Horde_Imap_Client::FETCH_FULLMSG => array('peek' => true, 'stream' => true),
Horde_Imap_Client::FETCH_ENVELOPE => true,
Horde_Imap_Client::FETCH_DATE => true,
), array('ids' => array($i), 'sequence' => true));
/* We need this long command since some MUAs (e.g. pine)
* require a space in front of single digit days. */
$date = sprintf('%s %2s %s', $ptr['date']->format('D M'), $ptr['date']->format('j'), $ptr['date']->format('H:i:s Y'));
- $body .= 'From ' . $from . ' ' . $date . "\r\n" .
- $ptr['fullmsg'] . "\r\n";
+ fwrite($body, 'From ' . $from . ' ' . $date . "\r\n");
+ rewind($ptr['fullmsg']);
+ stream_copy_to_stream($ptr['fullmsg'], $body);
+ fclose($ptr['fullmsg']);
+ fwrite($body, "\r\n");
}
}
/* Set up the add address icon link if contact manager is
* available. */
if (!is_null($addURL) && $link && $prefs->getValue('add_source')) {
- $add_link = $registry->link('contacts/add', array('source' => $prefs->getValue('add_source')));
- if (is_a($add_link, 'PEAR_Error')) {
+ try {
+ $registry->link('contacts/add', array('source' => $prefs->getValue('add_source')));
$add_link = $registry->hasMethod('contacts/import')
? Horde_Util::addParameter($addURL, 'actionID', 'add_address')
: null;
- }
+ } catch (Horde_Exception $e) {}
}
foreach (Horde_Mime_Address::getAddressesFromObject($addrlist) as $ob) {
if (!$name) {
$name = sprintf(_("part %s"), $val);
}
- $tosave[] = array('data' => $mime->getContents(), 'name' => $name);
+ $tosave[] = array('data' => $mime->getContents(array('stream' => true)), 'name' => $name);
}
if (!empty($tosave)) {
try {
$horde_compress = Horde_Compress::factory('zip');
- $body = $horde_compress->compress($tosave);
+ $body = $horde_compress->compress($tosave, array('stream' => true));
} catch (Horde_Exception $e) {
Horde::fatal($e);
}
- $browser->downloadHeaders($zipfile, 'application/zip', false, strlen($body));
- echo $body;
+ fseek($body, 0, SEEK_END);
+ $browser->downloadHeaders($zipfile, 'application/zip', false, ftell($body));
+ rewind($body);
+ fpassthru($body);
}
exit;
if (Horde_Util::getFormData('zip')) {
try {
$horde_compress = Horde_Compress::factory('zip');
- $body = $horde_compress->compress(array(array('data' => $mime->getContents(), 'name' => $name)));
+ $body = $horde_compress->compress(array(array('data' => $mime->getContents(), 'name' => $name)), array('stream' => true));
} catch (Horde_Exception $e) {
Horde::fatal($e);
}
break;
}
- $browser->downloadHeaders($name, $type, false, strlen($body));
if (is_resource($body)) {
+ fseek($body, 0, SEEK_END);
+ $browser->downloadHeaders($name, $type, false, ftell($body));
rewind($body);
fpassthru($body);
} else {
+ $browser->downloadHeaders($name, $type, false, strlen($body));
echo $body;
}
exit;