Skip to content

Commit

Permalink
Raven_Compat::substr() method for calling mb_substr() if available (#734
Browse files Browse the repository at this point in the history
)

* new Raven_Compat::substr() method calls mb_substr() if available fixes #727

* fix tests to support multibyte truncation.

* add Raven_Compat::strlen() method and cleanup Serializer
  • Loading branch information
mfb authored and stayallive committed May 4, 2019
1 parent 34c8e76 commit 7291b29
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 12 deletions.
2 changes: 1 addition & 1 deletion lib/Raven/Client.php
Original file line number Diff line number Diff line change
Expand Up @@ -862,7 +862,7 @@ public function capture($data, $stack = null, $vars = null)
}

if (isset($data['message'])) {
$data['message'] = substr($data['message'], 0, $this->message_limit);
$data['message'] = Raven_Compat::substr($data['message'], 0, $this->message_limit);
}

$data = array_merge($this->get_default_data(), $data);
Expand Down
18 changes: 18 additions & 0 deletions lib/Raven/Compat.php
Original file line number Diff line number Diff line change
Expand Up @@ -177,4 +177,22 @@ private static function _json_encode_lowlevel($value, $depth)
return '{' . join(',', $result) . '}';
}
}

public static function strlen($string)
{
if (extension_loaded('mbstring')) {
return mb_strlen($string, 'UTF-8');
}

return strlen($string);
}

public static function substr($string, $start, $length)
{
if (extension_loaded('mbstring')) {
return mb_substr($string, $start, $length, 'UTF-8');
}

return substr($string, $start, $length);
}
}
10 changes: 3 additions & 7 deletions lib/Raven/Serializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,14 +113,10 @@ protected function serializeString($value)
} else {
$value = mb_convert_encoding($value, 'UTF-8');
}
}

if ($this->message_limit !== 0 && mb_strlen($value) > $this->message_limit) {
$value = mb_substr($value, 0, $this->message_limit - 10, 'UTF-8') . ' {clipped}';
}
} else {
if ($this->message_limit !== 0 && strlen($value) > $this->message_limit) {
$value = substr($value, 0, $this->message_limit - 10) . ' {clipped}';
}
if ($this->message_limit !== 0 && Raven_Compat::strlen($value) > $this->message_limit) {
$value = Raven_Compat::substr($value, 0, $this->message_limit - 10) . ' {clipped}';
}

return $value;
Expand Down
6 changes: 3 additions & 3 deletions lib/Raven/Stacktrace.php
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ public static function get_stack_info($frames,
foreach ($vars as $key => $value) {
$value = $reprSerializer->serialize($value);
if (is_string($value) || is_numeric($value)) {
$cleanVars[(string)$key] = substr($value, 0, $frame_var_limit);
$cleanVars[(string)$key] = Raven_Compat::substr($value, 0, $frame_var_limit);
} else {
$cleanVars[(string)$key] = $value;
}
Expand Down Expand Up @@ -217,14 +217,14 @@ private static function serialize_argument($arg, $frame_arg_limit)
$_arg = array();
foreach ($arg as $key => $value) {
if (is_string($value) || is_numeric($value)) {
$_arg[$key] = substr($value, 0, $frame_arg_limit);
$_arg[$key] = Raven_Compat::substr($value, 0, $frame_arg_limit);
} else {
$_arg[$key] = $value;
}
}
return $_arg;
} elseif (is_string($arg) || is_numeric($arg)) {
return substr($arg, 0, $frame_arg_limit);
return Raven_Compat::substr($arg, 0, $frame_arg_limit);
} else {
return $arg;
}
Expand Down
6 changes: 5 additions & 1 deletion test/Raven/Tests/ClientTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -2466,7 +2466,11 @@ public function testCaptureLevel()
$event = array_pop($events);

$this->assertEquals('error', $event['level']);
$this->assertEquals(substr($message, 0, min(Raven_Client::MESSAGE_LIMIT, $length)), $event['message']);
if (extension_loaded('mbstring')) {
$this->assertEquals(mb_substr($message, 0, min(Raven_Client::MESSAGE_LIMIT, $length), 'UTF-8'), $event['message']);
} else {
$this->assertEquals(substr($message, 0, min(Raven_Client::MESSAGE_LIMIT, $length)), $event['message']);
}
$this->assertArrayNotHasKey('release', $event);
$this->assertArrayNotHasKey('environment', $event);
}
Expand Down

0 comments on commit 7291b29

Please sign in to comment.