protected function createEndpoint(Settings $settings)
 {
     $factory = new EndpointFactory();
     /** @var \ContaoManagementConsole\Endpoint\Command\StatusCommands $endpoint */
     $endpoint = $factory->createEndpoint($settings);
     return $endpoint;
 }
 public function run()
 {
     ob_start();
     error_reporting(E_ALL ^ E_NOTICE);
     if (defined('COMACO_LOG')) {
         $log = 'contao-management-console';
         if (defined('COMACO_LOG_NAME')) {
             $log = COMACO_LOG_NAME;
         }
         $logger = new Logger($log);
         $logger->pushHandler(new StreamHandler(COMACO_LOG, COMACO_LOG_LEVEL));
     } else {
         $logger = null;
     }
     if (isset($_GET['ping'])) {
         header('Content-Type: text/plain; charset=utf-8');
         echo 'pong';
         exit;
     }
     $settings = new Settings();
     if (defined('COMACO_CONTAO_PATH')) {
         $settings->setPath(COMACO_CONTAO_PATH);
     }
     if (defined('COMACO_RSA_LOCAL_PRIVATE_KEY')) {
         $settings->setRsaLocalPrivateKey(COMACO_RSA_LOCAL_PRIVATE_KEY);
     }
     if (defined('COMACO_RSA_REMOTE_PUBLIC_KEY')) {
         $settings->setRsaRemotePublicKey(COMACO_RSA_REMOTE_PUBLIC_KEY);
     }
     $factory = new EndpointFactory();
     $endpoint = $factory->createEndpoint($settings);
     $transport = new HttpServer('application/json');
     if ($logger) {
         $transport->setLogger($logger);
     }
     $encoder = new JsonRpc20Encoder();
     if ($logger) {
         $encoder->setLogger($logger);
     }
     if ($settings->isEncryptionEnabled()) {
         $encoder = new RsaEncoder($encoder, $settings->getRsaRemotePublicKey(), $settings->getRsaLocalPrivateKey());
     }
     $server = new Server($transport, $encoder, $endpoint);
     try {
         $server->handle();
     } catch (Exception $e) {
         if ($logger && $logger->isHandling(Logger::ERROR)) {
             $logger->addError($e->getMessage());
         }
         ob_start();
         while (ob_end_clean()) {
         }
         header('HTTP/1.0 500 Internal Server Error');
         header("Status: 500 Internal Server Error");
         header('Content-Type: text/plain; charset=utf-8');
         echo '500 Internal Server Error';
     }
     exit;
 }