/**
  * Builds the request string.
  * 
  * The files array can be a combination of the following (either data or file):
  * 
  * file => "path/to/file", filename=, mime=, data=
  *
  * @param array files		(name => filedesc) (not urlencoded)
  * @return array (headers, body)
  */
 static function encodeBody($files)
 {
     $headers = array();
     $body = null;
     // 1. Add all the files to the post
     if (!empty($files)) {
         foreach ($files as $name => $f) {
             $data = false;
             $filename = false;
             if (isset($f['filename'])) {
                 $filename = $f['filename'];
             }
             if (!empty($f['file'])) {
                 $data = @file_get_contents($f['file']);
                 if ($data === false) {
                     throw new OAuthException2(sprintf('Could not read the file "%s" for request body', $f['file']));
                 }
                 if (empty($filename)) {
                     $filename = basename($f['file']);
                 }
             } else {
                 if (isset($f['data'])) {
                     $data = $f['data'];
                 }
             }
             // When there is data, add it as a request body, otherwise silently skip the upload
             if ($data !== false) {
                 if (isset($headers['Content-Disposition'])) {
                     throw new OAuthException2('Only a single file (or data) allowed in a signed PUT/POST request body.');
                 }
                 if (empty($filename)) {
                     $filename = 'untitled';
                 }
                 $mime = !empty($f['mime']) ? $f['mime'] : 'application/octet-stream';
                 $headers['Content-Disposition'] = 'attachment; filename="' . OAuthBodyContentDisposition::encodeParameterName($filename) . '"';
                 $headers['Content-Type'] = $mime;
                 $body = $data;
             }
         }
         // When we have a body, add the content-length
         if (!is_null($body)) {
             $headers['Content-Length'] = strlen($body);
         }
     }
     return array($headers, $body);
 }
Exemplo n.º 2
0
 /**
  * Perform the request, returns the response code, headers and body.
  * 
  * @param int usr_id			optional user id for which we make the request
  * @param array curl_options	optional extra options for curl request
  * @param array options			options like name and token_ttl
  * @exception OAuthException2 when authentication not accepted
  * @exception OAuthException2 when signing was not possible
  * @return array (code=>int, headers=>array(), body=>string)
  */
 function doRequest($usr_id = 0, $curl_options = array(), $options = array(), $secrets = null)
 {
     $name = isset($options['name']) ? $options['name'] : '';
     if (isset($options['token_ttl'])) {
         $this->setParam('xoauth_token_ttl', intval($options['token_ttl']));
     }
     if (!empty($this->files)) {
         // At the moment OAuth does not support multipart/form-data, so try to encode
         // the supplied file (or data) as the request body and add a content-disposition header.
         list($extra_headers, $body) = OAuthBodyContentDisposition::encodeBody($this->files);
         $this->setBody($body);
         $curl_options = $this->prepareCurlOptions($curl_options, $extra_headers);
     }
     $this->sign($usr_id, $secrets, $name);
     $text = $this->curl_raw($curl_options);
     $result = $this->curl_parse($text);
     if ($result['code'] >= 400) {
         throw new OAuthException2('Request failed with code ' . $result['code'] . ': ' . $result['body']);
     }
     // Record the token time to live for this server access token, immediate delete iff ttl <= 0
     // Only done on a succesful request.
     $token_ttl = $this->getParam('xoauth_token_ttl', false);
     if (is_numeric($token_ttl)) {
         $this->store->setServerTokenTtl($this->getParam('oauth_consumer_key', true), $this->getParam('oauth_token', true), $token_ttl);
     }
     return $result;
 }
Exemplo n.º 3
0
 /**
  * Perform the request, returns the response code, headers and body.
  * 
  * @param int usr_id		optional user id for which we make the request
  * @param array curl_options
  * @exception OAuthException when authentication not accepted
  * @exception OAuthException when signing was not possible
  * @return array (code=>int, headers=>array(), body=>string)
  */
 function doRequest($usr_id = 0, $curl_options = array())
 {
     if (!empty($this->files)) {
         // At the moment OAuth does not support multipart/form-data, so try to encode
         // the supplied file (or data) as the request body and add a content-disposition header.
         list($extra_headers, $body) = OAuthBodyContentDisposition::encodeBody($this->files);
         $this->setBody($body);
         $curl_options = $this->prepareCurlOptions($curl_options, $extra_headers);
     }
     $this->sign($usr_id);
     $text = $this->curl_raw($curl_options);
     $result = $this->curl_parse($text);
     if ($result['code'] >= 400) {
         throw new OAuthException('Request failed with code ' . $result['code'] . ': ' . $result['body']);
     }
     return $result;
 }
 /**
  * Perform the request, returns the response code, headers and body.
  * 
  * @param int usr_id			optional user id for which we make the request
  * @param array curl_options	optional extra options for curl request
  * @param array options			options like name and token_ttl
  * @exception OAuthException2 when authentication not accepted
  * @exception OAuthException2 when signing was not possible
  * @return array (code=>int, headers=>array(), body=>string)
  */
 function doRequest($usr_id = 0, $curl_options = array(), $options = array())
 {
     $name = isset($options['name']) ? $options['name'] : '';
     if (isset($options['token_ttl'])) {
         $this->setParam('xoauth_token_ttl', intval($options['token_ttl']));
     }
     if (!empty($this->files)) {
         // At the moment OAuth does not support multipart/form-data, so try to encode
         // the supplied file (or data) as the request body and add a content-disposition header.
         list($extra_headers, $body) = OAuthBodyContentDisposition::encodeBody($this->files);
         $this->setBody($body);
         $curl_options = $this->prepareCurlOptions($curl_options, $extra_headers);
     }
     $this->sign($usr_id, null, $name);
     $text = $this->curl_raw($curl_options);
     $result = $this->curl_parse($text);
     // Modified behaviour: SugestioClient.php should always receive the $result array
     // Response codes such as 404 may occur as part of the normal web service usage
     // and need to be forwarded to the Sugestio client
     //if ($result['code'] >= 400)
     //{
     //	throw new OAuthException2('Request failed with code ' . $result['code'] . ': ' . $result['body']);
     //}
     // Record the token time to live for this server access token, immediate delete iff ttl <= 0
     // Only done on a succesful request.
     $token_ttl = $this->getParam('xoauth_token_ttl', false);
     if (is_numeric($token_ttl)) {
         $this->store->setServerTokenTtl($this->getParam('oauth_consumer_key', true), $this->getParam('oauth_token', true), $token_ttl);
     }
     return $result;
 }