Fix #1180 download filename issue in Android webview and Naver App

This commit is contained in:
Kijin Sung 2019-07-30 20:43:27 +09:00
parent c5628ee893
commit f33c8d9fbe
2 changed files with 33 additions and 3 deletions

View file

@ -173,6 +173,7 @@ class UA
'os' => null,
'is_mobile' => null,
'is_tablet' => null,
'is_webview' => null,
'is_robot' => null,
);
if (is_null($ua))
@ -204,6 +205,7 @@ class UA
// Fill in miscellaneous fields.
$result->is_mobile = self::isMobile($ua);
$result->is_tablet = self::isTablet($ua);
$result->is_webview = strpos($ua, '; wv)') !== false;
$result->is_robot = self::isRobot($ua);
// Try to match some of the most common browsers.
@ -228,7 +230,7 @@ class UA
$result->version = ($matches[1] + 4) . '.0';
return $result;
}
if (preg_match('#(MSIE|OPR|CriOS|Firefox|FxiOS|Iceweasel|Yeti|[a-z]+(?:bot|spider)(?:-Image)?|wget|curl)[ /:]([0-9]+\\.[0-9]+)#i', $ua, $matches))
if (preg_match('#(MSIE|OPR|CriOS|Firefox|FxiOS|Iceweasel|Whale|Yeti|[a-z]+(?:bot|spider)(?:-Image)?|wget|curl)[ /:]([0-9]+\\.[0-9]+)#i', $ua, $matches))
{
if ($matches[1] === 'MSIE')
{
@ -308,6 +310,8 @@ class UA
/**
* This method encodes a UTF-8 filename for downloading in the current visitor's browser.
*
* See: https://blog.bloodcat.com/302
*
* @param string $filename
* @param string $ua (optional)
@ -322,7 +326,7 @@ class UA
$browser = self::getBrowserInfo($ua);
// Find the best format that this browser supports.
if ($browser->browser === 'Chrome' && $browser->version >= 11)
if ($browser->browser === 'Chrome' && $browser->version >= 11 & !$browser->is_webview)
{
$output_format = 'rfc5987';
}
@ -342,7 +346,7 @@ class UA
{
$output_format = 'rfc5987';
}
elseif ($browser->browser === 'IE')
elseif ($browser->browser === 'IE' || $browser->browser === 'Whale' || $browser->is_webview)
{
$output_format = 'old_ie';
}

View file

@ -56,6 +56,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('Android', $browser->os);
$this->assertTrue($browser->is_mobile);
$this->assertTrue($browser->is_tablet);
$this->assertFalse($browser->is_webview);
$this->assertFalse($browser->is_robot);
// Android default browser (possible confusion with Chrome)
@ -64,6 +65,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('4.4', $browser->version);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
$this->assertFalse($browser->is_webview);
$this->assertFalse($browser->is_robot);
// Android webview (possible confusion with Chrome)
@ -72,6 +74,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('5.1', $browser->version);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_tablet);
$this->assertTrue($browser->is_webview);
$this->assertFalse($browser->is_robot);
// Android Chrome
@ -80,6 +83,7 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('38.0', $browser->version);
$this->assertEquals('Android', $browser->os);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_webview);
$this->assertFalse($browser->is_tablet);
// Windows Chrome
@ -206,6 +210,24 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('10.0', $browser->version);
$this->assertFalse($browser->is_mobile);
// Whale Mobile (Naver App)
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Linux; Android 9) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.128 Whale/1.0.0.0 Crosswalk/23.69.590.31 Mobile Safari/537.36 NAVER(inapp; search; 660; 10.7.2)');
$this->assertEquals('Whale', $browser->browser);
$this->assertEquals('1.0', $browser->version);
$this->assertEquals('Android', $browser->os);
$this->assertTrue($browser->is_mobile);
$this->assertFalse($browser->is_webview);
$this->assertFalse($browser->is_robot);
// XE Push App (Webview)
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (Linux; Android 9; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.101 Mobile Safari/537.36;App');
$this->assertEquals('Chrome', $browser->browser);
$this->assertEquals('75.0', $browser->version);
$this->assertEquals('Android', $browser->os);
$this->assertTrue($browser->is_mobile);
$this->assertTrue($browser->is_webview);
$this->assertFalse($browser->is_robot);
// Googlebot
$browser = Rhymix\Framework\UA::getBrowserInfo('Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
$this->assertEquals('Googlebot', $browser->browser);
@ -281,8 +303,12 @@ class UATest extends \Codeception\TestCase\Test
$this->assertEquals('filename*=UTF-8\'\'%ED%95%9C%EA%B8%80%20filename.jpg', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Firefox/46.0'));
$this->assertEquals('filename*=UTF-8\'\'%ED%95%9C%EA%B8%80%20filename.jpg', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Edge/12.10240'));
$this->assertEquals('filename*=UTF-8\'\'%ED%95%9C%EA%B8%80%20filename.jpg', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'MSIE/7.0 Trident/7.0'));
$this->assertEquals('filename*=UTF-8\'\'%ED%95%9C%EA%B8%80%20filename.jpg', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'));
$this->assertEquals('filename="%ED%95%9C%EA%B8%80%20filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'MSIE 8.0'));
$this->assertEquals('filename="%ED%95%9C%EA%B8%80%20filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Unknown Browser'));
$this->assertEquals('filename="%ED%95%9C%EA%B8%80%20filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Chrome/69.0.3497.128 Whale/1.0.0.0 Crosswalk/23.69.590.31 Mobile Safari/537.36 NAVER(inapp; search; 660; 10.7.2)'));
$this->assertEquals('filename="%ED%95%9C%EA%B8%80%20filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Mozilla/5.0 (Linux; Android 9; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.101 Mobile Safari/537.36'));
$this->assertEquals('filename="%ED%95%9C%EA%B8%80%20filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Dalvik/2.1.0 (Linux; U; Android 9)'));
$this->assertEquals('filename="한글 filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Safari/5.0 Version/5.0'));
$this->assertEquals('filename="한글 filename.jpg"', Rhymix\Framework\UA::encodeFilenameForDownload('한글 filename.jpg', 'Linux; Android 5.1.1; Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36'));
}