Предполагаю что может мешать передаче двоичных данных из скриптов. …
Понемногу вникаю как работает программа Web Proxy версии 2.0. Во-первых выражаю уважение автору за красивый лаконичный код, в котором мне есть чему поучиться. Но в паре мест мне показалось, что некоторые операции (например, получение имени сервиса и подобные) написаны не теми инструкциями – пока не осмелюсь утверждать на 100%, но возможно более удобные свойства классов появились после написания кода. А может быть есть какие-то нюансы, которые я ещё не понял.
Программа, анализируя URL, вычисляет какого рода файлы запрошены, и, либо берёт их через Opera File I/O API напрямую с диска, либо обращается к локалхосту через XMLHttpRequest. Меня удивило отсутствие инструкции .onreadystatechange. Если кто знает как дальше идёт работа кода – подскажите пожалуйста. Меня смущает, что обработка только что отправленного методом .send запроса начинается тут-же – мгновенно – не взирая на статус запроса.
Первая проблема. Двоичные данные не показываются из скрипта. (повторюсь, что при локальном доступе на виртуалхост, скрипт картинку показывает)
Пока что я вижу, что при выполнении PHP-скрипта, отправляющего ответом картинку (как положено – с заголовком), программа обращается к локалхосту через XMLHttpRequest, получает и передаёт (на выход) заголовки, а вот двоичные данные явно не проходят. Браузер Opera версии 11.52 для Linux показывает мне такую информацию о "файле": MIME type: image/png; Size of main page: 252 bytes; Downloaded: 10/28/2011 09:11:35 PM; Local cache file: – no cache file -. (объём картинки, которую я формирую в скрипте – 1741 байт.)
Пока что предполагаю, что проблема с застреванием двоичных данных в том, что ответ сервера читается как строка – как текст – методом .responseText.
Вторая проблема. Скрипты не получают IP посетителей сайта.
С этим проще. Очевидно, что когда Opera Unite Web Server обращается к виртуалхосту локально, то передаётся локальный IP, а не того, кто обратился к Opera.Unite-узлу снаружи. Как вариант – формировать дополнительный заголовок запроса (в дополнение к передаваемым) на стадии формировании AJaX-запроса.
Буду продолжать разбираться, т.к. сильно заинтересован в улучшении этой программы.
Дополняю:
1) Действительно – двоичные данные запрашиваются и приходят некорректно, код ожидает получить текст, стремится декодировать из кодировки.
2) Мне удалось получить корректные заголовки – MIME-type и точный размер ожидаемого файла.
3) Я предполагаю как эффективнее улучшить код: если поле "Content-type" не содержит сочетаний 'text/' или 'message/', то перезапросить данные другим способом.
4) Я отыскал на просторах Сети информацию на английском и русском о том, как корректно получить с помощью XMLHttpRequest двоичные данные.
Дополняю: свойство .onreadystatechange не используется потому, что флаг асинхронности выставлен в значение "false" и, таким образом, инструкции, следующие после метода .send(), выполняются после завершения запроса.
Дополняю: УРА!!! Удалось передать картинку из скрипта!!! ТРОЕ СУТОК поисков и мучений, головной боли и страданий!!! Ошибка создания объекта ByteArray и поиски способа его создания! (уже в отчаяньи думал, что требуется установка флеша, но выяснилось, что не требуется!) Теперь осталась фактически рутина. Буду стараться сделать универсальную передачу любых типов данных, причём с первого запроса, иначе запросы будут двойными, в парах: пробный и окончательный.