Exemplo n.º 1
0
 /**
  * Load RDF data into the graph from a URI.
  *
  * If no URI is given, then the URI of the graph will be used.
  *
  * The document type is optional but should be specified if it
  * can't be guessed or got from the HTTP headers.
  *
  * @param  string  $uri     The URI of the data to load
  * @param  string  $format  Optional format of the data (eg. rdfxml)
  * @return integer          The number of triples added to the graph
  */
 public function load($uri = null, $format = null)
 {
     $this->checkResourceParam($uri, true);
     if (!$uri) {
         throw new EasyRdf_Exception("No URI given to load() and the graph does not have a URI.");
     }
     // Setup the HTTP client
     $client = EasyRdf_Http::getDefaultHttpClient();
     $client->resetParameters(true);
     $client->setConfig(array('maxredirects' => 0));
     $client->setMethod('GET');
     $client->setHeaders('Accept', EasyRdf_Format::getHttpAcceptHeader());
     $requestUrl = $uri;
     $response = null;
     $redirectCounter = 0;
     do {
         // Have we already loaded it into the graph?
         $requestUrl = EasyRdf_Utils::removeFragmentFromUri($requestUrl);
         if (in_array($requestUrl, $this->loaded)) {
             return 0;
         }
         // Make the HTTP request
         $client->setHeaders('host', null);
         $client->setUri($requestUrl);
         $response = $client->request();
         // Add the URL to the list of URLs loaded
         $this->loaded[] = $requestUrl;
         if ($response->isRedirect() and $location = $response->getHeader('location')) {
             // Avoid problems with buggy servers that add whitespace
             $location = trim($location);
             // Some servers return relative URLs in the location header
             // resolve it in relation to previous request
             $baseUri = new EasyRdf_ParsedUri($requestUrl);
             $requestUrl = $baseUri->resolve($location)->toString();
             $requestUrl = EasyRdf_Utils::removeFragmentFromUri($requestUrl);
             // If it is a 303 then drop the parameters
             if ($response->getStatus() == 303) {
                 $client->resetParameters();
             }
             ++$redirectCounter;
         } elseif ($response->isSuccessful()) {
             // If we didn't get any location, stop redirecting
             break;
         } else {
             throw new EasyRdf_Http_Exception("HTTP request for {$requestUrl} failed: " . $response->getMessage(), $response->getStatus(), null, $response->getBody());
         }
     } while ($redirectCounter < $this->maxRedirects);
     if (!$format or $format == 'guess') {
         list($format, $params) = EasyRdf_Utils::parseMimeType($response->getHeader('Content-Type'));
     }
     // Parse the data
     return $this->parse($response->getBody(), $format, $uri);
 }
 public function testResolve()
 {
     $base = new EasyRdf_ParsedUri('http://example.com');
     $this->assertStringEquals("http://example.com/filename", $base->resolve("filename"));
 }
Exemplo n.º 3
0
 /**
  * Send the HTTP request and return an HTTP response object
  *
  * @return EasyRdf_Http_Response
  * @throws EasyRdf_Exception
  */
 public function request($method = null)
 {
     if (!$this->uri) {
         throw new EasyRdf_Exception("Set URI before calling EasyRdf_Http_Client->request()");
     }
     if ($method) {
         $this->setMethod($method);
     }
     $this->redirectCounter = 0;
     $response = null;
     // Send the first request. If redirected, continue.
     do {
         // Clone the URI and add the additional GET parameters to it
         $uri = parse_url($this->uri);
         if ($uri['scheme'] === 'http') {
             $host = $uri['host'];
         } elseif ($uri['scheme'] === 'https') {
             $host = 'ssl://' . $uri['host'];
         } else {
             throw new EasyRdf_Exception("Unsupported URI scheme: " . $uri['scheme']);
         }
         if (isset($uri['port'])) {
             $port = $uri['port'];
         } else {
             if ($uri['scheme'] === 'https') {
                 $port = 443;
             } else {
                 $port = 80;
             }
         }
         if (!empty($this->paramsGet)) {
             if (!empty($uri['query'])) {
                 $uri['query'] .= '&';
             } else {
                 $uri['query'] = '';
             }
             $uri['query'] .= http_build_query($this->paramsGet, null, '&');
         }
         $headers = $this->prepareHeaders($uri['host'], $port);
         // Open socket to remote server
         $socket = @fsockopen($host, $port, $errno, $errstr, $this->config['timeout']);
         if (!$socket) {
             throw new EasyRdf_Exception("Unable to connect to {$host}:{$port} ({$errstr})");
         }
         // Write the request
         $path = $uri['path'];
         if (empty($path)) {
             $path = '/';
         }
         if (isset($uri['query'])) {
             $path .= '?' . $uri['query'];
         }
         fwrite($socket, "{$this->method} {$path} HTTP/1.1\r\n");
         foreach ($headers as $k => $v) {
             if (is_string($k)) {
                 $v = ucfirst($k) . ": {$v}";
             }
             fwrite($socket, "{$v}\r\n");
         }
         fwrite($socket, "\r\n");
         // Send the request body, if there is one set
         if (isset($this->rawPostData)) {
             fwrite($socket, $this->rawPostData);
         }
         // Read in the response
         $content = '';
         while (!feof($socket)) {
             $content .= fgets($socket);
         }
         // FIXME: support HTTP/1.1 100 Continue
         // Close the socket
         @fclose($socket);
         // Parse the response string
         $response = EasyRdf_Http_Response::fromString($content);
         // If we got redirected, look for the Location header
         if ($response->isRedirect() && ($location = $response->getHeader('location'))) {
             // Avoid problems with buggy servers that add whitespace at the
             // end of some headers (See ZF-11283)
             $location = trim($location);
             // Some servers return relative URLs in the location header
             // resolve it in relation to previous request
             $baseUri = new EasyRdf_ParsedUri($this->uri);
             $location = $baseUri->resolve($location)->toString();
             // If it is a 303 then drop the parameters and send a GET request
             if ($response->getStatus() == 303) {
                 $this->resetParameters();
                 $this->setMethod('GET');
             }
             // If we got a well formed absolute URI
             if (parse_url($location)) {
                 $this->setHeaders('host', null);
                 $this->setUri($location);
             } else {
                 throw new EasyRdf_Exception("Failed to parse Location header returned by " . $this->uri);
             }
             ++$this->redirectCounter;
         } else {
             // If we didn't get any location, stop redirecting
             break;
         }
     } while ($this->redirectCounter < $this->config['maxredirects']);
     return $response;
 }