/**
  * @see TwitterOAuth::http()
  * @author Naomichi Yamakita <*****@*****.**>
  */
 public function http($uri, $method, $postData = NULL)
 {
     // TwitterOAuth::http() はレスポンスヘッダを書き換えてるため使用しない
     // (Mars_ResponseParser の動作に影響するため)
     $sender = new Mars_HttpRequestSender($uri);
     $sender->setUserAgent($this->useragent);
     $sender->setReadTimeout($this->connecttimeout);
     $sender->addHeader('Expect', '');
     if (is_string($postData)) {
         parse_str($postData, $postData);
     }
     if ($method === 'POST') {
         $sender->setRequestMethod(Mars_HttpRequest::HTTP_POST);
         $sender->addParameters($postData);
     } else {
         if ($method === 'DELETE') {
             $sender->setRequestMethod(Mars_HttpRequest::HTTP_DELETE);
             if (sizeof($postData)) {
                 $uri = $uri . '?' . OAuthUtil::build_http_query($postData);
             }
         }
     }
     $sender->setBaseURI($uri);
     $parser = $sender->send();
     $this->http_code = $parser->getStatus();
     $this->http_info = $parser->getRawHeader();
     $this->url = $uri;
     return $parser->getContents();
 }
 /**
  * @see Mars_3LeggedOAuthProvider::send()
  * @since 1.10.0
  * @author Naomichi Yamakita <*****@*****.**>
  */
 public function send($uri, $requestMethod = Mars_HttpRequest::HTTP_GET, $parameters = array(), $files = array())
 {
     $uri = $this->buildEndpointURI($uri);
     $accessToken = $this->getAccessToken();
     $sender = new Mars_HttpRequestSender($uri);
     $sender->setRequestMethod($requestMethod);
     $sender->addHeader('Authorization', 'OAuth ' . $accessToken['access_token']);
     $sender->addParameters($parameters);
     $sender->setPostFormat(Mars_HttpRequestSender::FORMAT_JSON);
     $parser = $sender->send();
     if ($parser->getStatus() != 200) {
         if (stripos($parser->getContentType(), 'application/json') !== FALSE) {
             $data = $parser->getJSONData(TRUE);
             $error = sprintf('%s (%s)', $data['error'], $data['error_description']);
         } else {
             $error = $parser->getHeader('WWW-Authenticate');
         }
         $message = sprintf('Failed to send API. [%s]', $error);
         throw new Mars_RequestException($message);
     }
     return $parser;
 }
 /**
  * RESTful API に対してリクエストを送信します。
  * パフォーマンス上の観点から、PHP の zlib モジュールが有効な場合はデータを gzip 圧縮転送します。
  * 
  * @param array $parameters 送信するパラメータのリスト。
  *   <code>
  *   // 対象フィールドを foo、bar に指定
  *   $parameters = array('fields' => 'foo,bar');
  *   
  *   // フィルタリングの指定
  *   $parameters = array('filterBy' => 'hasApp');
  *   </code>
  * @param string $requestMethod {@link Mars_OAuthProvider::send()} メソッドを参照。
  * @return Mars_HttpResponseParser {@link Mars_OAuthProvider::send()} メソッドを参照。
  * @throws Mars_RequestException mixi からエラーが返された場合に発生。
  *   - {@link Mars_RequestException::getCode()} メソッドでレスポンスコードが取得可能。(コードの意味は mixi のマニュアルを参照)
  *   - OAuth の署名検証などでエラーが起きた場合は {@link http://oauth.pbworks.com/ProblemReporting 具体的な理由} が返される。
  *   - {@link Mars_RequestException::getAttribute() Mars_RequestException::getAttribute('error')} メソッドで返却されたレスポンスページを取得可能。
  * @see Mars_OAuthProvider::send()
  * @link http://developer.mixi.co.jp/appli/spec/mob/for_partners/mobile_api_detail RESTful API 仕様
  * @link http://developer.mixi.co.jp/appli/spec/mob/2-legged-oauth 2-legged OAuth による API アクセス
  */
 public function send($uri, $requestMethod = Mars_HttpRequest::HTTP_GET, $parameters = array(), $files = array())
 {
     $baseFeed = $this->buildEndpointURI($uri);
     $queryData = array();
     if ($requestMethod == Mars_HttpRequest::HTTP_GET || $requestMethod == Mars_HttpRequest::HTTP_DELETE) {
         $queryData = $parameters;
     }
     $queryData['xoauth_requestor_id'] = Mars_MixiMobileApp::getOwnerId();
     $request = OAuthRequest::from_consumer_and_token($this->_consumer, NULL, $requestMethod, $baseFeed, $queryData);
     $request->sign_request(new OAuthSignatureMethod_HMAC_SHA1(), $this->_consumer, NULL);
     // to_header() から返されるヘッダ名 ('Authorization: ') の部分を取り除く
     $authorization = substr($request->to_header(), 15);
     $uri = $baseFeed . '?' . http_build_query($queryData, '', '&');
     if ($requestMethod === Mars_HttpRequest::HTTP_POST) {
         $sender = new Mars_HttpRequestSender($uri);
         $sender->addParameters($parameters);
         $sender->setPostFormat(Mars_HttpRequestSender::FORMAT_JSON);
     } else {
         $sender = new Mars_HttpRequestSender($uri);
     }
     $sender->setRequestMethod($requestMethod);
     $sender->addHeader('Authorization', $authorization);
     // 圧縮転送を有効にする
     if ($this->_hasZlib) {
         $sender->addHeader('Accept-Encoding', 'gzip');
     }
     $parser = $sender->send();
     $status = $parser->getStatus();
     if ($status == 200) {
         return $parser;
     } else {
         $authenticate = $parser->getHeader('WWW-Authenticate');
         // OAuth の承認でエラーが起きた場合は oauth_problem に原因が格納される
         if (preg_match('/oauth_problem="([^"]+)"/', $authenticate, $matches)) {
             $message = sprintf('OAuth authenticate error. [%s]', $matches[1]);
         } else {
             $message = sprintf('mixi returned an error code. [%s]', $status);
         }
         $e = new Mars_RequestException($message, $status);
         $e->setAttribute('error', $parser->getContents());
         throw $e;
     }
 }
 /**
  * ユーザのプロフィール情報を取得します。
  * 
  * @return stdClass ユーザ情報を格納した stdClass のオブジェクトインスタンスを返します。
  * @throws Mars_RequestException アクセストークンが不正な場合に発生。
  * @author Naomichi Yamakita <*****@*****.**>
  */
 public function getProfile()
 {
     if (!$this->isAuthorized()) {
         throw new Mars_RequestException('Access token is not set.');
     }
     $uri = self::ENDPOINT_BASE_URI . '/me?access_token=' . $this->_accessToken['access_token'];
     $sender = new Mars_HttpRequestSender($uri);
     $parser = $sender->send();
     $result = json_decode($parser->getContents());
     if ($parser->getStatus() == 200) {
         return $result;
     } else {
         throw new Mars_RequestException($result->error->message);
     }
 }