예제 #1
0
파일: Digest.php 프로젝트: nrother/cakephp
 /**
  * Retrieve information about the authentication
  *
  * Will get the realm and other tokens by performing
  * another request without authentication to get authentication
  * challenge.
  *
  * @param \Cake\Http\Client\Request $request The request object.
  * @param array $credentials Authentication credentials.
  * @return array modified credentials.
  */
 protected function _getServerInfo(Request $request, $credentials)
 {
     $response = $this->_client->get($request->url(), [], ['auth' => []]);
     if (!$response->getHeader('WWW-Authenticate')) {
         return [];
     }
     preg_match_all('@(\\w+)=(?:(?:")([^"]+)"|([^\\s,$]+))@', $response->getHeaderLine('WWW-Authenticate'), $matches, PREG_SET_ORDER);
     foreach ($matches as $match) {
         $credentials[$match[1]] = $match[2];
     }
     if (!empty($credentials['qop']) && empty($credentials['nc'])) {
         $credentials['nc'] = 1;
     }
     return $credentials;
 }
예제 #2
0
파일: Oauth.php 프로젝트: nrother/cakephp
 /**
  * Sorts and normalizes request data and oauthValues
  *
  * Section 9.1.1 of Oauth spec.
  *
  * - URL encode keys + values.
  * - Sort keys & values by byte value.
  *
  * @param \Cake\Http\Client\Request $request The request object.
  * @param array $oauthValues Oauth values.
  * @return string sorted and normalized values
  */
 protected function _normalizedParams($request, $oauthValues)
 {
     $query = parse_url($request->url(), PHP_URL_QUERY);
     parse_str($query, $queryArgs);
     $post = [];
     $body = $request->body();
     if (is_string($body) && $request->getHeaderLine('content-type') === 'application/x-www-form-urlencoded') {
         parse_str($body, $post);
     }
     if (is_array($body)) {
         $post = $body;
     }
     $args = array_merge($queryArgs, $oauthValues, $post);
     uksort($args, 'strcmp');
     $pairs = [];
     foreach ($args as $k => $val) {
         if (is_array($val)) {
             sort($val, SORT_STRING);
             foreach ($val as $nestedVal) {
                 $pairs[] = "{$k}={$nestedVal}";
             }
         } else {
             $pairs[] = "{$k}={$val}";
         }
     }
     return implode('&', $pairs);
 }
예제 #3
0
파일: Stream.php 프로젝트: nrother/cakephp
 /**
  * Open the stream and send the request.
  *
  * @param \Cake\Http\Client\Request $request The request object.
  * @return array Array of populated Response objects
  * @throws \Cake\Core\Exception\Exception
  */
 protected function _send(Request $request)
 {
     $deadline = false;
     if (isset($this->_contextOptions['timeout']) && $this->_contextOptions['timeout'] > 0) {
         $deadline = time() + $this->_contextOptions['timeout'];
     }
     $url = $request->url();
     $this->_open($url);
     $content = '';
     $timedOut = false;
     while (!feof($this->_stream)) {
         if ($deadline !== false) {
             stream_set_timeout($this->_stream, max($deadline - time(), 1));
         }
         $content .= fread($this->_stream, 8192);
         $meta = stream_get_meta_data($this->_stream);
         if ($meta['timed_out'] || $deadline !== false && time() > $deadline) {
             $timedOut = true;
             break;
         }
     }
     $meta = stream_get_meta_data($this->_stream);
     fclose($this->_stream);
     if ($timedOut) {
         throw new Exception('Connection timed out ' . $url);
     }
     $headers = $meta['wrapper_data'];
     if (isset($headers['headers']) && is_array($headers['headers'])) {
         $headers = $headers['headers'];
     }
     return $this->createResponses($headers, $content);
 }