X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=docs%2Fexamples%2Ftutorial.txt;h=d2a8cf10c03e95ac005a06967bdc509a86f37e1e;hb=c19bc275a7b59983992d018e5f74e7e4822c8035;hp=6dcae5ad4367577c4b7e86c8bb26c93e806c2278;hpb=b562e34cf4f8c8fae7b8fe773e0eed71592b09c2;p=m6w6%2Fext-http diff --git a/docs/examples/tutorial.txt b/docs/examples/tutorial.txt index 6dcae5a..d2a8cf1 100644 --- a/docs/examples/tutorial.txt +++ b/docs/examples/tutorial.txt @@ -12,11 +12,12 @@ $Revision$ read from and written to a file. setOptions( - array( 'cookiestore' => '../cookies/google.txt', + array( 'cookiestore' => 'google.txt', ) ); @@ -27,7 +28,7 @@ $r->setQueryData( ); // HttpRequest::send() returns an HttpMessage object -// of type HttpMessage::RESPONSE or throws an exception +// of type HttpMessage::TYPE_RESPONSE or throws an exception try { print $r->send()->getBody(); } catch (HttpException $e) { @@ -44,7 +45,7 @@ try { redirect option. setPostFields( ) ); // add the file to post (form name, file name, file type) +touch('profile.jpg'); $r->addPostFile('image', 'profile.jpg', 'image/jpeg'); try { @@ -82,8 +84,8 @@ try { $p = new HttpRequestPool; // if you want to set _any_ options of the HttpRequest object, // you need to do so *prior attaching* to the request pool! - $p->attach(new HttpRequest('http://pear.php.net', HTTP_HEAD)); - $p->attach(new HttpRequest('http://pecl.php.net', HTTP_HEAD)); + $p->attach(new HttpRequest('http://pear.php.net', HTTP_METH_HEAD)); + $p->attach(new HttpRequest('http://pecl.php.net', HTTP_METH_HEAD)); } catch (HttpException $e) { print $e; exit; @@ -93,7 +95,7 @@ try { $p->send(); // HttpRequestPool implements an iterator over attached HttpRequest objects foreach ($p as $r) { - print "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n"; + echo "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n"; } } catch (HttpException $e) { print $e; @@ -112,8 +114,8 @@ class Pool extends HttpRequestPool public function __construct() { parent::__construct( - new HttpRequest('http://pear.php.net', HTTP_HEAD), - new HttpRequest('http://pecl.php.net', HTTP_HEAD) + new HttpRequest('http://pear.php.net', HTTP_METH_HEAD), + new HttpRequest('http://pecl.php.net', HTTP_METH_HEAD) ); // HttpRequestPool methods socketPerform() and socketSelect() are @@ -121,7 +123,7 @@ class Pool extends HttpRequestPool // while the requests are being executed print "Executing requests"; for ($i = 0; $this->socketPerform(); $i++) { - $i % 3 or print "."; + $i % 10 or print "."; if (!$this->socketSelect()) { throw new HttpException("Socket error!"); } @@ -132,7 +134,7 @@ class Pool extends HttpRequestPool try { foreach (new Pool as $r) { - print "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n"; + echo "Checking ", $r->getUrl(), " reported ", $r->getResponseCode(), "\n"; } } catch (HttpException $ex) { print $e; @@ -186,7 +188,7 @@ class XmlRpcClient public function __construct($url, $namespace = '') { $this->namespace = $namespace; - $this->request = new HttpRequest($url, HTTP_POST); + $this->request = new HttpRequest($url, HTTP_METH_POST); $this->request->setContentType('text/xml'); } @@ -205,7 +207,7 @@ class XmlRpcClient if ($this->namespace) { $method = $this->namespace .'.'. $method; } - $this->request->setPostData(xmlrpc_encode_request($method, $params)); + $this->request->setRawPostData(xmlrpc_encode_request($method, $params)); $response = $this->request->send(); if ($response->getResponseCode() != 200) { throw new Exception($response->getBody(), $response->getResponseCode()); @@ -255,15 +257,15 @@ class FeedAggregator public function addFeed($url) { $r = $this->setupRequest($url); - $r->send(); - $this->handleResponse($r); + $r->send(); + $this->handleResponse($r); } public function addFeeds($urls) { $pool = new HttpRequestPool; foreach ($urls as $url) { - $pool->attach($this->setupRequest($url)); + $pool->attach($r = $this->setupRequest($url)); } $pool->send(); @@ -290,16 +292,16 @@ class FeedAggregator protected function saveFeed($file, $contents) { - if (file_put_contents($this->directory .'/'. $file .'.xml', $contents)) { - $this->feeds[$file] = time(); - } else { - throw new Exception("Could not save feed contents to $file.xml"); - } + if (file_put_contents($this->directory .'/'. $file .'.xml', $contents)) { + $this->feeds[$file] = time(); + } else { + throw new Exception("Could not save feed contents to $file.xml"); + } } protected function loadFeed($file) { - if (isset($this->feeds[$file]) { + if (isset($this->feeds[$file])) { if ($data = file_get_contents($this->directory .'/'. $file .'.xml')) { return $data; } else { @@ -312,13 +314,13 @@ class FeedAggregator protected function setupRequest($url) { - $r = new HttpRequest($url); - $r->setOptions(array('redirect' => true)); + $r = new HttpRequest($url); + $r->setOptions(array('redirect' => true)); $file = $this->url2name($url); if (isset($this->feeds[$file])) { - $r->addOptions(array('lastmodified' => $this->feeds[$file])); + $r->setOptions(array('lastmodified' => $this->feeds[$file])); } return $r; @@ -327,16 +329,142 @@ class FeedAggregator protected function handleResponse(HttpRequest $r) { if ($r->getResponseCode() != 304) { - if ($r->getResponseCode() != 200) { - throw new Exception("Unexpected response code ". $r->getResponseCode()); - } - if (!strlen($body = $r->getResponseBody())) { - throw new Exception("Received empty feed from ". $r->getUrl()); - } - $this->saveFeed($file, $body); - } + if ($r->getResponseCode() != 200) { + throw new Exception("Unexpected response code ". $r->getResponseCode()); + } + if (!strlen($body = $r->getResponseBody())) { + throw new Exception("Received empty feed from ". $r->getUrl()); + } + $this->saveFeed($this->url2name($r->getUrl()), $body); + } } } ?> +- Download a big file + +saveTo('file.bin'); +*/ + +class BiggetRequest extends HttpRequest +{ + public $id; +} + +class Bigget extends HttpRequestPool +{ + const SIZE = 1048576; + + private $url; + private $size; + private $count = 0; + private $files = array(); + + static function url($url) + { + $head = new HttpRequest($url, HttpRequest::METH_HEAD); + $headers = $head->send()->getHeaders(); + $head = null; + + if (!isset($headers['Accept-Ranges'])) { + throw new HttpExcpetion("Did not receive an Accept-Ranges header from HEAD $url"); + } + if (!isset($headers['Content-Length'])) { + throw new HttpException("Did not receive a Content-Length header from HEAD $url"); + } + + $bigget = new Bigget; + $bigget->url = $url; + $bigget->size = $headers['Content-Length']; + return $bigget; + } + + function saveTo($file) + { + $this->send(); + if ($w = fopen($file, 'wb')) { + echo "\nCopying temp files to $file ...\n"; + foreach (glob("bigget_????.tmp") as $tmp) { + echo "\t$tmp\n"; + if ($r = fopen($tmp, 'rb')) { + stream_copy_to_stream($r, $w); + fclose($r); + } + unlink($tmp); + } + fclose($w); + echo "\nDone.\n"; + } + } + + function send() + { + // use max 3 simultanous requests with a req size of 1MiB + while ($this->count < 3 && -1 != $offset = $this->getRangeOffset()) { + $this->attachNew($offset); + } + + while ($this->socketPerform()) { + if (!$this->socketSelect()) { + throw new HttpSocketException; + } + } + } + + private function attachNew($offset) + { + $stop = min($this->count * self::SIZE + self::SIZE, $this->size) - 1; + + echo "Attaching new request to get range: $offset-$stop\n"; + + $req = new BiggetRequest( + $this->url, + HttpRequest::METH_GET, + array( + 'headers' => array( + 'Range' => "bytes=$offset-$stop" + ) + ) + ); + $this->attach($req); + $req->id = $this->count++; + } + + private function getRangeOffset() + { + return ($this->size >= $start = $this->count * self::SIZE) ? $start : -1; + } + + protected function socketPerform() + { + try { + $rc = parent::socketPerform(); + } catch (HttpRequestPoolException $x) { + foreach ($x->exceptionStack as $e) { + echo $e->getMessage(), "\n"; + } + } + + foreach ($this->getFinishedRequests() as $r) { + $this->detach($r); + + if (206 != $rc = $r->getResponseCode()) { + throw new HttpException("Unexpected response code: $rc"); + } + + file_put_contents(sprintf("bigget_%04d.tmp", $r->id), $r->getResponseBody()); + + if (-1 != $offset = $this->getRangeOffset()) { + $this->attachNew($offset); + } + } + + return $rc; + } +} +?>