Двоеточие в протоколонезависимом URL
Возможно проблема распространенная, однако упоминаний о ней не нашел, поэтому решил поделиться с вами, уважаемые коллеги.
Суть проблемы в том, что если запросить данные из протоколонезависимого url содержащего двоеточие, то вернется ошибка безопасности Error #2048: Security sandbox violation без запроса самого crossdomain.xml.
Судя по всему при анализе строки для определения протокола используется отсечение по двоеточию, после чего принимается решение о том поддерживается ли протокол и генерируется ошибка.
Для демонстрации взял кроссдомейн от поставщика рекламы, поэтому если включен адблок, то его необходимо отключить. Вот самый простой пример:
package { import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.ErrorEvent; import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.text.TextField; import flash.text.TextFieldAutoSize; import flash.text.TextFormat; public class Main extends Sprite { private var txt:TextField; public function Main() { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; txt = new TextField(); txt.width = stage.stageWidth txt.multiline = true; txt.autoSize = TextFieldAutoSize.LEFT txt.setTextFormat(new TextFormat("Tahoma",12,0)); addChild(txt); var urlloader :URLLoader = new URLLoader(); urlloader.addEventListener(Event.COMPLETE, completeLoadHandler); urlloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorEventHandler); urlloader.addEventListener(IOErrorEvent.IO_ERROR, errorEventHandler); //urlloader.load(new URLRequest("http://adv.gpm-digital.com/crossdomain.xml")); //Вариант 1 Все хорошо //urlloader.load(new URLRequest("//adv.gpm-digital.com/crossdomain.xml")); //Вариант 2 Все хорошо //urlloader.load(new URLRequest("http://adv.gpm-digital.com/crossdomain.xml?a=1:1")); //Вариант 3 Все хорошо urlloader.load(new URLRequest("//adv.gpm-digital.com/crossdomain.xml?a=1:1")); //Вариант 4 Ошибка } private function errorEventHandler(e:ErrorEvent):void { toConsole(e.text) } private function completeLoadHandler(e:Event):void { toConsole(e.target.data) } private function toConsole(message:String):void { txt.text = message; } } }
Вариант 2 Протоколонезависимый путь, без двоеточия. Все хорошо.[Вложение #501 - не найдено]
Вариант 3 Протоколозависимый путь, с двоеточием. Все хорошо.[Вложение #502 - не найдено]
Вариант 4 Протоколонезависимый путь, с двоеточием. Ошибка.[Вложение #503 - не найдено]
[Вложение #507 - не найдено]
Досадно, что необходимо самостоятельно определять и подставлять протокол, если есть вероятность встретить в ссылке двоеточие.
Всего комментариев 15
Комментарии
14.10.2015 01:25 | |
Полезно.
Ошибка только с двоеточием? Не пробывали другие символы? |
14.10.2015 03:42 | |
14.10.2015 15:33 | |
Тоже спотыкался об эти идиотские грабли. Сейчас всегда самостоятельно определяю протокол из loaderInfo.url.
Всего одно условие, не так страшно. Для работы с url'ами уже есть решение: http://help.adobe.com/en_US/FlashPla...s/URLUtil.html |
14.10.2015 16:12 | |
Можно сделать статик класс со свойством. Никуда ничего передавать не нужно будет.
|
14.10.2015 17:25 | |
Tails, это уже подробности, в обоих вариантах есть свои плюсы и минусы, протокол из loaderInfo.url по-моему самый очевидный вариант и самый быстрый в реализации, мне просто не нравится, что для него берутся данные из-за границы класса, в котором нужна модификация ссылки. Вышеописанную функцию в использовании тоже имеет смысл сделать статичной.
kemsky, encodeURIComponent как раз не подходит, так же как и encodeURI, т.к. encodeURIComponent будет экранировать "/", а encodeURI не будет экранировать ":", согласно таблиц "Символы, которые не кодируются" в описании функций ссылка |
15.10.2015 03:06 | |
Так же можно ловить security_error в кастомном загрузчике, и после проверять не протокол ли, тем самым парсить строку только в случае ошибки.
|
15.10.2015 12:41 | |
Если б URLRequest не был бы зафинален, можно было бы его расширить, но тут не судьба. В любом случае со сторонними библиотеками это не очень удобно.
|
15.10.2015 21:28 | |
В любом случае метод updateURL подтягиваете. Я лично, давно использую свой загрузчик унаследованный от URLLoader
|
05.11.2015 21:14 | |
Прошу прощения невнимательность. Эта запись в блоге amesqit была удалена мной по недоразумению.
|
Последние записи от amesqit
- Двоеточие в протоколонезависимом URL (09.10.2015)