summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthomascube <thomas@roundcube.net>2007-03-01 20:40:00 +0000
committerthomascube <thomas@roundcube.net>2007-03-01 20:40:00 +0000
commitff52bee1a2c1b3f6654c8bfe41d1a3d8630e2b55 (patch)
treef05d427a343a690662bacd0f832910cbdb8d075b
parent87e2fddb32da8580f73c5ec0628e9eacfb4e0043 (diff)
Solved wrong caching of message preview (#1484153, #1484236)
-rw-r--r--CHANGELOG6
-rw-r--r--index.php8
-rw-r--r--program/include/main.inc8
-rw-r--r--program/include/rcube_shared.inc37
-rw-r--r--program/steps/mail/show.inc21
5 files changed, 57 insertions, 23 deletions
diff --git a/CHANGELOG b/CHANGELOG
index af980f40c..da194bb05 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,12 @@
CHANGELOG RoundCube Webmail
---------------------------
+2007/03/01 (thomasb)
+----------
+- Solved page caching of message preview (closes #1484153)
+- Only use gzip compression if configured (closes #1484236)
+
+
2007/02/25 (estadtherr)
----------
- Fixed priority selector issue (#1484150)
diff --git a/index.php b/index.php
index 52d6ddc50..458a11361 100644
--- a/index.php
+++ b/index.php
@@ -2,9 +2,9 @@
/*
+-----------------------------------------------------------------------+
| RoundCube Webmail IMAP Client |
- | Version 0.1-20061206 |
+ | Version 0.1-20070301 |
| |
- | Copyright (C) 2005-2006, RoundCube Dev. - Switzerland |
+ | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland |
| Licensed under the GNU GPL |
| |
| Redistribution and use in source and binary forms, with or without |
@@ -40,7 +40,7 @@
*/
-define('RCMAIL_VERSION', '0.1-20061206');
+define('RCMAIL_VERSION', '0.1-20070301');
// define global vars
$CHARSET = 'UTF-8';
@@ -106,7 +106,7 @@ if (!empty($_GET['_remote']))
if ($_action != 'get' && $_action != 'viewsource')
{
// use gzip compression if supported
- if (function_exists('ob_gzhandler') && !ini_get('zlib.output_compression'))
+ if (function_exists('ob_gzhandler') && ini_get('zlib.output_compression'))
ob_start('ob_gzhandler');
else
ob_start();
diff --git a/program/include/main.inc b/program/include/main.inc
index 7e7f216de..b19c7f412 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -190,13 +190,6 @@ function rcmail_authenticate_session()
setcookie('sessauth', rcmail_auth_hash(session_id(), $now));
}
- if (!$valid)
- write_log('timeouts',
- "REQUEST: " . var_export($_REQUEST, true) .
- "\nEXPECTED: " . rcmail_auth_hash(session_id(), $_SESSION['auth_time']) .
- "\nOR LAST: " . rcmail_auth_hash(session_id(), $_SESSION['last_auth']) .
- "\nSESSION: " . var_export($_SESSION, true));
-
return $valid;
}
@@ -559,6 +552,7 @@ function rcmail_login($user, $pass, $host=NULL)
$_SESSION['username'] = $user;
$_SESSION['user_lang'] = $sess_user_lang;
$_SESSION['password'] = encrypt_passwd($pass);
+ $_SESSION['login_time'] = mktime();
// force reloading complete list of subscribed mailboxes
rcmail_set_imap_prop();
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index ba63c825f..558fbf7d9 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -1216,17 +1216,48 @@ function send_nocacheing_headers()
// send header with expire date 30 days in future
-function send_future_expire_header()
+function send_future_expire_header($offset=2600000)
{
if (headers_sent())
return;
- header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+2600000)." GMT");
- header("Cache-Control: ");
+ header("Expires: ".gmdate("D, d M Y H:i:s", mktime()+$offset)." GMT");
+ header("Cache-Control: max-age=$offset");
header("Pragma: ");
}
+// check request for If-Modified-Since and send an according response
+function send_modified_header($mdate, $etag=null)
+{
+ if (headers_sent())
+ return;
+
+ $iscached = false;
+ if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] && strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) >= $mdate)
+ $iscached = true;
+
+ $etag = $etag ? "\"$etag\"" : null;
+ if ($etag && $_SERVER['HTTP_IF_NONE_MATCH'] == $etag)
+ $iscached = true;
+
+ if ($iscached)
+ header("HTTP/1.x 304 Not Modified");
+ else
+ header("Last-Modified: ".gmdate("D, d M Y H:i:s", $mdate)." GMT");
+
+ header("Cache-Control: max-age=0");
+ header("Expires: ");
+ header("Pragma: ");
+
+ if ($etag)
+ header("Etag: $etag");
+
+ if ($iscached)
+ exit;
+}
+
+
// function to convert an array to a javascript array
function array2js($arr, $type='')
{
diff --git a/program/steps/mail/show.inc b/program/steps/mail/show.inc
index 841a41b36..19e6e56a9 100644
--- a/program/steps/mail/show.inc
+++ b/program/steps/mail/show.inc
@@ -23,21 +23,14 @@ require_once('Mail/mimeDecode.php');
$PRINT_MODE = $_action=='print' ? TRUE : FALSE;
-// allow caching, unless remote images are present
-if ((bool)get_input_value('_safe', RCUBE_INPUT_GET))
- send_nocacheing_headers();
-else
- send_future_expire_header();
-
// similar code as in program/steps/mail/get.inc
if ($_GET['_uid'])
{
$MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET));
$MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']);
- $MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']);
// go back to list if message not found (wrong UID)
- if (!$MESSAGE['headers'] || !$MESSAGE['structure'])
+ if (!$MESSAGE['headers'])
{
show_message('messageopenerror', 'error');
if ($_action=='preview' && template_exists('messagepreview'))
@@ -49,9 +42,19 @@ if ($_GET['_uid'])
}
}
+ // calculate Etag for this request
+ $etag = md5($MESSAGE['UID'].$IMAP->get_mailbox_name().session_id().($PRINT_MODE?1:0));
+
+ // allow caching, unless remote images are present
+ if ((bool)get_input_value('_safe', RCUBE_INPUT_GET))
+ send_nocacheing_headers();
+ else
+ send_modified_header($_SESSION['login_time'], $etag);
+
+
$MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject);
- if ($MESSAGE['structure'])
+ if ($MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']))
list($MESSAGE['parts'], $MESSAGE['attachments']) = rcmail_parse_message(
$MESSAGE['structure'],
array('safe' => (bool)$_GET['_safe'],