Вместо die(); возвращается json, как такое возможно?

Petja

Новичок
У меня перестал работать один ajax запрос, возвращает ошибку 500. Я его отлаживаю, перехожу по коду, по файлам.

В одном методе одного класса я выставляю:
die('test');
и ajax запрос получает ответ test

Я выставляю die(323);
и ajax запрос возвращает ответ в виде json:
{"success":false,"message":"\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043a\u0440\u044b\u0442.","total":0,"data":[],"object":{"code":401}}

Не понимаю, как такое возможно, ведь die; по идее должен все останавливать...
Как такое возможно?

Заранее благодарю!
 

Petja

Новичок
Да, но die работает и тут же не работает... То есть этот файл который я редактирую - не последовательность кода, а возвращает что-то файлу или коду выше по иерархии?
 

С.

Продвинутый новичок
die(323); ты ведь ставишь не вместо die('test'); а на совершенно другой строке. Угадал?
 

hell0w0rd

Продвинутый новичок
Давайте погадаем что же там может быть) код-то покажи
 

Petja

Новичок
die(323); ты ведь ставишь не вместо die('test'); а на совершенно другой строке. Угадал?
Нет, тут же меняю строку на цифру и обратно.

Что-то php.net не работает, но кажется, что если передать die цифру - то она воспринимает ее как код статуса, и просто сбрасывает выполнение кода,
а если строку - то выводит строку и сбрасывает.

То есть, когда цифра - то просто сбрасывает. И когда сбрасывает, то скрипт отдает ответ в виде json... А если сообщение есть - то отдает это сообщение...

В общем не пойму как такое возможно... Буду дальше копать...
 

Baton

Новичок
\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043a\u0440\u044b\u0442. По русски означает: Доступ закрыт.

Как вариант в приложении происходит буферизация вывода и после die вызывается register_shutdown_function() внутри которой проверяется тип буфера и в случае если тип не строка выводится access denied. Что конечно бред полный, но мы и не такое видали :)
 

Petja

Новичок
Попробую передать ход кода частично.
Сам файл, на который отправляется ajax :
PHP:
require_once dirname(dirname(__FILE__)).'/index.php';
$modx->request->handleRequest(array('location' => 'resource'));
Дальше - метод handleRequest который вызывается выше:

PHP:
public function handleRequest(array $options = array()) {
        if (isset($options['action']) && !is_string($options['action'])) return false;
        if ((!isset($options['action']) || $options['action'] == '') && isset($_REQUEST['action'])) {
            $options['action'] = $_REQUEST['action'];
        }
        $options['action'] = strtolower($options['action']);

        $this->loadErrorHandler();

        /* Cleanup action and store. */
        $this->prepareResponse($options);

        return true;
        
    }
в этом же классе из кода выше: $this->prepareResponse($options);

PHP:
public function prepareResponse(array $options = array()) {
        $procDir = !empty($options['processors_path']) ? $options['processors_path'] : '';
        $this->setDirectory($procDir);
        $this->modx->response->outputContent($options); // тут остановился Petja 777
    }
Дальше outputContent, уже из другого файла и класса, он хоть и большой тут, но важна одна строка с которой идет дальше переход:
$this->response = $this->modx->runProcessor($target,$scriptProperties,$options);
PHP:
public function outputContent(array $options = array()) {        
        /* variable pointer for easier access */

        /*if($options['location'] == 'resource'){
            var_dump($options);
            die('-317-');
        }*/

        $modx =& $this->modx;

        /* backwards compat */
        $error =& $this->modx->error;
        /* prevent browsing of subdirectories for security */
        $target = str_replace('../','',$options['action']);

        $siteId = $this->modx->user->getUserToken($this->modx->context->get('key'));
        $isLogin = $target == 'login';

        /* ensure headers are sent for proper authentication */
        if (!$isLogin && !isset($_SERVER['HTTP_MODAUTH']) && !isset($_REQUEST['HTTP_MODAUTH'])) {
            $this->responseCode = 401;
            $this->body = $modx->error->failure($modx->lexicon('access_denied'),array('code' => 401));

        } else if (!$isLogin && isset($_SERVER['HTTP_MODAUTH']) && $_SERVER['HTTP_MODAUTH'] != $siteId) {
            $this->responseCode = 401;
            $this->body = $modx->error->failure($modx->lexicon('access_denied'),array('code' => 401));

        } else if (!$isLogin && isset($_REQUEST['HTTP_MODAUTH']) && $_REQUEST['HTTP_MODAUTH'] != $siteId) {
            $this->responseCode = 401;
            $this->body = $modx->error->failure($modx->lexicon('access_denied'),array('code' => 401));

        /* verify the location and action */
        } else if (!isset($options['location']) || !isset($options['action'])) {
            $this->responseCode = 404;
            $this->body = $this->modx->error->failure($modx->lexicon('action_err_ns'),array('code' => 404));

        } else if (empty($options['action'])) {
            $this->responseCode = 404;
            $this->body = $this->modx->error->failure($modx->lexicon('action_err_ns'),array('code' => 404));

        /* execute a processor and format the response */
        } else {
            /* create scriptProperties array from HTTP GPC vars */
            if (!isset($_POST)) $_POST = array();
            if (!isset($_GET)) $_GET = array();
            $scriptProperties = array_merge($_GET,$_POST);
            if (isset($_FILES) && !empty($_FILES)) {
                $scriptProperties = array_merge($scriptProperties,$_FILES);
            }

            /* run processor */
            $this->response = $this->modx->runProcessor($target,$scriptProperties,$options); // Тут остановился Petja 777

            if (!$this->response) {
                $this->responseCode = 404;
                $this->body = $this->modx->error->failure($this->modx->lexicon('processor_err_nf',array(
                    'target' => $target,
                )));
            } else {
                $this->body = $this->response->getResponse();
            }
        }

        /* if files sent, this means that the browser needs it in text/plain,
         * so ignore text/json header type
         */
        if (!isset($_FILES)) {
            header("Content-Type: application/json; charset=UTF-8");
            $message = 'OK';
            if (array_key_exists($this->responseCode,$this->_responseCodes)) {
                $message = $this->_responseCodes[$this->responseCode];
            }
            header('Status: HTTP/1.1 '.$this->responseCode.' '.$message);
        }
        if (is_array($this->header)) {
            foreach ($this->header as $header) header($header);
        }
        if (is_array($this->body)) {
            @session_write_close();
            die($this->modx->toJSON(array(
                'success' => isset($this->body['success']) ? $this->body['success'] : 0,
                'message' => isset($this->body['message']) ? $this->body['message'] : $this->modx->lexicon('error'),
                'total' => (isset($this->body['total']) && $this->body['total'] > 0)
                        ? intval($this->body['total'])
                        : (isset($this->body['errors'])
                                ? count($this->body['errors'])
                                : 1),
                'data' => isset($this->body['errors']) ? $this->body['errors'] : array(),
                'object' => isset($this->body['object']) ? $this->body['object'] : array(),
            )));
        } else {
            @session_write_close();
            die($this->body);
        }
    }
