+  HandyCache форум
|-+  Главная категория» Общие вопросы» Content-Type при отдаче из кэша
Имя пользователя:
Пароль:
Страниц: [1]   Вниз
  Отправить эту тему    Печать  
Автор Тема: Content-Type при отдаче из кэша  (Прочитано 4006 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Inversion
Новичок
*

Репутация: +6/-0
Offline Offline

Сообщений: 17


WWW
« : 26 марта 2012, 14:56:21 »

Здравствуйте.

Есть проблемка.
При кэшировании объекта с хедером Content-Type: application/json; charset=utf-8 (GET запрос вида domain.com/ajax/getProviders).
Он потом отдается HC из кэша без какого-либо Content-Type, и это портит работу некоторых других обработчиков, которые полагаются на Content-Type.
Только что обновил HC, думал, может это уже исправлено, но нет, в последней версией HC работает так же.

Надеюсь, что это можно поправить…

Спасибо.

PS: Несколько раз попробовал воспользоваться формой для отправки сообщения автору, но получал alert с текстом, что недостаточно прав для просмотра этой страницы. Так и не знаю, ушло мое сообщение, или нет, поэтому решил еще и тему создать.
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #1 : 27 марта 2012, 13:14:29 »

Аpplication/json - это вероятно данные, которые гоняют через сеть приложения. Скорее всего их вообще не нужно кэшировать. Есть какие-то признаки в URL или содержимом, по которым их можно распознать?
Сообщить модератору   Записан
Inversion
Новичок
*

Репутация: +6/-0
Offline Offline

Сообщений: 17


WWW
« Ответ #2 : 27 марта 2012, 14:49:52 »

> Аpplication/json - это вероятно данные, которые гоняют через сеть приложения.
В моем случае это на сайте при работе в таком виде приходят ответы на внутренние ajax запросы (которые работают без обновления страницы).

> Скорее всего их вообще не нужно кэшировать.
Очень даже нужно. Я работаю с сайтом, данные на которую загружаются таким вот методом. Данные эти не изменяются, то есть каждый раз из сервера грузятся те самые. С помощью HC я настроил кэширование этих данных, и могу не зависеть от отклика сервера. В результате вместо полминуты ожидания результатов всех запросов из сервера, всё работает моментально. Такое вот принудительное кэширование веб-приложения для более быстрой работы. Не для этого ли создавался HC?

Недавно что-то на сервере поменяли, и данные начали приходить с другим хедером. Теперь моя система не работает корректно, так как HC теперь отдает эти данные без параметра Content-Type вообще.

> Есть какие-то признаки в URL или содержимом, по которым их можно распознать?

В URL точно нет, а вот по содержимому можно определить, что это json, но нужно анализировать. Безопаснее было бы вместе с кэшем хранить оригинальные хедеры, которые были в ответе сервера (возможно только в тех случаях, когда это не можно определить по контенту файла в кэше).
Сообщить модератору   Записан
mai62
Автор HC
*****

Репутация: +226/-4
Offline Offline

Сообщений: 6383


« Ответ #3 : 27 марта 2012, 16:07:47 »

Цитировать
Безопаснее было бы вместе с кэшем хранить оригинальные хедеры, которые были в ответе сервера
Я согласен с Вами. Но дело обстоит так, что заголовки ответов не хранятся, и это не изменишь щелчком пальцев. Поэтому ищу за что можно зацепиться.
Цитировать
возможно только в тех случаях, когда это не можно определить по контенту файла в кэше
Заголовок надо записывать на этапе записи файла, а определение контента делается при выдаче из кэша (и как показала практика в большинстве случаев этого достаточно). Если при записи еще пытаться определить контент, то будет лишняя нагрузка на компьютер.
Сообщить модератору   Записан
Inversion
Новичок
*

Репутация: +6/-0
Offline Offline

Сообщений: 17


WWW
« Ответ #4 : 27 марта 2012, 16:58:25 »

В случае с JSON, подозреваю, что легче будет что-то записывать при сохранении, чем анализировать контент (очевидного признака вроде как нет).

>Если при записи еще пытаться определить контент, то будет лишняя нагрузка на компьютер.
Но ведь при записи тип известен из хедера и определять не нужно?

Получается оптимальная логика работы вроде такого:
Если пришел application/json (или какой-то другой трудно определимый по контенту тип данных), то вместе с кэшем сохраняем хедер; иначе — сохраняем только контент.
А при чтении из кэша наоборот: проверяем, если хедер сохранен вместе с кэшем — используем его, иначе — определяем по контенту, как сейчас.

Ну и, насколько я знаю, этих разных Content-Type есть больше количество, и могут же появляться новые. Неужели легче поддерживать в актуальном состоянии систему распознавания типа по контенту, чем просто сохранять то, что пришло в ответе от сервера?


Рас уж пошла речь о сохранении вместе с кэшем дополнительных данных, то есть смежная задача.
В HC можно включить кэширование POST запросов. И я пробовал это делать с той же описанной мною целью, когда на сайте используется POST для обмена данными с сервером. Ну и конечно напоролся на то, что URL у разных запросов получается одинаковый, и в результате для всех запросов при чтении из кэша возвращается одинаковый ответ, тот который был закэширован последним.
Если бы для таких запросов кроме url сохранялся хэш/чексумма (sha1, md5…) от данных, которые передаются, то можно было бы различать разные POST запросы ну и определять те, которые уже закэшированы.
Как вариант, этот хэш можно было бы приписывать к имени сохраняемого файла (если хэш-функция точно не использует специальные символов в генерируемых результатах).

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

Ну вот написал всё, что крутилось в голове. Возможно что-то пригодится…
Сообщить модератору   Записан
mirny
Пользователь
**

Репутация: +11/-1
Offline Offline

Сообщений: 84


« Ответ #5 : 27 марта 2012, 17:05:08 »

Пришло время напомнить, что эта проблема уже как-то обсуждалась.
http://handycache.ru/component/option,com_smf/Itemid,10/topic,980.20/#msg32112
Сообщить модератору   Записан
Zoynels
Новичок
*

Репутация: +1/-0
Offline Offline

Сообщений: 42


« Ответ #6 : 02 апреля 2012, 18:28:34 »

Inversion, проще всего написать скрипт lua чтобы добавлялся Content-Type именно для твоих запросов.

Цитировать
у тебя например такой изначальный заголовок:
hc.answer_header = 'HTTP/1.1 200 OK\r\nLocation: domain.com/ajax/getProviders\r\n\r\n\r\n'

далее функцией
function AnswerHeaderReceived()
  hc.answer_header = re.replace(hc.answer_header, [[\r\n\r\n]] , 'Content-Type: application/json; charset=utf-8\r\n\r\n')
end

вот собственно и всё, вроде бы...
« Последнее редактирование: 02 апреля 2012, 18:33:30 от Zoynels » Сообщить модератору   Записан
Inversion
Новичок
*

Репутация: +6/-0
Offline Offline

Сообщений: 17


WWW
« Ответ #7 : 02 апреля 2012, 19:24:51 »

Можно, конечно, но в перспективе получается лишняя работа под каждый конкретный сайт. Это не хорошо.
Но, спасибо за готовое решение для этого случая.
Сообщить модератору   Записан
Страниц: [1]   Вверх
  Отправить эту тему    Печать  

 
Перейти в: