Esempio n. 1
0
 public function parse($json)
 {
     $jsonlint_root = phutil_get_library_root('phutil') . '/../externals/jsonlint';
     require_once $jsonlint_root . '/src/Seld/JsonLint/JsonParser.php';
     require_once $jsonlint_root . '/src/Seld/JsonLint/Lexer.php';
     require_once $jsonlint_root . '/src/Seld/JsonLint/ParsingException.php';
     require_once $jsonlint_root . '/src/Seld/JsonLint/Undefined.php';
     $parser = new JsonLintJsonParser();
     try {
         $output = $parser->parse($json, $this->getFlags());
     } catch (JsonLintParsingException $ex) {
         $details = $ex->getDetails();
         $message = preg_replace("/^Parse error .*\\^\n/s", '', $ex->getMessage());
         throw new PhutilJSONParserException($message, idx(idx($details, 'loc', array()), 'last_line'), idx(idx($details, 'loc', array()), 'last_column'), idx($details, 'token'), idx($details, 'expected'));
     }
     if (!is_array($output)) {
         throw new PhutilJSONParserException(pht('%s is not a valid JSON object.', PhutilReadableSerializer::printShort($json)));
     }
     return $output;
 }
 public static function handleErrors($event, $value, $metadata)
 {
     if (self::$discardMode) {
         return;
     }
     switch ($event) {
         case PhutilErrorHandler::EXCEPTION:
             // $value is of type Exception
             self::$errors[] = array('details' => $value->getMessage(), 'event' => $event, 'file' => $value->getFile(), 'line' => $value->getLine(), 'str' => $value->getMessage(), 'trace' => $metadata['trace']);
             break;
         case PhutilErrorHandler::ERROR:
             // $value is a simple string
             self::$errors[] = array('details' => $value, 'event' => $event, 'file' => $metadata['file'], 'line' => $metadata['line'], 'str' => $value, 'trace' => $metadata['trace']);
             break;
         case PhutilErrorHandler::PHLOG:
             // $value can be anything
             self::$errors[] = array('details' => PhutilReadableSerializer::printShallow($value, 3), 'event' => $event, 'file' => $metadata['file'], 'line' => $metadata['line'], 'str' => PhutilReadableSerializer::printShort($value), 'trace' => $metadata['trace']);
             break;
         default:
             error_log('Unknown event : ' . $event);
             break;
     }
 }
 /**
  * All different types of error messages come here before they are
  * dispatched to the listener; this method also prints them to the PHP error
  * log.
  *
  * @param const Event type constant.
  * @param wild Event value.
  * @param dict Event metadata.
  * @return void
  * @task internal
  */
 public static function dispatchErrorMessage($event, $value, $metadata)
 {
     $timestamp = strftime('%Y-%m-%d %H:%M:%S');
     switch ($event) {
         case PhutilErrorHandler::ERROR:
             $default_message = sprintf('[%s] ERROR %d: %s at [%s:%d]', $timestamp, $metadata['error_code'], $value, $metadata['file'], $metadata['line']);
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             self::outputStacktrace($metadata['trace']);
             break;
         case PhutilErrorHandler::EXCEPTION:
             $messages = array();
             $current = $value;
             do {
                 $messages[] = '(' . get_class($current) . ') ' . $current->getMessage();
             } while ($current = self::getPreviousException($current));
             $messages = implode(' {>} ', $messages);
             if (strlen($messages) > 4096) {
                 $messages = substr($messages, 0, 4096) . '...';
             }
             $default_message = sprintf('[%s] EXCEPTION: %s at [%s:%d]', $timestamp, $messages, self::getRootException($value)->getFile(), self::getRootException($value)->getLine());
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             self::outputStacktrace(self::getRootException($value)->getTrace());
             break;
         case PhutilErrorHandler::PHLOG:
             $default_message = sprintf('[%s] PHLOG: %s at [%s:%d]', $timestamp, PhutilReadableSerializer::printShort($value), $metadata['file'], $metadata['line']);
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             break;
         case PhutilErrorHandler::DEPRECATED:
             $default_message = sprintf('[%s] DEPRECATED: %s is deprecated; %s', $timestamp, $value, $metadata['why']);
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             break;
         default:
             error_log('Unknown event ' . $event);
             break;
     }
     if (self::$errorListener) {
         static $handling_error;
         if ($handling_error) {
             error_log("Error handler was reentered, some errors were not passed to the " . "listener.");
             return;
         }
         $handling_error = true;
         call_user_func(self::$errorListener, $event, $value, $metadata);
         $handling_error = false;
     }
 }
Esempio n. 4
0
 /**
  * All different types of error messages come here before they are
  * dispatched to the listener; this method also prints them to the PHP error
  * log.
  *
  * @param const Event type constant.
  * @param wild Event value.
  * @param dict Event metadata.
  * @return void
  * @task internal
  */
 public static function dispatchErrorMessage($event, $value, $metadata)
 {
     $timestamp = strftime("%F %T");
     switch ($event) {
         case PhutilErrorHandler::ERROR:
             if (error_reporting() === 0) {
                 // Respect the use of "@" to silence warnings: if this error was
                 // emitted from a context where "@" was in effect, the
                 // value returned by error_reporting() will be 0. This is the
                 // recommended way to check for this, see set_error_handler() docs
                 // on php.net.
                 break;
             }
             $default_message = sprintf('[%s] ERROR %d: %s at [%s:%d]', $timestamp, $metadata['error_code'], $value, $metadata['file'], $metadata['line']);
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             self::outputStacktrace($metadata['trace']);
             break;
         case PhutilErrorHandler::EXCEPTION:
             $default_message = sprintf('[%s] EXCEPTION: %s at [%s:%d]', $timestamp, '(' . get_class($value) . ') ' . $value->getMessage(), $value->getFile(), $value->getLine());
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             self::outputStacktrace($value->getTrace());
             break;
         case PhutilErrorHandler::PHLOG:
             $default_message = sprintf('[%s] PHLOG: %s at [%s:%d]', $timestamp, PhutilReadableSerializer::printShort($value), $metadata['file'], $metadata['line']);
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             break;
         case PhutilErrorHandler::DEPRECATED:
             $default_message = sprintf('[%s] DEPRECATED: %s is deprecated; %s', $timestamp, $value, $metadata['why']);
             $metadata['default_message'] = $default_message;
             error_log($default_message);
             break;
         default:
             error_log('Unknown event ' . $event);
             break;
     }
     if (self::$errorListener) {
         static $handling_error;
         if ($handling_error) {
             error_log("Error handler was reentered, some errors were not passed to the " . "listener.");
             return;
         }
         $handling_error = true;
         call_user_func(self::$errorListener, $event, $value, $metadata);
         $handling_error = false;
     }
 }