Полезная информация

Заказывай стафф с атрибутикой Mozilla и... пусть все вокруг завидуют тебе! Быть уникальным - быть с Mozilla!

№109-07-2012 21:47:49

Sid
Участник
 
Группа: Extensions
Зарегистрирован: 10-05-2007
Сообщений: 5676
UA: Firefox 16.0

Работа с серверными HTTP-заголовками, что я делаю не так?

В Firefox 14 и выше пофиксили баг 754608.
Bug 754608 - [New Tab Page] shows thumbnails from pages with "Cache-Control: no-store", and HTTPS pages when HTTPS disk caching is disabled
Страницы с no-store в Cache-Control не будут сохранять свои эскизы для новой вкладки. Сделано это для безопасности, но оказалось, что сотни самых обычных страниц почему-то прописывают себе no-store (например, thepiratebay.se, kinopoisk.ru, ubuntu.ru, thevista.ru). Зачем они это делают, не знаю, но это реальность. Получается, что половина моих превьюшек совершенно пустая, хотя никакой секретной информации на сайте про Убунту, разумеется, нет.

Хотя в программировании я полный ноль, я попытался исправить это для себя, взяв за основу известное расширение InlineDisposition (оно меняет значение заголовка Content-Disposition). Я хотел переделать его, чтобы выреза́ть no-store из Cache-Control, для этого в файле inlinedisposition.js я заменил:

Выделить код

Код:

_re: /^\s*attachment/i,

    _httpResponse: function( chan )
    {
        var disp = "";

        try {
            chan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
            disp = chan.getResponseHeader("Content-Disposition");
        } catch (e) { }

        if (chan.loadFlags & Components.interfaces.nsIChannel.LOAD_DOCUMENT_URI && this._re.test(disp))
            chan.setResponseHeader("Content-Disposition", disp.replace(this._re, "inline"), false);
    }

на

Выделить код

Код:

_re: /[\s]*no-store[\s]*[,]?/i,

    _httpResponse: function( chan )
    {
        var disp = "";

        try {
            chan = chan.QueryInterface(Components.interfaces.nsIHttpChannel);
            disp = chan.getResponseHeader("Cache-Control");
        } catch (e) { }

        if (chan.loadFlags & Components.interfaces.nsIChannel.LOAD_DOCUMENT_URI && this._re.test(disp))
            chan.setResponseHeader("Cache-Control", disp.replace(this._re, ""), false);
    }

Некоторые странички с no-store начали сохранять эскизы, но вот, к примеру, те четыре, ссылки на которые я привёл выше, не хотят. ЧЯДНТ?

Отредактировано Sid (15-07-2012 18:16:14)

Отсутствует

 

№210-07-2012 00:18:40

Пандёнок
Участник
 
Группа: Extensions
Зарегистрирован: 04-11-2008
Сообщений: 5543
UA: Nightly 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

Sid
Так выложите его в "Расширения". Думаю, многие будут благодарны Вам.

Отсутствует

 

№310-07-2012 00:31:05

Sid
Участник
 
Группа: Extensions
Зарегистрирован: 10-05-2007
Сообщений: 5676
UA: Firefox 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

Пандёнок
То, что получилось, криво работает по непонятной мне причине. Это я просто приложил XPI, чтобы можно было легко потестить.

Отсутствует

 

№410-07-2012 01:02:52

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 13.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

В патче делается проверка на httpChannel.isNoStoreResponse(), а после удаления no-store isNoStoreResponse() по-прежнему true, так что, видимо, надо еще что-то удалить/изменить.

Добавлено 10-07-2012 01:22:17
Наверное, надо поизучать спецификации, а то какой-то второй BetterCache выходит.
Оно работает, но это слишком сурово, надо понять, что реально надо удалять.
Можно попробовать найти исходник nsIHttpChannel.isNoStoreResponse().

Добавлено 10-07-2012 01:24:50
А вообще, пусть переделывают патч, чтобы хотя бы закрепленные сайты были с превьюшками.

Отредактировано Infocatcher (10-07-2012 01:24:50)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№510-07-2012 06:41:01

hydrolizer
Участник
 
Группа: Extensions
Зарегистрирован: 22-07-2009
Сообщений: 1945
UA: Firefox 14.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

Infocatcher пишет

Можно попробовать найти исходник nsIHttpChannel.isNoStoreResponse().

http://mxr.mozilla.org/mozilla-central/ … l.cpp#1085

Выделить код

Код:

HttpBaseChannel::IsNoStoreResponse(bool *value)
{
  if (!mResponseHead)
    return NS_ERROR_NOT_AVAILABLE;
  *value = mResponseHead->NoStore();
  return NS_OK;
}

http://mxr.mozilla.org/mozilla-central/ … eHead.h#36

Выделить код

Код:

bool                  NoStore() const { return mCacheControlNoStore; }

а поле mCacheControlNoStore устанавливается, в частности, вот здесь:
http://mxr.mozilla.org/mozilla-central/ … ad.cpp#615

Выделить код

Код:

