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