Esempio n. 1
0
 /**
  * リソースリクエスト
  *
  * @return BEAR_Ro
  * @throws Exception Ro内部で発生した例外
  */
 public function request()
 {
     $uri = $this->_config['uri'];
     $values = $this->_config['values'];
     $options = $this->_config['options'];
     // URIのクエリーと$valuesをmerge
     $parse = parse_url($uri);
     if (!isset($parse['scheme'])) {
         $this->_mergeQuery($uri, $values);
     }
     $isNotRead = $this->_config['method'] !== BEAR_Resource::METHOD_READ;
     if (!$isNotRead) {
         $hasCsrfOption = false;
     } elseif (isset($options[BEAR_Resource::OPTION_CSRF]) && $options[BEAR_Resource::OPTION_CSRF] === true) {
         // リソースリクエストオプション
         $hasCsrfOption = true;
     } elseif ($this->_config[BEAR_Resource::OPTION_CSRF] === true) {
         // yaml
         $hasCsrfOption = true;
     } else {
         $hasCsrfOption = false;
     }
     if (!$isNotRead) {
         $hasPoeOption = false;
     } elseif (isset($options[BEAR_Resource::OPTION_POE]) && $options[BEAR_Resource::OPTION_POE] === true) {
         // リソースリクエストオプション
         $hasPoeOption = true;
     } elseif ($this->_config[BEAR_Resource::OPTION_POE] === true) {
         // yaml
         $hasPoeOption = true;
     } else {
         $hasPoeOption = false;
     }
     if ($hasCsrfOption || $hasPoeOption) {
         $formToken = BEAR::dependency('BEAR_Form_Token');
         /* @var $formToken BEAR_Form_Token */
         $isTokenCsrfValid = $hasCsrfOption ? $formToken->isTokenCsrfValid() : true;
         if ($isTokenCsrfValid !== true) {
             throw $this->_exception('CSRF');
         }
         $isTokenPoeValid = $hasPoeOption ? $formToken->isTokenPoeValid() : true;
         if ($isTokenPoeValid !== true) {
             $headers = array('request config' => $this->_config, 'msg' => 'invalid token');
             $code = BEAR::CODE_BAD_REQUEST;
             $config = compact('headers', 'code');
             $ro = BEAR::factory('BEAR_Ro', $config);
             $ro->setConfig('uri', $uri);
             $ro->setConfig('values', $values);
             $ro->setConfig('options', $options);
             return $ro;
         } else {
             $formToken->newSessionToken();
         }
     }
     $config = $this->_config;
     $config['uri'] = $uri;
     $config['values'] = $values;
     $resourceRequestCache = BEAR::factory('BEAR_Resource_Request_Cache', $config);
     try {
         $ro = $resourceRequestCache->request();
         // 中で例外が発生しなかったらPOEオプションで使ったトークンを使用済みにマークする
         // @todo staticコールを廃止
         //             BEAR_Form::finishTokens();
         /* @todo 下のifブロックを置き換える
             $isOkRo = ($ro instanceof BEAR_Ro && $ro->getCode() === BEAR::CODE_OK);
            $isNotRo = ($ro instanceof BEAR_Ro === false);
            if (!$isOkRo && $isNotRo) {
            $body = $ro;
            $ro = BEAR::factory('BEAR_Ro');
            $ro->setBody($body);
            }
            */
         if ($ro instanceof BEAR_Ro && $ro->getCode() === BEAR::CODE_OK) {
             // $options ポストプロセスクラス
         } elseif ($ro instanceof BEAR_Ro === false) {
             $body = $ro;
             $ro = BEAR::factory('BEAR_Ro');
             $ro->setBody($body);
         }
         $request = "{$this->_config['method']} {$uri}" . ($values ? '?' . http_build_query($values) : '');
         self::_actionPostProcess($ro);
     } catch (Exception $e) {
         if (get_class($e) === 'Panda_Exception') {
             // HTTPエラー画面
             Panda::onException($e);
             throw $e;
         }
         if (BEAR::exists('page')) {
             $page = BEAR::get('page');
             if (method_exists($page, 'onException')) {
                 $page->onException($e);
             }
         }
         if ($this->_config['debug']) {
             $info = method_exists($e, 'getInfo') ? $e->getInfo() : '';
             Panda::error(get_class($e), $e->getCode() . ' ' . $e->getMessage(), $info);
         }
         //エラー (400=bad requset, or 500=server error
         $trace = $e->getTrace();
         $refTrace =& $trace;
         $trace = array_shift($refTrace);
         if (isset($trace['args'])) {
             $args = $trace['args'];
         } else {
             $args = '';
         }
         $headers = array();
         $exception = array('class' => get_class($e), 'msg' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine());
         $headers['_exception'] = $exception;
         if (method_exists($e, 'getInfo')) {
             $headers['_info'] = $e->getInfo();
         }
         $ro = BEAR::factory('BEAR_Ro');
         $ro->setHeaders($headers)->setCode($e->getCode());
     }
     if ($this->_config['debug']) {
         BEAR::dependency('BEAR_Ro_Debug', $this->_config)->debugShowResource($ro);
     }
     return $ro;
 }