thomascube
2012-05-01 a9c1b877889aea93214a3635be6e652ba74e9f05
Better handling of HTTP request errors; re-send keep-alive requests on failure (#1488449)
5 files modified
45 ■■■■ changed files
program/include/rcmail.php 2 ●●● patch | view | raw | blame | history
program/js/app.js 40 ●●●●● patch | view | raw | blame | history
program/localization/de_CH/messages.inc 1 ●●●● patch | view | raw | blame | history
program/localization/de_DE/messages.inc 1 ●●●● patch | view | raw | blame | history
program/localization/en_US/messages.inc 1 ●●●● patch | view | raw | blame | history
program/include/rcmail.php
@@ -556,7 +556,7 @@
    $this->output->set_charset(RCMAIL_CHARSET);
    // add some basic labels to client
    $this->output->add_label('loading', 'servererror');
    $this->output->add_label('loading', 'servererror', 'requesttimedout');
    return $this->output;
  }
program/js/app.js
@@ -54,9 +54,10 @@
  // set jQuery ajax options
  $.ajaxSetup({
    cache:false,
    error:function(request, status, err){ ref.http_error(request, status, err); },
    beforeSend:function(xmlhttp){ xmlhttp.setRequestHeader('X-Roundcube-Request', ref.env.request_token); }
    cache: false,
    timeout: this.env.request_timeout * 1000,
    error: function(request, status, err){ ref.http_error(request, status, err); },
    beforeSend: function(xmlhttp){ xmlhttp.setRequestHeader('X-Roundcube-Request', ref.env.request_token); }
  });
  // set environment variable(s)
@@ -954,8 +955,6 @@
        form.action = this.add_url(form.action, '_lang', lang);
        form.submit();
        // clear timeout (sending could take longer)
        clearTimeout(this.request_timer);
        break;
      case 'send-attachment':
@@ -1157,14 +1156,6 @@
    if (this.gui_objects.editform)
      this.lock_form(this.gui_objects.editform, a);
    // clear pending timer
    if (this.request_timer)
      clearTimeout(this.request_timer);
    // set timer for requests
    if (a && this.env.request_timeout)
      this.request_timer = setTimeout(function(){ ref.request_timed_out(); }, this.env.request_timeout * 1000);
    return id;
  };
@@ -1201,13 +1192,6 @@
      url = this.env.comm_path;
    return url.replace(/_task=[a-z]+/, '_task='+task);
  };
  // called when a request timed out
  this.request_timed_out = function()
  {
    this.set_busy(false);
    this.display_message('Request timed out!', 'error');
  };
  this.reload = function(delay)
@@ -5974,7 +5958,7 @@
    return $.ajax({
      type: 'GET', url: url, data: { _unlock:(lock?lock:0) }, dataType: 'json',
      success: function(data){ ref.http_response(data); },
      error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }
      error: function(o, status, err) { ref.http_error(o, status, err, lock, action); }
    });
  };
@@ -6006,7 +5990,7 @@
    return $.ajax({
      type: 'POST', url: url, data: postdata, dataType: 'json',
      success: function(data){ ref.http_response(data); },
      error: function(o, status, err) { rcmail.http_error(o, status, err, lock); }
      error: function(o, status, err) { ref.http_error(o, status, err, lock, action); }
    });
  };
@@ -6138,7 +6122,7 @@
  };
  // handle HTTP request errors
  this.http_error = function(request, status, err, lock)
  this.http_error = function(request, status, err, lock, action)
  {
    var errmsg = request.statusText;
@@ -6147,6 +6131,16 @@
    if (request.status && errmsg)
      this.display_message(this.get_label('servererror') + ' (' + errmsg + ')', 'error');
    else if (status == 'timeout')
      this.display_message(this.get_label('requesttimedout'), 'error');
    else if (request.status == 0 && status != 'abort')
      this.display_message(this.get_label('servererror') + ' (No connection)', 'error');
    // re-send keep-alive requests after 30 seconds
    if (action == 'keep-alive')
      setTimeout(function(){ ref.keep_alive(); }, 30000);
    else if (action == 'check-recent')
      setTimeout(function(){ ref.check_for_recent(false); }, 30000);
  };
  // post the given form to a hidden iframe
program/localization/de_CH/messages.inc
@@ -23,6 +23,7 @@
$messages['servererror'] = 'Serverfehler!';
$messages['servererrormsg'] = 'Serverfehler: $msg';
$messages['dberror'] = 'Datenbankfehler!';
$messages['requesttimedout'] = 'Zeitlimit überschritten';
$messages['errorreadonly'] = 'Die Aktion kann nicht ausgeführt werden. Der Ordner ist schreibgeschützt.';
$messages['errornoperm'] = 'Die Aktion kann nicht ausgeführt werden. Zugriff verweigert.';
$messages['invalidrequest'] = 'Ungültige Anfrage! Es wurden keine Daten gespeichert.';
program/localization/de_DE/messages.inc
@@ -23,6 +23,7 @@
$messages['servererror'] = 'Serverfehler!';
$messages['servererrormsg'] = 'Serverfehler: $msg';
$messages['dberror'] = 'Datenbankfehler!';
$messages['requesttimedout'] = 'Zeitlimit überschritten';
$messages['errorreadonly'] = 'Die Aktion kann nicht ausgeführt werden. Der Ordner ist schreibgeschützt.';
$messages['errornoperm'] = 'Die Aktion kann nicht ausgeführt werden. Zugriff verweigert.';
$messages['invalidrequest'] = 'Ungültige Anfrage! Es wurden keine Daten gespeichert.';
program/localization/en_US/messages.inc
@@ -29,6 +29,7 @@
$messages['servererror'] = 'Server Error!';
$messages['servererrormsg'] = 'Server Error: $msg';
$messages['dberror'] = 'Database Error!';
$messages['requesttimedout'] = 'Request timed out';
$messages['errorreadonly'] = 'Unable to perform operation. Folder is read-only.';
$messages['errornoperm'] = 'Unable to perform operation. Permission denied.';
$messages['invalidrequest'] = 'Invalid request! No data was saved.';