void
nsHttpResponseHead::ParseCacheControl(const char *val)
{
    if (!(val && *val)) {
        // clear flags
        mCacheControlNoCache = false;
        mCacheControlNoStore = false;
        return;
    }

    // search header value for occurrence(s) of "no-cache" but ignore
    // occurrence(s) of "no-cache=blah"
    if (nsHttp::FindToken(val, "no-cache", HTTP_HEADER_VALUE_SEPS))
        mCacheControlNoCache = true;

    // search header value for occurrence of "no-store" 
    if (nsHttp::FindToken(val, "no-store", HTTP_HEADER_VALUE_SEPS))
        mCacheControlNoStore = true;
}

вызовом вот отсюда:
http://mxr.mozilla.org/mozilla-central/ … ead.cpp#19

Выделить код

Код:

nsHttpResponseHead::SetHeader(nsHttpAtom hdr,
                              const nsACString &val,
                              bool merge)
{
    nsresult rv = mHeaders.SetHeader(hdr, val, merge);
    if (NS_FAILED(rv)) return rv;

    // respond to changes in these headers.  we need to reparse the entire
    // header since the change may have merged in additional values.
    if (hdr == nsHttp::Cache_Control)
        ParseCacheControl(mHeaders.PeekHeader(hdr));
    else if (hdr == nsHttp::Pragma)
        ParsePragma(mHeaders.PeekHeader(hdr));

    return NS_OK;
}

Во всём этом хозяйстве заставляет задуматься вот этот кусочек:

Выделить код

Код:

if (!(val && *val)) {
        // clear flags
        mCacheControlNoCache = false;
        mCacheControlNoStore = false;
        return;
    }

Уж не к тому ли это, что, что поля mCacheControlNoCache/mCacheControlNoStore устанавливаются в false только при совсем пустом хидере Cache-Control?

Отсутствует

 

№610-07-2012 11:00:02

Пандёнок
Участник
 
Группа: Extensions
Зарегистрирован: 04-11-2008
Сообщений: 5543
UA: Nightly 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

okkamas_knife
Вот именно. Размер эскизов во встроенном решении (точнее, во встроенной проблеме) - 800х600. ошибся - 640х360.
Для сравнения: Fast Dial сохраняет эскизы размером 300х225, SuperStart - 212х132, FVD SpeedDial - 400х480, Рабочий стол - 286х202.

Отредактировано Пандёнок (10-07-2012 14:39:23)

Отсутствует

 

№710-07-2012 11:06:51

Пандёнок
Участник
 
Группа: Extensions
Зарегистрирован: 04-11-2008
Сообщений: 5543
UA: Nightly 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

okkamas_knife
Да, реально. Причем они в папке thumbnails с расширением .png, никак не спрятаны. И их не девять штук, а много. В общем, кеш всех недавно посещённых страниц в картинках.

Добавлено 10-07-2012 11:13:22

okkamas_knife пишет

взять и поставить спиддиал

А вот это вредный совет. Как раз в классическом SpeedDial размер эскизов в кеше - 800х800!

Отредактировано Пандёнок (10-07-2012 11:16:57)

Отсутствует

 

№810-07-2012 11:46:35

Пандёнок
Участник
 
Группа: Extensions
Зарегистрирован: 04-11-2008
Сообщений: 5543
UA: Nightly 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

okkamas_knife пишет

спиддиал назвал только потому что помню название ибо подобными расширениеями не пользуюсь и считаю их бесполезными т тормозящими.

Да, как раз спиддиал самый тормозящий. Я на почти новом профиле не дождался, когда же он загрузит эскизы. 8-(

Отредактировано Пандёнок (10-07-2012 11:47:04)

Отсутствует

 

№910-07-2012 14:21:15

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 13.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

hydrolizer пишет

Уж не к тому ли это, что, что поля mCacheControlNoCache/mCacheControlNoStore устанавливаются в false только при совсем пустом хидере Cache-Control?

Возможно... :/
У меня выходит, что надо удалить Cache-Control, а вот Pragma почему-то не мешает.

Как-то так, но это весьма корявое решение.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1010-07-2012 14:38:57

Пандёнок
Участник
 
Группа: Extensions
Зарегистрирован: 04-11-2008
Сообщений: 5543
UA: Nightly 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

okkamas_knife
Вот подвела меня память. Во встроенном решении всё-таки 640х360. Но это тоже немало.

Отсутствует

 

№1115-07-2012 14:39:17

Sid
Участник
 
Группа: Extensions
Зарегистрирован: 10-05-2007
Сообщений: 5676
UA: Firefox 16.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

Эх, всё оказалось совсем запущено. Будем писать в мозиллу.
Но спасибо за помощь! :beer:

Infocatcher пишет

А вообще, пусть переделывают патч, чтобы хотя бы закрепленные сайты были с превьюшками.

Вот-вот. Определённая логика в этом патче есть, но когда половина сайтов использует Cache-Control от фонаря, то получается маразм: скриншот аккаунта PayPal (на котором можно прочитать имя, баланс и список последних платежей) сохраняется, а невинная страничка ya.ru — нет.

Отсутствует

 

№1217-07-2012 07:34:00

TLemur
Забанен
 
Группа: Members
Зарегистрирован: 18-10-2004
Сообщений: 1764
UA: Firefox 13.0

Re: Работа с серверными HTTP-заголовками, что я делаю не так?

https://bugzilla.mozilla.org/show_bug.cgi?id=756881
https://bugzilla.mozilla.org/show_bug.cgi?id=725189

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]