IIRC there's a OnError and a OnFailure event handler for the Request.JSON class: the one is for catching connection timeouts, while the other can catch parse errors, including 40x return code responses.
...
It's a bit tricky is the one originates from Request while the other originates from Request.JSON if you dig in and RTFC of mootools. That's how I found out about this earlier, anyway. :-)
...
cvtXHRerror2msg: function(xmlHttpRequest) {
var status = xmlHttpRequest.status;
var orsc = xmlHttpRequest.onreadystatechange;
var response = (xmlHttpRequest.responseText || this.language['backend.unidentified_error']);
var text = response.substitute(this.language, /\\?\$\{([^{}]+)\}/g);
return text;
},
....
// filemanager.request is just an slightly augmented Request.JSON derivative class;
// filebrowser.showError() shows the human-readable error response, when one occurs.
FileManager.Request = new Class({
Extends: Request.JSON,
options:
{
secure: true, // Isn't this true by default anyway in REQUEST.JSON?
fmDisplayErrors: true // Automatically display errors - ** your onSuccess still gets called, just ignore if it's an error **
},
initialize: function(options, filebrowser) {
this.parent(options);
this.options.data = Object.merge({}, filebrowser.options.propagateData, this.options.data);
if (this.options.fmDisplayErrors)
{
this.addEvents({
success: function(j)
{
if (!j)
{
filebrowser.showError();
}
else if (!j.status)
{
filebrowser.showError(('' + j.error).substitute(filebrowser.language, /\\?\$\{([^{}]+)\}/g));
}
}.bind(this),
error: function(text, error)
{
filebrowser.showError(text);
},
failure: function(xmlHttpRequest)
{
var text = filebrowser.cvtXHRerror2msg(xmlHttpRequest);
filebrowser.showError(text);
}
});
}
this.addEvents({
request: filebrowser.onRequest.bind(filebrowser),
complete: filebrowser.onComplete.bind(filebrowser),
success: filebrowser.onSuccess.bind(filebrowser),
error: filebrowser.onError.bind(filebrowser),
failure: filebrowser.onFailure.bind(filebrowser)
});
}
});
Server-side PHP has blurbs like these to send 'useful' error texts with 40x responses, here a 403:
/**
* Process the 'download' event
*
* Send the file content of the specified file for download by the client.
* Only files residing within the directory tree rooted by the
* 'basedir' (options['URLpath4FileManagedDirTree']) will be allowed to be downloaded.
*
* Expected parameters:
*
* $_POST['file'] filepath of the file to be downloaded
*
* $_POST['filter'] optional mimetype filter string, amy be the part up to and
* including the slash '/' or the full mimetype. Only files
* matching this (set of) mimetypes will be listed.
* Examples: 'image/' or 'application/zip'
*
* On errors a HTTP 403 error response will be sent instead.
*/
protected function onDownload()
{
$emsg = null;
$file_arg = null;
$file = null;
$jserr = array(
'status' => 1
);
try
{
if (!$this->options['download'])
throw new FileManagerException('disabled:download');
[... doing stuff ...]
$this->sendHttpHeaders($hdrs);
fpassthru($fd);
fclose($fd);
return;
}
$emsg = 'read_error';
}
catch(FileManagerException $e)
{
$emsg = $e->getMessage();
}
catch(Exception $e)
{
// catching other severe failures; since this can be anything and should only happen in the direst of circumstances, we don't bother translating
$emsg = $e->getMessage();
}
// we don't care whether it's a 404, a 403 or something else entirely: we feed 'em a 403 and that's final!
send_response_status_header(403);
$this->modify_json4exception($jserr, $emsg, 'file = ' . $this->mkSafe4Display($file_arg . ', destination path = ' . $file));
$this->sendHttpHeaders('Content-Type: text/plain'); // Safer for iframes: the 'application/json' mime type would cause FF3.X to pop up a save/view dialog when transmitting these error reports!
// when we fail here, it's pretty darn bad and nothing to it.
// just push the error JSON and go.
echo json_encode($jserr);
}
--
Met vriendelijke groeten / Best regards,
Ger Hobbelt
--------------------------------------------------
web:
http://www.hobbelt.com/ http://www.hebbut.net/
mail:
g...@hobbelt.commobile: +31-6-11 120 978
--------------------------------------------------