public function testPercentEncode() { $this->assertEquals('foobar', UriResolver::percentEncode('foobar')); $this->assertEquals('http%3A%2F%2Fgoogle.de', UriResolver::percentEncode('http://google.de')); $this->assertEquals('http%3A%2F%2Fgoogle.de', UriResolver::percentEncode('http%3A%2F%2Fgoogle.de')); $this->assertEquals('http%253A%252F%252Fgoogle.de', UriResolver::percentEncode('http%3A%2F%2Fgoogle.de', false)); }
public function resolve(Uri $uri, Document $source, RefResolver $resolver) { if (!$uri->isAbsolute()) { $uri = UriResolver::resolve($source->getBaseUri(), $uri); } $request = new GetRequest($uri, array('Accept' => 'application/schema+json')); $response = $this->httpClient->request($request); if ($response->getStatusCode() == 200) { $schema = (string) $response->getBody(); $data = Json::decode($schema); $document = new Document($data, $resolver, null, $uri); return $document; } else { throw new RuntimeException('Could not load external schema ' . $uri->toString() . ' received ' . $response->getStatusCode()); } }
/** * Converts an raw http request into an PSX\Http\Request object * * @param string $content * @return \PSX\Http\Request */ public function parse($content) { $content = $this->normalize($content); list($method, $path, $scheme) = $this->getStatus($content); // resolve uri path if ($this->baseUrl !== null) { $path = UriResolver::resolve($this->baseUrl, new Uri($path)); } else { $path = new Uri($path); } $request = new Request($path, $method); $request->setProtocolVersion($scheme); list($header, $body) = $this->splitMessage($content); $this->headerToArray($request, $header); $request->setBody(new StringStream($body)); return $request; }
/** * Sends the request through the given handler and returns the response * * @param \PSX\Http\Request $request * @param \PSX\Http\Options $options * @param integer $count * @return \PSX\Http\Response */ public function request(Request $request, Options $options = null, $count = 0) { if (!$request->getUri()->isAbsolute()) { throw new InvalidArgumentException('Request url must be absolute'); } // set cookie headers if ($this->cookieStore !== null) { $cookies = $this->cookieStore->load($request->getUri()->getHost()); if (!empty($cookies)) { $kv = array(); foreach ($cookies as $cookie) { $path = ltrim($cookie->getPath(), '/'); if ($cookie->getExpires() !== null && $cookie->getExpires()->getTimestamp() < time()) { $this->cookieStore->remove($request->getUri()->getHost(), $cookie); } elseif ($cookie->getPath() !== null && substr($request->getUri()->getPath(), 0, strlen($path)) != $path) { // path does not fit } else { $kv[] = $cookie->getName() . '=' . $cookie->getValue(); } } $request->addHeader('Cookie', implode('; ', $kv)); } } // set content length $body = $request->getBody(); if ($body !== null && $request->hasHeader('Transfer-Encoding') != 'chunked' && !in_array($request->getMethod(), array('HEAD', 'GET'))) { $size = $body->getSize(); if ($size !== false) { $request->setHeader('Content-Length', $size); } } // set default options if ($options === null) { $options = new Options(); } // make request $response = $this->handler->request($request, $options); // store cookies if ($this->cookieStore !== null) { $cookies = $response->getHeaderLines('Set-Cookie'); foreach ($cookies as $rawCookie) { try { $cookie = new Cookie($rawCookie); $domain = $cookie->getDomain() !== null ? $cookie->getDomain() : $request->getUri()->getHost(); $this->cookieStore->store($domain, $cookie); } catch (InvalidArgumentException $e) { // invalid cookies } } } // check follow location if ($options->getFollowLocation() && ($response->getStatusCode() >= 300 && $response->getStatusCode() < 400)) { $location = (string) $response->getHeader('Location'); if (!empty($location) && $location != $request->getUri()->toString()) { if ($options->getMaxRedirects() > $count) { $location = UriResolver::resolve($request->getUri(), new Uri($location)); return $this->request(new GetRequest($location), $options, ++$count); } else { throw new RedirectException('Max redirection reached'); } } } return $response; }