Там дальше переход в этой строке: $this->response = $this->modx->runProcessor($target,$scriptProperties,$options); // Тут остановился Petja 777

Ну а там он создает экземпляр одного класса со стороны потом этот экземпляр берет и передает дальше... И я пока тут, вообщем что-то достало все... :-(
 

Petja

Новичок
\u0414\u043e\u0441\u0442\u0443\u043f \u0437\u0430\u043a\u0440\u044b\u0442. По русски означает: Доступ закрыт.

Как вариант в приложении происходит буферизация вывода и после die вызывается register_shutdown_function() внутри которой проверяется тип буфера и в случае если тип не строка выводится access denied.
Благодарю! А где про это почитать? А еще могут быть другие варианты?
 

Baton

Новичок
Petja

А попробуй die('123') число в кавычках, то бишь строку. Что возвращает?

ЗЫ: Хотя пардоньте, буфер же всегда строка?)) Ох-хо-хо.
 

Petja

Новичок
Petja

А попробуй die('123') число в кавычках, то бишь строку. Что возвращает?

ЗЫ: Хотя пардоньте, буфер же всегда строка?)) Ох-хо-хо.
Сейчас все работает, просто когда цифра - ничего не возвращает. Если строка - возвращает. Просто так работает die оказывается, если цифра - код статуса.
 

Baton

Новичок
PHP:
         if (is_array($this->body)) {
            @session_write_close();
            die($this->modx->toJSON(array(
                'success' => isset($this->body['success']) ? $this->body['success'] : 0,
                'message' => isset($this->body['message']) ? $this->body['message'] : $this->modx->lexicon('error'),
                'total' => (isset($this->body['total']) && $this->body['total'] > 0)
                        ? intval($this->body['total'])
                        : (isset($this->body['errors'])
                                ? count($this->body['errors'])
                                : 1),
                'data' => isset($this->body['errors']) ? $this->body['errors'] : array(),
                'object' => isset($this->body['object']) ? $this->body['object'] : array(),
            )));
        } else {
            @session_write_close();
            die($this->body);
        }
Если $this->body массив, то выводится json, если не массив, то выводится как есть. Ищи где формируется $this->body.
 

Redjik

Джедай-мастер
я одного не пойму - на кой черт ты modx ковыряешь? все равно не разберешься - там же такого наговнокожено, что и командой за месяц не разгребсти...
 

Petja

Новичок
я одного не пойму - на кой черт ты modx ковыряешь? все равно не разберешься - там же такого наговнокожено, что и командой за месяц не разгребсти...
Можно примеры, где наговнокожено?

По моему там все написано довольно доступно для отладки. С комментариями и т.п.. Единственное, что я этот код пока чиатть не умею, т.к. у меня мало опыта с ооп, но если иметь опыт, я думаю не будет проблем его читать.

Если не понятно - не обязательно в этом виноват автор кода.
 

Redjik

Джедай-мастер
Можно примеры, где наговнокожено?
Нет, лень скачивать и аудит проводить.

По моему там все написано довольно доступно для отладки. С комментариями и т.п.. Единственное, что я этот код пока чиатть не умею, т.к. у меня мало опыта с ооп, но если иметь опыт, я думаю не будет проблем его читать.
Ужасно написано - отлаживать тяжело.

Если не понятно - не обязательно в этом виноват автор кода.
В первую очередь в этом виноват автор.

Программист пишет код не для машины, а для людей.
 
Сверху