/** * リソースリクエスト * * @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; }