/** * Cast to HTTP query string * * @param mixed $url * @param Zend\OAuth\Config $config * @param null|array $params * @return string */ public function toQueryString($url, Config $config, array $params = null) { $uri = new Uri\Url($url); if (!$uri->isValid() || !in_array($uri->getScheme(), array('http', 'https'))) { throw new OAuth\Exception('\'' . $url . '\' is not a valid URI'); } $params = $this->_httpUtility->assembleParams($url, $config, $params); return $this->_httpUtility->toEncodedQueryString($params); }
public function testAllParts() { $url = new Url('http://*****:*****@www.zend.com:8080/path/to/file?a=1&b=2#top'); $this->assertEquals('http', $url->getScheme()); $this->assertEquals('andi', $url->getUsername()); $this->assertEquals('password', $url->getPassword()); $this->assertEquals('www.zend.com', $url->getHost()); $this->assertEquals('8080', $url->getPort()); $this->assertEquals('/path/to/file', $url->getPath()); $this->assertEquals('a=1&b=2', $url->getQuery()); $this->assertEquals('top', $url->getFragment()); $this->assertTrue($url->isValid()); }
/** * Attempt to turn a relative URI into an absolute URI */ protected function _absolutiseUri($link, $uri = null) { if (!Uri\Url::validate($link)) { if ($uri !== null) { $uri = new Uri\Url($uri); if ($link[0] !== '/') { $link = $uri->getPath() . '/' . $link; } $link = $uri->getScheme() . '://' . $uri->getHost() . '/' . $this->_canonicalizePath($link); if (!URI\URL::validate($link)) { $link = null; } } } return $link; }
/** * Checks whether the cookie should be sent or not in a specific scenario * * @param string|\Zend\Uri\Url $uri URI to check against (secure, domain, path) * @param boolean $matchSessionCookies Whether to send session cookies * @param int $now Override the current time when checking for expiry time * @return boolean */ public function match($uri, $matchSessionCookies = true, $now = null) { if (is_string($uri)) { $uri = new Uri\Url($uri); } // Make sure we have a valid Zend_Uri_Http object if (!($uri->isValid() && ($uri->getScheme() == 'http' || $uri->getScheme() == 'https'))) { throw new Exception('Passed URI is not a valid HTTP or HTTPS URI'); } // Check that the cookie is secure (if required) and not expired if ($this->secure && $uri->getScheme() != 'https') { return false; } if ($this->isExpired($now)) { return false; } if ($this->isSessionCookie() && !$matchSessionCookies) { return false; } // Check if the domain matches if (!self::matchCookieDomain($this->getDomain(), $uri->getHost())) { return false; } // Check that path matches using prefix match if (!self::matchCookiePath($this->getPath(), $uri->getPath())) { return false; } // If we didn't die until now, return true. return true; }
/** * Send request to the remote server * * @param string $method * @param \Zend\Uri\Url $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { $host = $uri->getHost(); $host = (strtolower($uri->getScheme()) == 'https' ? 'sslv2://' . $host : $host); // Build request headers $path = $uri->getPath(); if (empty($path)) { $path = '/'; } if ($uri->getQuery()) $path .= '?' . $uri->getQuery(); $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; foreach ($headers as $k => $v) { if (is_string($k)) $v = ucfirst($k) . ": $v"; $request .= "$v\r\n"; } // Add the request body $request .= "\r\n" . $body; // Do nothing - just return the request as string return $request; }
/** * Send request to the remote server * * @param string $method * @param \Zend\Uri\Url $uri * @param string $http_ver * @param array $headers * @param string $body * @return string Request as string */ public function write($method, $uri, $http_ver = '1.1', $headers = array(), $body = '') { // Make sure we're properly connected if (!$this->socket) { throw new Exception('Trying to write but we are not connected'); } $host = $uri->getHost(); $host = (strtolower($uri->getScheme()) == 'https' ? $this->config['ssltransport'] : 'tcp') . '://' . $host; if ($this->connected_to[0] != $host || $this->connected_to[1] != $uri->getPort()) { throw new Exception('Trying to write but we are connected to the wrong host'); } // Save request method for later $this->method = $method; // Build request headers $path = $uri->getPath(); if ($uri->getQuery()) { $path .= '?' . $uri->getQuery(); } $request = "{$method} {$path} HTTP/{$http_ver}\r\n"; foreach ($headers as $k => $v) { if (is_string($k)) { $v = ucfirst($k) . ": {$v}"; } $request .= "{$v}\r\n"; } if (is_resource($body)) { $request .= "\r\n"; } else { // Add the request body $request .= "\r\n" . $body; } // Send the request if (!@fwrite($this->socket, $request)) { throw new Exception('Error writing request to server'); } if (is_resource($body)) { if (stream_copy_to_stream($body, $this->socket) == 0) { throw new Exception('Error writing request to server'); } } return $request; }
/** * Determine if a given URL is valid * * @param string $url * @return void * @throws Zend\OAuth\Exception */ protected function _validateUrl($url) { $uri = new Uri\Url($url); if (!$uri->isValid()) { throw new OAuth\Exception(sprintf("'%s' is not a valid URI", $url)); } elseif (!in_array($uri->getScheme(), array('http', 'https'))) { throw new OAuth\Exception(sprintf("'%s' is not a valid URI", $url)); } }
/** * Prepare the request headers * * @return array */ protected function _prepareHeaders() { $headers = array(); // Set the host header if (!isset($this->headers['host'])) { $host = $this->uri->getHost(); // If the port is not default, add it if (!($this->uri->getScheme() == 'http' && $this->uri->getPort() == 80 || $this->uri->getScheme() == 'https' && $this->uri->getPort() == 443)) { $host .= ':' . $this->uri->getPort(); } $headers[] = "Host: {$host}"; } // Set the connection header if (!isset($this->headers['connection'])) { if (!$this->config['keepalive']) { $headers[] = "Connection: close"; } } // Set the Accept-encoding header if not set - depending on whether // zlib is available or not. if (!isset($this->headers['accept-encoding'])) { if (function_exists('gzinflate')) { $headers[] = 'Accept-encoding: gzip, deflate'; } else { $headers[] = 'Accept-encoding: identity'; } } // Set the Content-Type header if ($this->method == self::POST && (!isset($this->headers[strtolower(self::CONTENT_TYPE)]) && isset($this->enctype))) { $headers[] = self::CONTENT_TYPE . ': ' . $this->enctype; } // Set the user agent header if (!isset($this->headers['user-agent']) && isset($this->config['useragent'])) { $headers[] = "User-Agent: {$this->config['useragent']}"; } // Set HTTP authentication if needed if (is_array($this->auth)) { $auth = self::encodeAuthHeader($this->auth['user'], $this->auth['password'], $this->auth['type']); $headers[] = "Authorization: {$auth}"; } // Load cookies from cookie jar if (isset($this->cookiejar)) { $cookstr = $this->cookiejar->getMatchingCookies($this->uri, true, CookieJar::COOKIE_STRING_CONCAT); if ($cookstr) { $headers[] = "Cookie: {$cookstr}"; } } // Add all other user defined headers foreach ($this->headers as $header) { list($name, $value) = $header; if (is_array($value)) { $value = implode(', ', $value); } $headers[] = "{$name}: {$value}"; } return $headers; }