Tuhaf bug: video dosyalarını hizmet veren bir PHP komut dosyası, ben bir "video/mp4" başlığını gönderme ve MP4 dosya çıktısı önce bir kaç test koşullarını (vb, emin dosya var olun, belirteç kimlik doğrulaması) var.
Testlerden herhangi biri başarısız olursa, $fail
olmayan bir false değeri verilir.
Testlerin sonunda bu if
deyimi var:
if ($fail) {
exit;
}
Chrome'da beklendiği gibi bu kod değil, Safari'de çalışıyor. Ancak olarak, ben sadece açıklama ise exit;
(ve inan bana, ben hangi yolu bu her test ettik):
if ($fail) {
//exit;
}
... Kod Safari mükemmel çalışıyor - Video hemen yükleme başlar.
Ben aksi betiğin durdurmak, bu if
blok girdi asla emin değilim, ve ben (söz değil video/mp4
başlığını görme olmaz, öyle değil mi ) Chrome'da çalışır. Ayrıca, ne olursa olsun PHP perde arkasında yapıyor tarayıcıya tamamen şeffaf olmalıdır. Ben belki biraz sorun çıktı orada olduğunu düşündüm, ama ben başlıklarından önce bir şey outputted olsaydı ben bir uyarı almış olurdu.
Ben gün boyunca sürekli bu davranışı görmeye oldum - Ben güvensizlik muhtemelen 25 kez kontrol ettim.
Şüphesiz Kaçırdığım bir şey var?
UPDATE
Sorunu açıklığa kavuşturmak için, ben kodu biraz değişti:
$fail = true;
if ($fail) {
die('Fail');
}
Şimdi die()
beyanı ve çıktı "Fail" vurmak garanti ediyoruz. İşte başlıklar Safari tarafından görüldüğü gibidir:
Connection:Keep-Alive
Content-Type:text/html
Date:Thu, 24 Jun 2010 23:31:28 GMT
Keep-Alive:timeout=10, max=29
Server:Apache/2.2.15 (CentOS) mod_ssl/2.2.15 0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635
Transfer-Encoding:Identity
X-Powered-By:PHP/5.2.13
(Çok, "Fail" beklendiği gibi çıkılır.)
Şimdi, comment-out $fail = true;
, başlıkları değiştirin:
Connection:Keep-Alive
Content-Length:47406944
Content-Type:video/mp4
Date:Thu, 24 Jun 2010 23:32:58 GMT
Keep-Alive:timeout=10, max=30
Server:Apache/2.2.15 (CentOS) mod_ssl/2.2.15 0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635
X-Powered-By:PHP/5.2.13
Ama video yine çalmıyor! (Bunun üzerine bir soru işareti ile QuickTime logosu.)
O $fail
yanlış kalır, ve die()
asla çalıştırılmaz dair yeterli kanıt olduğunu düşünüyorum.
Şimdi, bu olsun: Ben yine, benim son kod böylece die()
(exit
fonksiyonel eşdeğer) açıklama ise:
//$fail = true;
if ($fail) {
//die('Fail');
}
... Video Safari'de çalış!
UPDATE 2
: Ben kodunu değiştirirseniz
$fail = false;
if ($fail) {
die('Fail');
}
Kesinlikle ... $fail
olduğunu garanti etmek false
, Safari oynadığı!
Bu davranış bana hiç mantıklı, $fail
nedeniyle Doğrulama koşullardan birine ayarlı ise, b / c o asla çıkış video/mp4
başlığı, ben açıkça ayarlanmış olduğu şekilde $fail
true
için - ve bunun yerine it would çıktı kelime "Fail" ile bir text/html
sayfa - değil mi?
UPDATE 3
Burada sadece tamamen açık olması, ilgili tüm kodu bulunuyor:
// verify
$fail = false;
$token = false;
$file_name = [rest assured that $file_name is correct];
if (!$file_name) {
$fail = true;
} else {
$file_name = '../video/'.$file_name;
}
if (!isset($_REQUEST['ts'])) {
$fail = true;
}
if (isset($_POST['token']) || isset($_GET['token'])) {
$token = isset($_POST['token']) ? $_POST['token'] : $_GET['token'];
} else if (isset($_COOKIE['token'])) {
$token = $_COOKIE['token'];
}
if ($token != md5(SALT_HASH.$_REQUEST['ts'])) {
$fail = true;
}
if (((int)($_REQUEST['ts']) + 60 * 10) < mktime()) {
$fail = true;
}
if (!is_file($file_name)) {
$fail = true;
}
if ($fail) {
die('Fail');
}
// output
$file_size = (string)(filesize($file_name));
header('Content-Type: video/mp4');
header('Content-Length: '.$file_size);
readfile_chunked($file_name);
exit;
HOPEFULLY THE LAST UPDATE / SUMMARY
Bu soru zaten muhtemelen çok uzun, ama ben bu kadar garip özetlemek için son bir kez denemek istiyorum düşündüm. 3 ayrı tepkiler vardır:
I if ($fail) die('Fail');
, sadece bu yüzden başarısızlık için bir temel var önce bir $fail = true;
hardwire 1) Eğer, ben bir text/html
başlık olsun ve kelime "Fail" dir beklendiği gibi çıkılır.
Yukarıda olduğu gibi kod bırakırsanız 2), ben bir video/mp4
başlık, ama Safari kırık bir video (Chrome'da oynayacak) olsun.
3) Son olarak (ve bu ben bugün yaptığı yeni test dayanmaktadır), ben açıklama eğer $fail = true;
koşullu token-doğrulamaya, ben bir video/mp4
başlık olsun ve video oyunları Safari'de. Şimdi, belirteç doğrulama ile yanlış must bir şey düşündüm - ama $ testinden sonra başarısız değerini yankı başka testte hardwire zaman, hala sahte! Koşullu girilen asla (Ben de sadece koymak düz bir die('!');
yerine $fail = true;
- ve ben hala bir video/mp4
başlık olsun).
Ben sadece idam geçmez kodu yorum farklı bir tepki neden olabilir inanamıyorum - ve ayrıca, bu would Chrome oynadığını, ancak Safari'de; PHP ile sunucu tarafı oluyor ne olursa olsun tarayıcı tamamen şeffaf olmalıdır.
Çılgın.
AHA!
Ben komut bazı günlüğü eklendi ve HTML5 Video servis atarken, tarayıcı yapar two istekleri çıkıyor.
İşte Chrome'dan iki (başarılı) istekleri var:
Fri Jun 25 17:41:22 2010 Browser: [Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4] Fail: [0] Token: [83e50b519c0ed4662b6b7fabb8f6671e] Timestamp: [1277509282]
Fri Jun 25 17:41:22 2010 Verification passed
Fri Jun 25 17:41:22 2010 Browser: [Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.86 Safari/533.4] Fail: [0] Token: [83e50b519c0ed4662b6b7fabb8f6671e] Timestamp: [1277509282]
Fri Jun 25 17:41:22 2010 Verification passed
Ve burada Safari (ilk başarılı, başarısız 2) gelen iki bulunuyor:
Fri Jun 25 17:41:32 2010 Browser: [Apple Mac OS X v10.6.4 CoreMedia v1.0.0.10F569] Fail: [0] Token: [6374fba3d9eac7d94de9741db76953c6] Timestamp: [1277509291]
Fri Jun 25 17:41:32 2010 Verification passed
Fri Jun 25 17:41:33 2010 Browser: [QuickTime/7.6.6 (qtver=7.6.6;cpu=IA32;os=Mac 10.6.4)] Fail: [1] Token: [] Timestamp: [1277509291]
Ben hemen dışarı gitmek zorunda, ama bu davranış hata kök neredeyse eminim. Nedense, 2. Safari isteği belirteci bulamıyorum.