Обнаружение перенаправления в Flash / ActionScript?

У меня есть флеш-видеоплеер, который запрашивает файл FLV с центрального сервера. Этот сервер может перенаправить запрос на сервер из страны пользователя, если это возможно, во многом как CDN.

Этот видеоплеер также сообщает статистику использования. Одна вещь, о которой я хотел бы сообщить, - это истинный сервер / место, с которого игрок транслирует видео. В общем, если он будет перенаправлен, я хочу об этом знать.

Похоже, вы не можете извлечь URL из URLLoader, вы можете сохранить только копию URLRequest, с которой вы его создали.

Я заметил, что вы можете прослушивать события состояния HTTP, которые могут включать 302 или аналогичные. Но, к сожалению, объект HTTPStatusEvent не показывает перенаправленное местоположение.

Есть идеи о том, как отслеживать перенаправление и получать перенаправленное местоположение?


person aaaidan    schedule 02.09.2009    source источник


Ответы (1)


Я немного удивлен, что Flash вообще позволяет перенаправить запрос видео. Я немного покопался, и похоже, вы можете получить информацию:

Обработка Crossdomain.xml и переадресации 302 с использованием NetStream < / а>

В его сообщении конкретно говорится о проблемах безопасности, которые возникают из-за того, что некоторые операции терпят неудачу, если данные поступают с ненадежного сервера. Поскольку он не знает, откуда идет его видео (302 редирект), Flash Player не доверяет ему и предотвращает некоторые операции с загруженным контентом.

Как он получает сервер, с которого фактически был загружен контент, - это выполнить операцию с файлом, которая не должна быть разрешена, и он анализирует информацию о домене из сообщения об ошибке:

try
{
    var bit:BitmapData = new BitmapData(progressiveVideoPlayer.measuredWidth, progressiveVideoPlayer.measuredHeight, false, 0x000000);
    bit.draw(progressiveVideoPlayer);
}
catch(error:SecurityError)
{
    var list:Array = error.toString().split(" ");
    var swfURL:String = list[7] as String;
    var domain:String = list[10] as String;
    domain = domain.substring(0, domain.length - 1);
    var domainList:Array = domain.split("/");
    var protocol:String = domainList[0] as String;
    var address:String = domainList[2];
    var policyFileURL:String = protocol + "//" + address + "/crossdomain.xml";
    Security.loadPolicyFile(policyFileURL);
}

Обратите внимание, что он делает это для того, чтобы загрузить файл политики (чтобы разрешить операции с ограниченным доступом к файлу). Я не уверен, что это будет вам полезно, но, по крайней мере, прочтите статью и подумайте об этом. Вы также можете напрямую связаться с автором блога - он довольно активен в общем Flash-сообществе.

person James Fassett    schedule 02.09.2009
comment
Эй, эй! Спасибо за помощь, Джеймс. Это очень грязный, но очень эффективный способ получить сервер. Думаю, я могу просто попытаться нарисовать видео, и если оно выдает ошибку SecurityError, я могу проанализировать сообщение об ошибке, чтобы получить перенаправленное местоположение. В противном случае я могу предположить, что он не был перенаправлен. - person aaaidan; 02.09.2009
comment
Я признаю, что это очень грязно, и по этой причине вы должны принять решение, действительно ли оно того стоит. Я не вижу в этом слишком большого вреда - просто будьте осторожны и хорошо протестируйте его. И молитесь, чтобы поведение и формат сообщений об ошибках не изменились в будущем Flash Player ... - person James Fassett; 02.09.2009
comment
Хе да. Поскольку swf и видео размещаются одинаково в одной сети CDN, я в конечном итоге использовал LocalConnection для получения фактического (окончательного) домена, что гарантирует отсутствие междоменных запросов. var realDomain: String = (новый LocalConnection ()). domain; - person aaaidan; 16.09.2009