fix empty json-response caused by some non-utf8 content in response, eg. broken mail password

This commit is contained in:
Ralf Becker 2014-09-04 16:03:11 +00:00
parent e438ed281e
commit ec049a5977

View File

@ -571,14 +571,20 @@ class egw_json_response
/* Wrap the result array into a parent "response" Object */ /* Wrap the result array into a parent "response" Object */
$res = array('response' => $inst->responseArray); $res = array('response' => $inst->responseArray);
return json_encode($res); //PHP5.3+, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP); return self::json_encode($res); //PHP5.3+, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_QUOT | JSON_HEX_AMP);
} }
/**
* More fault-tollerant version of json_encode removing everything that does not json_encode eg. because not utf-8
*
* @param mixed $var
* @return string
*/
public function json_encode($var) public function json_encode($var)
{ {
$ret = json_encode($var); $ret = json_encode($var);
if (($err = json_last_error())) if ($ret === false && ($err = json_last_error()))
{ {
static $json_err2str = array( static $json_err2str = array(
JSON_ERROR_NONE => 'No errors', JSON_ERROR_NONE => 'No errors',
@ -589,10 +595,41 @@ class egw_json_response
JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded', JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded',
); );
error_log(__METHOD__.'('.array2string($var).') json_last_error()='.$err.'='.$json_err2str[$err]); error_log(__METHOD__.'('.array2string($var).') json_last_error()='.$err.'='.$json_err2str[$err]);
if (($var = self::fix_content($var)))
{
return self::json_encode($var);
}
} }
return $ret; return $ret;
} }
/**
* Set everything in $var to null, that does not json_encode, eg. because no valid utf-8
*
* @param midex $var
* @param string $prefix =''
* @return mixed
*/
public function fix_content($var, $prefix='')
{
if (json_encode($var) !== false) return $var;
if (is_scalar($var))
{
error_log(__METHOD__."() json_encode($prefix='$var') === false --> setting it to null");
$var = null;
}
else
{
foreach($var as $name => &$value)
{
$value = self::fix_content($value, $prefix ? $prefix.'['.$name.']' : $name);
}
}
return $var;
}
/** /**
* Function which can be used to add an event listener callback function to * Function which can be used to add an event listener callback function to
* the "beforeSendData" callback. This callback might be used to add a response * the "beforeSendData" callback. This callback might be used to add a response