---------------------------------------------------------------
 Origin: http://www.cco.caltech.edu/~andreyb/filters.html
 Email: Andrey Beresnyak (andreyb@cco.caltech.edu)
 Home page: http://www.cco.caltech.edu/~andreyb/
---------------------------------------------------------------



Некоторое время назад, да и сейчас наверное, веб браузер мыслился
как некий универсальный инструмент, позволяющий распознавать все мыслимые
форматы файлов и кодировки. Естественно, производители браузеров не могли
этого обеспечить, слишком быстро развивалась Сеть, придумывались все новые
и новые способы представления данных. В обход проблемы были придуманы три
способа, два из них широко известны, а о третьем и пойдет речь.



Первые два упомянутых способа --  это хелперы (helpers) и плагины (plugins).



Это такое хелпер? Это, по сути, очень простая штука. Браузер скачивает
файл во временную директорию, запускает некое абсолютно абстрактное приложение
(хелпер) и передает ему этот файл в качестве аргумента. Иначе говоря, делает
то, что мы и сами могли бы сделать руками, только потратили бы на это лишнюю
пару секунд. Поскольку временный файл может кидаться в неизвестное вам место и
он удаляется после работы хелпера, многие предпочитают запускать хелпер
вручную. И правильно делают. Таким образом, никаких принципиально новых услуг
механизм хелперов нам не предоставляет. Он, может быть, немножко экономит
время.


Недостатки этого механизма очевидны --  во первых, браузер ждет, пока файл
скачается целиком и лишь потом запускает хелпер. Ждать бывает утомительно.
Помните, чем нетскейп победил мозаику? То-то же. Правда, некоторые хитрецы
придумали обход. Например, вместо того, чтобы скачивать целиком
Real Audio файл (.ra) вам подсовывают файл .ram, в котором лежит лишь адрес,
указывающий на сам файл со звуком. Хелпер запускается и потом сам берет
на себя обязанность соединяться с сервером и скачивать нужные файлы. Таким
образом, сам хелпер становится маленьким браузером. Результат --  хелпер
прибавляет в весе и возможно добавляет вам в систему новую дырку.


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


Плагин --  это уже лучше. Это такая штука, которая работает в более
тесном контакте с браузером и в принципе может и показывать что-то,
несмотря на то, что оно еще не скачалось (хотя акробат, например,
этого не делает), и разместится прямо на веб-страничке и т.п. и т.д.
Вот только такая любопытная штука. У меня в браузере стоит единственный
плагин --  Adobe Acrobat. Запускается он как только я загружаю какой-либо
.pdf файл. А выгружается когда? Запустите перед этим какой нибудь
таск менеджер, например top, и понаблюдайте. Даже если я нажимаю на браузере
кнопку "back" акробат и не думает выгружатся. Он о своей полезности  слишком
высокого мнения. А если пользователь обратно "forward" нажмет? :)


Потом, у каждого плагина --  свое управление, разбирайся с ним каждый раз.


А как хотелось бы, скажем, нажать за .zip файл и чтоб он сам распаковался
и показал содержимое прямо в браузере. Насколько облегчилась бы жизнь
посетителей книжной полки "Русской фантастики". А ведь есть такая возможность.



Пользователи Unix-оидного Netscape-a, наверное уже поняли о чем речь.
Ну, для них я и пишу. :) Да, в unix-овском нетскейпе реализован принцип
фильтра. Документы, имеющие определенный хидер Content-encoding могут
быть пропущены через фильтр. Так в нетскейпе реализовано встроенное
понимание форматов gzip и compress --  стандартных сжимальщиков файлов
в юниксе. Как это сделано? Читаем файл Netscape.ad:


! For those MIME content-encodings which are not directly understood
! internally, it is possible to specify another Unix program to use as
! a filter here.
!
! Each line in the encodingFilters resource consists of four fields,
! separated by colons and optional whitespace:
!
!     :  :  : 
!
! input-encoding:  The MIME encoding from the Content-Transfer-Encoding header.
!                  (The basic encodings 7BIT, 8BIT, BINARY, BASE64, and QUOTED-
!                  PRINTABLE are built-in; no need to specify those.)
!
! output-encoding: The encoding that results from this transformation.
!                  Leaving this empty is usually appropriate.
!
! extensions:      A comma-separated list of the extensions typically used for
!                  files in this encoding; if a document ends in one of these
!                  extensions, then when that document is saved to disk, the
!                  extension will be stripped off of the default file name
!                  (since documents are decoded before they are saved, and the
!                  extension would no longer accurately describe the file.)
!
! filter-command:  A shell command which reads from stdin and writes to stdout
!                  which does the actual decoding.
!
*encodingFilters:                                 \
        x-compress :  : .Z     : uncompress -c  \n\
        compress   :  : .Z     : uncompress -c  \n\
        x-gzip     :  : .z,.gz : gzip -cdq      \n\
        gzip       :  : .z,.gz : gzip -cdq      \n


Я немного поэкспериментировал с этой возможностью и вот результаты.
Скажем, у меня в файле .Xresources (aka .Xdefaults) есть следующая строчка
(переводы строки я поудалял от греха подальше).


Netscape*encodingFilters:    x-szip  :  : .sz : szip -d  \n x-compress :  : .Z : uncompress -c  \n compress  :  :  .Z    : uncompress  -c  \n  x-gzip     :  : .z,.gz : gzip -cdq  \n gzip       :  : .z,.gz : gzip -cdq \n zip        :  : .zip : gunzip | recode -ak \n


Заметьте --  старые фильтры тоже нужно оставить, а то пропадет возможность
смотреть .gz и .Z. Итак, что нужно, чтоб эта штука заработала, например,
чтобы автоматически распаковывались файлы, сжатые szip? Нужно, чтобы в хидере
передаваемого файла .sz была строка "Content-encoding: x-szip". И все.
К сожалению, немногие серверы вообще передают content-encoding. Так что
практической пользы эта находка вряд ли много принесет. Разве что заставите
пропускать за-gzip-ленные файлы еще через какой-нибудь нужный вам фильтр.
Но возможности то какие, возможности! Ведь действительно разных типов данных
совсем немного --  текст, картинка и звук. Зато разных форматов файлов,
архиваторов тьма тьмущая. Скажем, вместо того, чтобы запускать хелпер,
просматривающий Postscript файл, поставить фильтр, выдирающий из него текст
(такие есть) и смотреть этот текст прямо в браузере. Или поставить фильтр,
переводящий TeX в какой-нибудь, пусть и кривой, HTML.


Пишите, andreyb@cco.caltech.edu

Популярность: 17, Last-modified: Thu, 15 Jul 1999 07:42:35 GmT