Этот документ описывает новые двоичные форматы файлов, впервые представленные в Opera версии 5, для различных файлов, используемых в управлении кэшем и cookie.
Новый родовой формат, на котором эти файлы основываются, структурирован как последовательность отмеченных записей с заданной длиной. Каждая запись может содержать множество различных типов данных, таких как строки и целые числа, так же как и произвольные двоичные данные, такие как новых записи в этом формате.
Родовой формат обратно НЕ совместим с Opera 3.x и более ранними, но предназначен быть приемлимо совместимым для версии 4.0 и более поздних. Это означает, что, если новые поля будут добавлены более новой версией, старые версии все еще будут в состоянии читать информацию, которую они понимают, игнорируя те поля, которые они не понимают.
Есть некоторые ограничения, но они главным образом они касаются числа старших битов в целых числах, которые используются для индикации длин записи. Форматы теперь используются для сохранения индексного файла кэша (dcache4.url), файла посещенных ссылок (vlink4.dat), файла сохраненных загрузок (download.dat) и файла cookie (cookies4.dat). Форматы описанный в следующей последовательности:
Форматы для истории окон, новых файлов и файлов общей истории такие же как и уже используемые Opera v3.x и их описание находится вне контекста этого документа.
Целые числа, используемые в формате без знака, и сохранены в стиле с обратным порядком байтов/сетевом (сначала наиболее старший бит). Целые числа, сохраненные в записях, также сохранены в формате с обратным порядком байтов, но могут быть подписаны, и могут быть усечены.
В этом документе используются следующие типы данных:
| int* | Число со знаком * байтов |
| uint* | Число без знака * байтов |
| byte | 8-битное значение без знака |
| string | Последовательность символов (не оканчивающаяся нулем) |
| time_t | uint32 представляет значение времени в секундах прошедших после 00:00 1 января, 1970 GMT. Представление может быть увеличено более 32 битов в будущем. |
| tag_id_type | Размер unsigned integer которого определен полем заголовка idtag_length. Приложение может преобразовать из этого типа в свое внутреннее представление unsigned integer, предпочтительно uint32. Для получения дополнительной информации смотрите формат заголовка файла. |
| payload_length_type | Размер unsigned integer которого определен полем заголовка length_length. Приложение может преобразовать из этого типа в свое внутреннее представление unsigned integer, предпочтительно uint32. Для получения дополнительной информации смотрите формат заголовка файла. |
| record | Отдельно определенная последовательность полей |
Общий формат записи имеет такую форму:
struct record
{
// Определенный приложением тэг для идентификации типа содержимого
tag_id_type tag_id;
// длинна payload
payload_length_type length;
// Payload/содержимое записи
bytepayload[length];
};
Предупреждение: Число байтов в тэге и длине может измениться, см. ниже.
Поля некоторых записей имеют следующее значение:
Идентификатор записи. Это значение определяется приложением и может использоваться для индикации значимости полезного содержимого.
Актуальный тип содержимого записи зависит от определений, используемых для актуального файла или супер-записи.
Значения ‘tag_id’, в которых MSB установлен в 1, зарезервированны для записей с неявной длинной. Поле ‘tag_id’ НЕ следует ни за полем ‘length’, ни за буфером ‘payload’. Такие записи используются как ‘Boolean’-флаги: Истинно — если присутствуют, Ложь — если отсутствуют.
В двоичной памяти файла это означает, что MSB целого числа внутренней памяти должен быть сохранен как MSB первого байта в поле тэга. Это помещает ограничение в том, сколько тэгов может использоваться для длинны целого числа данного ‘tag_id’. Когда файл читается в программу, программа должна заботиться о том, чтобы переместить MSB сохраненного в двоичном виде тэга к общей (внутренней) позиции двоичного разряда, такой как MSB собственных целых чисел без знака программы.
| Байты | Максимальной доступный id (исключая MSB) |
|---|---|
| 1 | 0x7f |
| 2 | 0x7fff |
| 3 | 0x7fffff |
| 4 | 0x7fffffff |
Если это технически возможно использовать те же самые id-тэгов (без MSB) для нормальной записи и запись флага (такую как 0×0001 [16-битный тэг] для записи ‘payload’ и ‘0×8001’ для записи флага), это не поощряется.
Это поле является числом байтов в ‘payload’ которое следует непосредственно после поля. Оно может быть нулевым.
Payload — последовательность байтов длины, индицируемое полем ‘length’.
Значение содержания индицируется по определению для данной записи или структуры файла. Примерами организации может быть массив записей, целых чисел без знака, целых чисел со знаком, или символов.
Рекомендуется использование только типов записей, описанных здесь, если тип данных изменяется, как переменные (неотмеченные) типы форматов имеющие тенденцию быть негибкими и трудноподдерживаемыми в различных версиях, особенно когда совместимость со старшими версиями желательна.
Одиночные целые числа (подписанные или без знака) могут быть усечены (удаленные нулевые байты), но массивы целых чисел должны всегда использовать фиксированное число байтов, чтобы представить значения и получить число элементов от ‘payload length’. Если число байтов должно было представить изменения значений в будущей версии, должен использоваться новый тэг.
Эти элементы сохраняются не как записи, а непосредственно в двоичном виде:
uint32 file_version_number; uint32 app_version_number; // число битов в id тэге, теперь 1 uint16 idtag_length; // число байтов в части длины записи, теперь 2 uint16 length_length; // массив записей, количество определяется длинной файла struct record items[];
Текущий номер версии формата файла (file_version_number) — 0×00001000, где младшие 12 битов (bitmask 0x00000fff) представляют младший номер версии, остальные — главный номер версии. Изменения в главном номере версии не могут быть использованы если формат файла изменится таким образом, что старые версии программного обеспечения не смогут нормально прочитать файл. Если главный номер версии новее (или старее) чем тот, который приложение может читать, оно не сможет прочитать файл.
Размеры целых чисел абсолютны для данной главной версии, а размер целого числа для номера версии файла зафиксирован в любой версии.
‘app_version_number’ — номер версии приложения и независим от ‘file_version_number’. Он может быть использован приложением для определения необходимых действия, которые нужны для обеспечения прямой или обратной совместимость, которая находится вне диапазона форматов файла. Интерпретация номера версии приложения — определяется приложением.
Поля ‘idtag_length’ и ‘length_length’ дают количество байт, использованных в записи для “id”-тэгов, как определено полем ‘tag_id_type’, а поля ‘payload length’ — как определено полем ‘payload_length_type’, соответственно.
Подробнее, значения этих полей определяют ‘tag_id_type’ и ‘payload_length_type’ как следующие типы целых чисел:
| Значение | tag_id_type | payload_length_type |
|---|---|---|
| in | idtag_length | length_length |
| 1 | uint8 | uint8 |
| 2 | uint16 | uint16 |
| 3 | uint24 | uint24 |
| 4 | uint32 | uint32 |
Внутреннее представление приложением этих форматов не определено, но рекомендуется — uint32. Как приложение будет обрабатывать значения ‘idtag_length’ или ‘length_length’ больше 4, или значения, большие чем его внутренний unsigned integer размер, не определено, но приложение должно применить правила, определенные для таких ситуаций в руководстве по прямой совместимости.
Настоящая версия Opera 4.x использует idtag_length=1 (uint8) и length_length=2 (uint16).
После заголовка следуют только записи. Организация записей и их интерпретация определяется приложением.
Старая версия приложения, используя этот формат файла, который является НЕ способным использовать длинные целых числа, независимо от этого, должна пробовать обработать файл, но должна обойти запись, если тэг числового значения записи превышает собственный диапазон целого числа для версии, то есть если целое число переполнено. Однако, если длина записи превышает ограничения приложения на целые числа или возможности буфера, оно не сможет продолжить обработку файла.
Все приложения должны игнорировать значения тэгов, которые они не понимают.
Этот раздел описывает тэги и форматы записей, используемых для файлов посещенных ссылок (vlink4.dat), индексных файлов дискового кэша (dcache4.url) и файлов сохраненных загрузок (download.dat). Настоящий ‘app_version_number’ таких файлов — 0×00020000 (старшая версия 2, младшая 0).
Эти файлы используют записи (различные значений тэгов), которые содержат последовательность записей с тэгами из тех же наборов ID тэгов. Различные файлы используют следующие теги для своих записей:
| Файл | Tag id | Номер версии |
|---|---|---|
| Дисковый кэш | 0×01 | 0×00020000 |
| Посещенные ссылки | 0×02 | 0×00020000 |
| Загрузка | 0×41 | 0×00020000 |
Каждый файл состоит из записей ТОЛЬКО этих типов, за исключением индексного файла дискового кэша кроме них содержащий еще одну запись с id 0×40, которая содержит 5 строк символов, используемых для поиска следующего свободного номера файла кэша (oprXXXXX).
Каждая запись снова является последовательностью записей в том же самом формате в двоичном представлении как и записи в файле.
Эти элементы используются всеми связанными с кэшем файлами. В случае посещенных ссылок, они - единственные поля, используемые в настоящее время.
Предупреждение: “(0×0001 | MSB_VALUE)” означает, что старший значащий бит в локальном целом числе без знака должен быть установлен. Если используется 32-битное значение, то это означает, что значение тэга — 0×80000001.
| ID тэга | Содержание | Значение |
|---|---|---|
| 0×0003 | string | Имя URL, fully qualified |
| 0×0004 | time_t | Последнее посещенное |
| (0x000b | MSB_VALUE) | flag | URL, являющийся результатом запроса формы |
| 0×0022 | record | Содержит имя и последнее время посещения относительной ссылки в документе. Может повторяться |
| ID тэга | Содержание | Значение |
|---|---|---|
| 0×0023 | string | Имя относительной ссылки |
| 0×0024 | time_t | Последняя посещенная |
| ID тэга | Содержание | Значение |
|---|---|---|
| 0×0005 | time_t | Локальное время, когда файл последний раз загружен, не GMT |
| 0×0007 | uint8 | Статус загрузки: 2 — Загружен 4 — Загрузка прервана (пользователем) 5 — Загрузка оборвана |
| 0×0008 | uint32 | Размер содержимого |
| 0×0009 | string | MIME-тип содержимого |
| 0x000a | string | Набор символов содержимого |
| (0x000c | MSB_VALUE) | flag | Файл загружен и сохранен локально на диске пользователя, и не является частью директории дискового кэша |
| 0x000d | string | Имя файла (файлы кэша: только локально в директорию кэша) |
| (0x000f | MSB_VALUE) | flag | Всегда проверять если обновлен |
| 0×0010 | record | Содержит специфичную информацию о HTTP-протоколе |
| ID тэга | Содержание | Значение |
|---|---|---|
| 0×0028 | time_t | Идентифицирует время начала загрузки последнего/предыдущего сегмента загружаемого файла. |
| 0×0029 | time_t | Идентифицирует время остановки загрузки последнего/предыдущего сегмента загружаемого файла. |
| 0x002A | uint32 | Сколько байтов находится в предыдущем сегменте файла, который начал загружаться. Если время окончания загрузки не известно, это значение это значение предположительно равно (0) и скорость загрузки устанавливается в ноль (неизвестно). |
Все методы по умолчанию являются GET, в настоящее время невозможно кэшировать POST-запросы.
| ID тэга | Содержание | Значение |
|---|---|---|
| 0×0015 | string | Заголовок данных HTTP |
| 0×0016 | time_t | Дата истечения срока хранения |
| 0×0017 | string | Дата последнего изменения |
| 0×0018 | string | MIME-тип документа |
| 0×0019 | string | Тэг объекта |
| 0x001A | string | Перемещен на URL (заголовок местоположения) |
| 0x001B | string | Текст строки ответа |
| 0x001C | uint32 | Код ответа |
| 0x001D | string | Обновленный URL |
| 0x001E | uint32 | Refresh delta time |
| 0x001F | string | Предложенное имя файла |
| 0×0020 | string | Кодировка содержимого |
| 0×0021 | string | Местоположение содержимого |
| 0×0025 | uint32 | Вместе с тэгом 0×0026 (должны присутствовать оба) это определяет последний использованный для загрузки ресурса параметр User Agent для загрузки ресурса. Это значение определяет строку User Agent. Это значение для внутреннего использования, и не должно быть изменено. |
| 0×0026 | uint32 | Вместе с тэгом 0×0025 (должны присутствовать оба) это определяет последний использованный для загрузки ресурса параметр User Agent для загрузки ресурса. Это значение определяет подверсию User Agent. Это значение для внутреннего использования, и не должно быть изменено. |
| (0×0030 | MSB_VALUE) | flag | Зарезервировано для будущего использования |
| (0x0031 | MSB_VALUE) | flag | Зарезервировано для будущего использования |
Этот раздел описывает тэги и форматы записей, используемых для сохранения cookies (cookies4.dat). Настоящее значение ‘app_version_number’ этих типов файлов — 0×00002000 (старшая версия — 2, младшая — 0).
Файлы cookie организуются в виде древа компонентов доменных имен, каждый компонент тогда хранит дерево компонентов пути, и каждый компонент пути может содержать множество cookies.
Предупреждение: Компоненты — последовательность записей, заканчивающаяся записью флажка, не одиночная запись.
Компоненты домена используются для организации cookies для каждого сервера и домена, для которых cookies или возможность фильтрации cookie определены.
Компоненты домена начинаются с записи домена (domain record), которая содержит имя домена (domain name) и некоторые флаги для этого специфичного домена. Затем следуют компоненты пути (path component) хранения cookies и компоненты пути (path component) к поддиректории (и cookies), следуют прерыватель компонента пути ([Path component terminator]) и некоторое количество компонентов поддомена ([other domains]) пока они не будут прерваны записью флага окончания домена (end of domain flag)
Например: cookies для домена www.opera.com will будут сохранены в виде:
["com" record]
["opera" record]
["www" record
[cookies]
[Path components]
[Path component terminator]
[other domains]
[end of domain flag ("www")]
[end of domain flag ("opera")]
[end of domain flag ("com")]
Все имена компонентов домена приводятся без точек, кроме IP-адресов, которые могут быть сохранены только с полным IP-адресом как взятый в кавычки параметр, например “10.11.12.13”, сохраняются на верхнем уровне и не могут содержать другие поддомены.
Запись домена (Domain Record) использует тэг “0×01“ и содержит последовательность этих полей:
| ID тэга | Содержание | Значение |
|---|---|---|
| 0x001E | string | Имя части домена |
| 0x001F | int8 | Как фильтруются cookies для этого домена. Если не представлен, то используется фильтрация для домена верхнего уровня. 1. Все cookies от этого домена принимаются. 2. Cookies от этого домена не принимаются. 3. Все cookies от этого домена принимаются. Отменяет 1 и 2 для доменов более верхнего уровня автоматически. 4. Cookies от этого домена не принимаются. Отменяет 1 и 2 для доменов более верхнего уровня. Настройки домена применяются ко всем поддоменам, кроме тех, для которых выбранны специфические настройки сервера. |
| 0×0021 | int8 | Обработка cookies, которое имеет явные пути, не соответствующие URL, устанавливающему cookies. Если включено в настройках безопасности, то по-умолчанию — спросить пользователя, но если включено предупреждение такие cookies могут быть отфильтрованны их доменами: Значение 1 означает отклонить, а 2 — принять автоматически. |
| 0×0025 | int8 | Когда включен режим “Предупреждать о сторонних cookies”, это поле может быть использовано для автоматической фильтрации таких cookies. 1. Все сторонние cookies от этого домена принимаются. 2. Сторонние cookies от этого домена не принимаются. 3. Все сторонние cookies от этого домена принимаются. Отменяет 1 и 2 для доменов более верхнего уровня автоматически. 4. Сторонние cookies от этого домена не принимаются. Отменяет 1 и 2 для доменов более верхнего уровня. Настройки домена применяются ко всем поддоменам, кроме тех, для которых выбранны специфические настройки сервера. |
Эта запись может сопровождаться нулевым или большим количеством компонентов пути, определяющими пути верхнего уровня на серверах в домене и всегда заканчивается записью прерывания компонента пути. Затем может следовать ноль или больше компонентов домена.
Компонент домена заканчивается записью флага (0×0004 | MSB_VALUE).
Компоненты пути организуют cookies определенные для данной директории в данном домене, также любые поддиректории этй директории, для которых определены cookies.
Кроме компонентов пути, начинающихся непосредственно после записи компонента домена, эти компоненты пути всегда начинается с записи пути (path record) и затем продолжается тем же самым количеством записей cookie и компонентов пути к поддиректории.
Запись пути (path record) использует id записи “0×0002“ и запись имеет такую запись поля:
| ID тэга | Содержание | Значение |
|---|---|---|
| 0x001D | string | Имя части пути (path part) |
Компонент пути заканчивается записью флага (0×0005 | MSB_VALUE).
Значения cookie сохраняются в записях типа “0×0003” и имеют следующие записи полей:
| ID тэга | Содержание | Значение |
|---|---|---|
| 0×0010 | string | Имя cookie |
| 0×0011 | string | Значение cookie |
| 0×0012 | time_t | Срок хранения |
| 0×0013 | time_t | Последнее использование |
| 0×0014 | string | Комментарий/Описание использования (RFC 2965) |
| 0×0015 | string | URL для Комментария/Описания использования (RFC 2965) |
| 0×0016 | string | Домен получен с версией=1 cookies (RFC 2965) |
| 0×0017 | string | Путь получен с версией=1 cookies (RFC 2965) |
| 0×0018 | string | Ограничения порта получены с версией=1 cookies (RFC 2965) |
| (0x0019 | MSB_VALUE) | flag | Cookie будет отправлен только на HTTPS-сервера. |
| 0x001A | int8+ | Номер версии cookie (RFC 2965) |
| (0x001B | MSB_VALUE) | flag | Этот cookie будет отправлен только на сервер, которые его прислал. |
| (0x001C | MSB_VALUE) | flag | Зарезервировано для защиты от удаления: Еще не осуществлена |
| (0x0020 | MSB_VALUE) | flag | Этот cookie не будет отправлен если путь состоит только из префикса URL. Если путь будет соответствовать /foo, /foo/bar, но не /foobar. |
| (0x0022 | MSB_VALUE) | flag | Если истинно, этот cookie помечается как результат формы входа в систему с паролем, или URL который было найден, используя cookie, который может быть прослежен назад к этому cookie. |
| (0×0023 | MSB_VALUE) | flag | Если истинно, этот cookie помечается как результат HTTP опознавательный вход в систему, или URL который было найден, используя cookie, который может быть прослежен назад к этому cookie. |
| (0x0024 | MSB_VALUE) | flag | В режиме “Предупреждать о сторонних cookies” этот флаг будет установлен если cookie установлен сторонним сервером, и только эти cookies могут быть посланы если URL сторонний. Cookies, сохраненные при загрузке URL непосредственно с сервера не будут отправляться на сторонние URLы в этом режиме. Противоположное — НЕ истинно. Предупреждение: Если сторонние сервера переадресуют назад на посещаемый сервер, переадресованный URL считается сторонним. |
Оригинал статьи: Opera File Formats
Copyright Opera Software ASA. Все права зарезервированы
OperaFan.net, 2007. Ermir, неофициальный перевод.