Flash AS3 читает ответ прокси-сервера с помощью URLLoader

Я использую встроенную флеш-память «swf» в локальной сети с прокси-сервером. Прокси-сервер прерывает некоторые URL-адреса и возвращает информацию об использовании. Я пытаюсь получить доступ к этой информации, отправив эти URL-адреса. Я вижу этот трафик в firebug, но URLLoader его не читает. Ни событие Complete, ни событие прогресса не запускаются. Я также пробовал URLStream с таймером, но availableBytes всегда были равны нулю. Можно ли прочитать эту информацию?

  private var getLoader:URLLoader = new URLLoader();
  private var sendRequest:URLRequest = new URLRequest();
  public function XDomain() {
   sendRequest= new URLRequest("requesturl");
   getLoader.addEventListener(Event.COMPLETE, eventHandler);
   getLoader.addEventListener(ProgressEvent.PROGRESS,eventHandler2);
   getLoader.load(sendRequest);
  }
  private function eventHandler(event:Event):void {
    trace("running");
  }
  private function eventHandler2(event:ProgressEvent):void {
   trace("runninhg progresss");
  }

Заранее благодарим // Изменить: у меня была эта ошибка безопасности

[SecurityErrorEvent type="securityError" bubbles=false cancelable=false eventPhase=2 text="Error #2048"]

person feminkk    schedule 26.12.2016    source источник
comment
Пожалуйста, послушайте SecurityErrorEvents и HTTPStatusEvents, и давайте посмотрим, что они говорят.   -  person phasma    schedule 27.12.2016
comment
Список событий @Jacob HTTPStatus блокирует мой код. Что-то мне не хватает? //getLoader.addEventListener(HTTPStatusEvent.HTTP_RESPONSE_STATUS, httpHandler); // .trace после этого не запускается.   -  person feminkk    schedule 27.12.2016
comment
URLStream с таймером почему ??? Есть ли результат, если дать ему поработать естественно, без прерывания таймера? URLStream - ваш лучший выбор, поскольку он дает прямой доступ к ответу сервера. Если по-прежнему не удается, покажите свой код URLStream или дайте проверяемую ссылку, которая воспроизводит вашу проблему.   -  person VC.One    schedule 27.12.2016
comment
Ни одно из событий не сработало, поэтому я использовал таймер, чтобы вернуть getLoader.bytesAvailable. Думаю, он ничего не сделает.   -  person feminkk    schedule 27.12.2016
comment
О событиях у вас есть import flash.events.*; в вашем коде? Это помогает добавить? not running trace находится внутри функции httpHandler, верно? ... В любом случае сам URLLoader не будет показывать вам текст ответа сервера. Покажите мне, как вы вместо этого пробовали URLStream (короткий пример, тестируемый в наших собственных компиляторах). Я серьезно изо всех сил пытаюсь не заставить его работать в моих собственных тестах, поэтому либо ваш код URLStream неверен, либо передается пример / проверяемая ссылка на сумасшедший сервер.   -  person VC.One    schedule 28.12.2016
comment
Еще раз спасибо. В самом приведенном выше примере, если я заменю URLLoader на URLSream, это будет минимальным примером моей настройки. У меня есть функции трассировки для getLoader.bytesAvailable внутри события прогресса. но они не имеют значения, если событие не запускается. // Да, у меня уже есть // import flash.events. *; //   -  person feminkk    schedule 28.12.2016
comment
sendRequest= new URLRequest("https://www.google.com"); получает ли этот URL хоть какое-то событие прогресса? Для Google.com я получил четыре раза ваши runninhg progresss показы (во Flash IDE) при использовании вашего кода с URLStream в качестве замены. Также ваша первая строка кода ... getLoader:URLLoader() = new URLLoader(); должна быть getLoader:URLLoader = new URLLoader();. Если вы не видите здесь ошибок, интересно, не вызывает ли эта же проблема никаких следов в других частях кода?   -  person VC.One    schedule 28.12.2016
comment
Также потому, что это URLStream, поэтому отслеживайте входящие данные следующим образом: trace(event.target.readUTFBytes(event.target.bytesAvailable) );   -  person VC.One    schedule 28.12.2016
comment
URLLoader () был опечаткой. // Я не получаю события прогресса для google.com. Flash запрашивает google.com/crossdomain.xml и извлекает его. Но он снова показывает ошибку, не раскрытие данных. Я компилирую его с помощью wonderfl.net и запускаю в firefox на Linux. // У меня есть настроенный сервер с crossdomain.xml для тестирования. который отлично работает, я могу успешно выполнять запросы GET и POST. Я думаю, что показанная часть кода в порядке. // О части event.target, поскольку я определил getLoader с помощью 'new', он не доступен напрямую без использования event.target (в любом случае, это не имеет значения).   -  person feminkk    schedule 28.12.2016
comment
Посмотрите, если это Ответ почему-то имеет для вас смысл. Я думаю, что Firefox ожидает, что и ваш swf, и сервер, с которым вы связались, будут работать на https, если обе стороны не совпадают (http или https), тогда он заблокирует ваш swf доступ к любым данным. Я также никогда не компилировал с Wonderfl.net (возможно, использование веб-сайта приносит свои новые проблемы) ... PS: new - это просто новый уникальный экземпляр чего-то, event.target означает, какой объект (цель) имеет этот eventListener прикрепленный ...   -  person VC.One    schedule 29.12.2016


