Diffs
HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/HTTP_Download_Mobile_EZgetTest.php
@@ -0,0 +1,227 @@
+<?php
+require_once 'PHPUnit/Framework.php';
+require_once 'HTTP/Download/Mobile/EZget.php';
+
+require_once 'HTTP/Request2.php';
+require_once 'Net/URL2.php';
+require_once 'MIME/Type.php';
+
+
+class HTTP_Download_Mobile_EZgetTestCase extends PHPUnit_Framework_TestCase
+{
+ public function testGetResponseType()
+ {
+ $ezget = new HTTP_Download_Mobile_EZget();
+
+ $data = array(
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => 0,
+ 'count' => 120,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING,
+ ),
+ array(
+ 'filename' => 'dummy.jpg',
+ 'offset' => 0,
+ 'count' => 120,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => 0,
+ 'count' => 0,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => -1,
+ 'count' => -1,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => -1,
+ 'count' => -2,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_FAILED,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => -2,
+ 'count' => -2,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => null,
+ 'count' => null,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+ ),
+ array(
+ 'filename' => 'dummy.jpg',
+ 'offset' => null,
+ 'count' => null,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => '0',
+ 'count' => '0',
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => '0',
+ 'count' => '120',
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => 0,
+ 'count' => 120.3,
+ 'response' => HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN,
+ ),
+ );
+ foreach ($data as $value) {
+ $actual = $ezget->getResponseType($value['offset'], $value['count'], $value['filename']);
+ $this->assertEquals($value['response'], $actual);
+ }
+ }
+
+ public function testGetResponseMessage()
+ {
+ $ezget = new HTTP_Download_Mobile_EZget();
+
+ $messages = array(
+ HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN => '1',
+ HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING => '2',
+ HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY => '3',
+ HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED => '4',
+ HTTP_Download_Mobile_EZget::RESPONSE_FAILED => '5',
+ HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND => '6',
+ );
+ foreach ($messages as $response_type => $message) {
+ $ezget->setResponseMessage($response_type, $message);
+ }
+
+ foreach ($messages as $response_type => $expect) {
+ $actual = $ezget->getResponseMessage($response_type);
+ $this->assertEquals($actual,$expect);
+ }
+ }
+
+ public function testGetResponse()
+ {
+ $ezget = new HTTP_Download_Mobile_EZget();
+
+ $data = array(
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => 0,
+ 'count' => 120,
+ 'response' => file_get_contents(HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg', 0, null, 0, 120),
+ ),
+ array(
+ 'filename' => HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg',
+ 'offset' => '0',
+ 'count' => '120',
+ 'response' => file_get_contents(HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg', 0, null, 0, 120),
+ ),
+ array(
+ 'filename' => 'dummy.jpg',
+ 'offset' => 0,
+ 'count' => 120,
+ 'response' => implode("\n", array(
+ '<hdml version=3.0 ttl="0" public=true>',
+ '<display>',
+ '<action type=accept task=cancel>',
+ '<wrap>'.mb_convert_encoding('ファイルが見つかりません', 'shift-jis', 'UTF-8').'</wrap>',
+ '</display>',
+ '</hdml>',
+ )),
+ ),
+ array(
+ 'filename' => 'dummy.jpg',
+ 'offset' => null,
+ 'count' => null,
+ 'response' => implode("\n", array(
+ '<hdml version=3.0 ttl="0" public=true>',
+ '<display>',
+ '<action type=accept task=cancel>',
+ '<wrap>'.mb_convert_encoding('エラーが発生しました', 'shift-jis', 'UTF-8').'</wrap>',
+ '</display>',
+ '</hdml>',
+ )),
+ ),
+ );
+ foreach ($data as $value) {
+ $response = $ezget->setFilename($value['filename'])
+ ->setOffset($value['offset'])
+ ->setCount($value['count'])
+ ->getResponse();
+
+ $this->assertEquals($value['response'], $response['body']);
+ }
+ }
+
+ public function testBaseic()
+ {
+ try {
+ $filesize = filesize(HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/picture.jpg');
+
+ $response = null;
+ $step = 0;
+
+ $offset = 0;
+ do {
+ if ($offset == $filesize) {
+ $offset = -1;
+ $count = -1;
+ } else {
+ if ($filesize - $offset < 1280) {
+ $count = $filesize - $offset;
+ } else {
+ $count = 1280;
+ }
+ }
+
+ echo sprintf('offset = %6d, count = %6d', $offset, $count).PHP_EOL;
+
+
+ $_REQUEST['name'] = 'picture.jpg';
+ $_REQUEST['offset'] = (string)$offset;
+ $_REQUEST['count'] = (string)$count;
+ $response = $this->_server();
+
+
+ if (MIME_Type::stripParameters($response['content-type']) === 'text/x-hdml') {
+ break;
+ } else {
+ $len = strlen($response['body']);
+ $this->assertEquals($count, $len);
+
+ $offset += $len;
+ }
+ } while (++$step < 10000);
+
+ $this->assertEquals('text/x-hdml',
+ MIME_Type::stripParameters($response['content-type']));
+
+ } catch (HTTP_Request2_Exception $e) {
+ $this->fail($e->getMessage());
+ }
+ }
+
+ private function _server()
+ {
+ require_once 'HTTP/Download.php';
+
+ $ezget = new HTTP_Download_Mobile_EZget();
+
+ $response = $ezget->setFilename(isset($_REQUEST['name']) ? HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/'.$_REQUEST['name'] : null)
+ ->setOffset(isset($_REQUEST['offset']) ? $_REQUEST['offset'] : null)
+ ->setCount(isset($_REQUEST['count']) ? $_REQUEST['count'] : null)
+ ->getResponse();
+
+ return $response;
+ }
+}
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/HTTP_Download_Mobile_EZgetTest.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF
HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/bootstrap.php
@@ -0,0 +1,17 @@
+<?php
+
+
+mb_language('ja');
+mb_internal_encoding('UTF-8');
+
+if (defined('E_DEPRECATED')) {
+ error_reporting(E_ALL & ~E_DEPRECATED);
+} else {
+ error_reporting(E_ALL);
+}
+
+set_include_path(realpath(dirname(__FILE__) . '/../src') . PATH_SEPARATOR .
+ get_include_path());
+
+
+define ('HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR', dirname(__FILE__).'/data');
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/bootstrap.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF
HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/data/picture.jpg
表示できません: バイナリ形式としてマークされたファイルです。
svn:mime-type = application/octet-stream
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/data/picture.jpg
___________________________________________________________________
名前: svn:mime-type
+ application/octet-stream
HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/server.php
@@ -0,0 +1,19 @@
+<?php
+
+require_once dirname(__FILE__).'/bootstrap.php';
+require_once dirname(__FILE__).'/../src/HTTP/Download/Mobile/EZget.php';
+require_once 'HTTP/Download.php';
+
+
+$ezget = new HTTP_Download_Mobile_EZget();
+
+$response = $ezget->setFilename(isset($_REQUEST['name']) ? HTTP_DOWNLOAD_MOBILE_EZGET_DATA_DIR.'/'.$_REQUEST['name'] : null)
+ ->setOffset(isset($_REQUEST['offset']) ? $_REQUEST['offset'] : null)
+ ->setCount(isset($_REQUEST['count']) ? $_REQUEST['count'] : null)
+ ->getResponse();
+
+$download = new HTTP_Download();
+$download->setContentType($response['content-type']);
+$download->setData($response['body']);
+$download->setCache(false);
+$download->send();
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/test/server.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF
HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/src/HTTP/Download/Mobile/EZget.php
@@ -0,0 +1,184 @@
+<?php
+
+
+/**
+ * @see http://www.au.kddi.com/ezfactory/tec/dlcgi/download_1.html
+ */
+class HTTP_Download_Mobile_EZget
+{
+ const RESPONSE_UNKNOWN = 0;
+ const RESPONSE_DOWNLOADING = 1;
+ const RESPONSE_DOWNLOADEMPTY = 2;
+ const RESPONSE_COMPLETED = 3;
+ const RESPONSE_FAILED = 4;
+ const RESPONSE_FILENOTFOUND = 5;
+
+
+ protected $filename;
+
+ protected $offset;
+
+ protected $count;
+
+ protected $messages;
+
+
+ function __construct()
+ {
+ $this->reset();
+ }
+
+ /**
+ * 出力ファイルを設定
+ */
+ public function setFilename($filename)
+ {
+ $this->filename = $filename;
+
+ return $this;
+ }
+
+ /**
+ * offsetパラメータを設定
+ */
+ public function setOffset($offset)
+ {
+ if (preg_match('/\d+/', $offset)) {
+ $offset = (int)$offset;
+ }
+ $this->offset = $offset;
+
+ return $this;
+ }
+
+ /**
+ * countパラメータを設定
+ */
+ public function setCount($count)
+ {
+ if (preg_match('/\d+/', $count)) {
+ $count = (int)$count;
+ }
+ $this->count = $count;
+
+ return $this;
+ }
+
+ /**
+ * レスポンスを取得
+ */
+ public function getResponse()
+ {
+ $content_type = '';
+ $response_body = '';
+
+ // 出力の種類を判別
+ $response_type = $this->getResponseType($this->offset, $this->count, $this->filename);
+
+ if ($response_type == HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING) {
+ $body = '';
+ if ($fp = fopen($this->filename, 'rb')) {
+ fseek($fp, $this->offset);
+ $body = fread($fp, $this->count);
+ fclose($fp);
+ }
+
+ $content_type = 'application/x-up-download';
+ $response_body = $body;
+ } elseif ($response_type == HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY) {
+ $content_type = 'application/x-up-download';
+ $response_body = '';
+ } else {
+ if ($response_type == HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED) {
+ $task = 'return';
+ } else {
+ $task = 'cancel';
+ }
+
+ $msg = $this->getResponseMessage($response_type);
+ $body = sprintf('<hdml version=3.0 ttl="0" public=true>'."\n".
+ '<display>'."\n".
+ '<action type=accept task=%s>'."\n".
+ '<wrap>%s</wrap>'."\n".
+ '</display>'."\n".
+ '</hdml>',
+ $task, $msg);
+ $body = mb_convert_encoding($body, 'SJIS', 'UTF-8');
+
+ $content_type = 'text/x-hdml;charset=Shift_JIS';
+ $response_body = $body;
+ }
+
+
+ return array(
+ 'content-type' => $content_type,
+ 'body' => $response_body,
+ );
+ }
+
+ /**
+ * レスポンスの種類を判別
+ */
+ public function getResponseType($offset, $count, $filename)
+ {
+ if (gettype($offset) !== 'integer' || gettype($count) !== 'integer') {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN;
+ } else {
+ if ($offset >= 0 && $count > 0) {
+ if (file_exists($filename)) {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING;
+ } else {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND;
+ }
+ } elseif ($offset === 0 && $count === 0) {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY;
+ } elseif ($offset === -1 && $count === -1) {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED;
+ } elseif ($offset === -1 && $count === -2) {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_FAILED;
+ } else {
+ $response_type = HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN;
+ }
+ }
+
+ return $response_type;
+ }
+
+ /**
+ * 各値を初期値にリセットする
+ */
+ public function reset()
+ {
+ $this->filename = '';
+ $this->offset = 0;
+ $this->count = 0;
+
+ $messages = array(
+ HTTP_Download_Mobile_EZget::RESPONSE_UNKNOWN => 'エラーが発生しました',
+ HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADING => null,
+ HTTP_Download_Mobile_EZget::RESPONSE_DOWNLOADEMPTY => null,
+ HTTP_Download_Mobile_EZget::RESPONSE_COMPLETED => 'ダウンロード成功しました',
+ HTTP_Download_Mobile_EZget::RESPONSE_FAILED => 'ダウンロード失敗しました',
+ HTTP_Download_Mobile_EZget::RESPONSE_FILENOTFOUND => 'ファイルが見つかりません',
+ );
+ foreach ($messages as $response_type => $message) {
+ $this->setResponseMessage($response_type, $message);
+ }
+ }
+
+ /**
+ * レスポンスメッセージを取得する
+ */
+ public function getResponseMessage($response_type)
+ {
+ return $this->messages[$response_type];
+ }
+
+ /**
+ * レスポンスメッセージを設定する
+ */
+ public function setResponseMessage($response_type, $message)
+ {
+ return $this->messages[$response_type] = $message;
+ }
+}
属性に変更があったパス: HTTP_Download_Mobile_EZget/tags/release-0.1.0-20100227215823/src/HTTP/Download/Mobile/EZget.php
___________________________________________________________________
名前: svn:keywords
+ Author Date Id Rivision
名前: svn:eol-style
+ LF