/** * 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); }
/** * 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; }
/** * 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; }