Ответы (1)


"Но похоже, что URLLoader не читает ..."

Используйте URLStream (без таймера, потому что чего это вообще дает?), Чтобы добраться до ссылки, и внутри вашего связанного progressEvent используйте readUTFBytes, чтобы получить любые данные текстового ответа, предоставленные сервером этой ссылки. Используйте progressEvent, чтобы также проверить размер любых полученных байтов (событие запускается несколько раз, получая пакеты размером 64 КБ, пока не будут загружены полные данные).

об ошибке №2048:
URLloader - это декодер визуальных данных (jpg, png, swf, текст), но для нетекстовых данных он ожидает crossdomain.xml существовать на другом сервере, с которого вы обращаетесь к swf (обе стороны также должны иметь совпадающие http или https. Опять же, лучший способ обойти это - просто загрузить байты в массив байтов (через URLStream, но теперь progressEvents должен записывать в ваш массив байтов), затем используйте URLLoader.loadBytes( yourSWFBytes );

person VC.One    schedule 27.12.2016
comment
Спасибо за ответ . События не срабатывают и с URLStream. Я тоже получаю ту же ошибку безопасности. - person feminkk; 27.12.2016
comment
События не срабатывают Тогда нет соединения вообще. У меня такая же ошибка безопасности Ложь, при декодировании ваших собственных байтов проблем с безопасностью нет. Нет даже проблемы с заполнением этих байтов readBytes с любого внешнего сервера. Вот почему это реальный обходной путь. К тому времени, когда вы используете getLoader.load(myBytes);, этот load должен декодировать байты вашего собственного изображения, если вместо этого вы дадите какой-то внешний URL-адрес (например, sendRequest), тогда вы заставите его предположить, что вы крадете контент, поэтому он имеет ошибку безопасности, когда не находит существующий файл разрешений на внешнем сервере. - person VC.One; 27.12.2016
comment
Edit ваш вопрос, показывающий пример того, как вы обрабатываете URLStream, байты и процесс декодирования. Оба указанных выше условия неизвестны в этой системе. PS: Итак, если URLStream не запущен (прогресс не обнаружен), как вы позже получите ошибку безопасности? Соответствовал ли размер байтов размеру SWF-файла до того, как вы попытались декодировать (отобразить) с помощью URLLoader? В любом случае я посмотрю на ваш код, если вы обновите ... - person VC.One; 27.12.2016
comment
Я встроил swf в html-файл. Сетевая панель показывает мне подключение и ответ от сервера. Я вижу запрос Get и ответ от сервера. Сеть отвечает, но мигает по некоторым причинам (может быть в безопасности) не принимает событие data (я думаю) .//Complete и событие progress не срабатывают, но событие безопасности срабатывает и дало мне ошибку ответа 2048.bytesize всегда равен нулю как totalsize, так и availablesize. Спасибо - person feminkk; 28.12.2016
comment
Фактический запрос, который делает flash, - это server / crossdomain.xml. Но сервер ответит информацией об использовании вместе с сообщением об ошибке. Я ищу там информационную часть. - person feminkk; 28.12.2016
comment
Я слышу вас, но ... (1) Единственный способ получить такую ​​информацию с помощью кода AS3 - использовать API URLStream, поскольку он обрабатывает любые данные, отправленные сервером. (2) Вы записываете полученные байты путем копирования в некоторый массив байтов с помощью progressEvent, которое, по вашему мнению, не срабатывает ни разу, и поэтому с этой проблемой вы никогда не сможете выполнить шаги 1 или 2 .. (3) Команда load URLLoader предназначена для форматов декодирования изображений (или SWF), это неправильный инструмент, если вы не ожидаете загрузки действительных байтов для немного jpg, png или swf. (4) URLLoader странным образом также проверяет исходный URL-адрес загруженного контента, чтобы узнать, есть ли у вас права на отображение. - person VC.One; 28.12.2016