Как я могу сгенерировать модифицированные заголовки http с помощью Compojure? - PullRequest
4 голосов
/ 25 мая 2011

Я пытаюсь повысить производительность клиентов, выбирающих страницы с моего веб-сервера Compojure.Мы обслуживаем кучу статических файлов (JS, CSS), используя (compojure.route/resources "/"), который ищет файлы в файловой системе, преобразует их в URL-адреса, а затем передает их в Ring в виде потоков.При преобразовании в потоки, похоже, теряются все метаданные файла, такие как время мода.

Я могу обернуть обработчик статического ресурса и добавить заголовок Expires или Cache-Control: max-age, но это мешает клиентуот отправки любого запроса вообще.Полезно, но эти файлы иногда изменяются (когда мы выпускаем релиз).

В идеале я бы хотел, чтобы клиент доверял своей собственной кэшированной версии, скажем, в течение часа, и делал запрос сIf-Modified-Since заголовок по истечении этого часа.Тогда мы можем просто вернуть 304 Not Modified, и клиент избегает загрузки нескольких сотен килограмм javascript.

Похоже, я могу установить заголовок Last-Modified при обслуживании ответа, и это приводит к тому, что клиент готовится к последующемузапросы с If-Modified-Since заголовками.Отлично, за исключением того, что мне пришлось бы переписать большую часть кода в compojure.route/resources, чтобы добавить Last-Modified - не сложно, но утомительно - и придумать еще немного кода для распознавания и ответа на заголовок If-Modified-Since.Не монументальная задача, но и не простая.

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

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

FWIW, я заставил это работать с помощью промежуточного программного обеспечения Ring wrap-file-info; Я смущен тем, что искал это в Compojure вместо Ring. Однако обработчики compojure.route files и resources обслуживают восходящие потоки вместо файлов или URL-адресов, и, конечно, Ring не может определить метаданные из этого.

Мне пришлось написать в основном копию resources, которая вместо этого возвращает File; когда завернут в wrap-file-info, что соответствует моим потребностям. Тем не менее, не возражаю против немного лучшего решения, которое не включает копирование фрагмента кода из Compojure.

1 голос
/ 25 мая 2011

Рассматривали ли вы использование ring-etag-middleware ?Он использует дату последнего изменения файла для создания тега объекта.Затем он указывает код 304 на совпадение с заголовком if-none-match в запросе.

...