Opera のファイル形式

はじめに

このドキュメントでは、Opera 5 でキャッシュや cookie を管理するのに用いられるファイル用の新しいバイナリファイルについてご説明します。

以下のファイルがベースとする新しい一般的な形式は、長さが規制されたタグつきレコードのシークエンスとして構成されています。それぞれのレコードには、この形式内の新しいレコードなどの任意のバイナリデータ、文字列や整数値のように数多くの異なるデータタイプが含まれることがあります。

一般的な形式は Opera 3.x およびそれ以前のバージョンとは互換性がありませんが、Opera 4.0 およびそれ以降のバージョンとは、かなりの程度の互換性があります。すなわち、今後のバージョンで新しいフィールドが追加された場合、古いバージョンで、理解できないフィールドは無視する一方で、理解した情報を読むことができるということです。

幾つかの制限がありますが、これらの制限は主に、レコード長を指定するのに利用される整数における上位ビットの多くに関わるものです。同形式は現在ディスクキャッシュのインデックスファイル(dcache4.url)や訪問済みのリンクファイル(vlink4.dat)、ダウンロードレスキューファイル(download.dat)、cookie ファイル(cookies4.dat)などを保管するのに使われています。また、同形式は以下の連続によって記述されています:

ウィンドウの履歴やニュースファイル、全体履歴ファイルの形式は、Opera v3.x で用いられているのと同形式で、このドキュメントでは対象外となります。

一般的なバイナリ形式

データタイプ

同形式で用いられ、符号なしで、ビッグエンディアン/ネットワークのスタイル (最上位バイトが先に来る)に保管されている整数値。レコード内に保管されている整数値は、ビッグエンディアン形式にも保管されますが、符号が付されたり、切り捨てられたりすることがあります。

このドキュメントでは以下のデータタイプが使われています:

int** ビットの符号つき整数値
uint** ビットの符号なし整数値
byte8 ビット符号なし値
string文字の連続 (null terminated ではありません)
time_t1970 年1 月1 日 00:00:00(GMT)以来の時間値を秒で返す uint32。将来、戻し値が溢れてしまうことがあります。
tag_id_type符号なしの整数値 で、idtag_length ヘッダーフィールドがサイズを選択します。アプリケーションは、このタイプを内部の符号なし整数値の戻しへ、できれば uint32 へ変換する必要があります。詳細は ファイルヘッダー形式をご覧ください。
payload_length_type符号なしの整数値 で、length_length ヘッダーフィールドがサイズを選択します。アプリケーションは、このタイプを内部の符号なし整数値の戻しへ、できれば uint32 へ変換する必要があります。詳細は ファイルヘッダー形式をご覧ください。
record単独で拒否されたフィールドのシークエンス

データレコード

通常のレコード形式のフォームは以下の通りです:

struct record
{
// application specific tag to identify content type
tag_id_type tag_id;
// length of payload
payload_length_type length;
// Payload/content of the record
bytepayload[length];
};

ご注意: タグと長さのバイト数は変更することもあります。下記をご覧ください。

それぞれのレコードのフィールドには以下の意味があります:

tag_id

レコードの識別子。この値はアプリケーション限定で、ペイロードコンテンツの意味を示すのに用いられます。

レコードの実コンテンツタイプは、実ファイルまたは super-record で用いられる定義によります。

MSB(最上位ビット)の値が 1 に設定されている tag_id は、no length のレコード用に保存しておかれます。length フィールドやペイロードバッファは tag_id フィールドに従いません。これらのレコードは Boolean フラグとして用いられます: 存在する場合は true、しない場合は false となります。

ファイルのバイナリ保管において、これは内部保管の整数値の MSB(最上位バイト)は、タグフィールドにおける最初のバイトの MSB として保管される必要があるということを意味します。これにより、所与の tag_id の length 整数値に用いることのできるタグ数の制限が設けられます。ファイルがプログラムの中に読まれると、プログラムはタグを保管した MSB を、プログラムそれ自体の符号なしの MSB のように、共通(内部)のビットポジションへ移動するよう処理する必要があります。

bytesMax id available (excluding MSB)
10x7f
20x7fff
30x7fffff
40x7fffffff

通常のレコードやフラグレコード(ペイロードレコード用の 0x0001 [16 ビットタグ] やフラグレコード用の 0x8001 など)用に、同じ tag id(MSB なし) が技術的に利用可能な場合には、これは推奨されません。

length
このフィールドは、フィールドの直後に続くペイロードにおけるバイト数になります。ゼロのこともあります。
payload

ペイロードは、length フィールドで指定される length のバイトのシークエンスになります。

同コンテンツの意味は、所与のレコードもしくはファイル構成の定義で示されます。編成例は、レコードや符号なしの整数値、符号つきの整数値、または文字列などの配列であることもあります。

特に旧バージョンとの互換性が必要とされる際に、可変(タグなし)のタイプの形式が柔軟性に乏しくバージョンごとの相違に対応しにくい傾向があるものの、データのタイプが変化する場合は、ここで記載されているタイプのデータのみをご使用になるよう推奨します。

単一のアイテムの整数値(符号つきもしくは符号なし)は切り捨てられることもあります(ゼロバイトを削除)が、整数値の配列は常に固定のバイト数を用いて値を示し、ペイロードの length からアイテム数を導き出す必要があります。バイト数が将来のバージョンにおける値の変更を表示する必要があった場合は、新しいタグが用いられます。

ファイル形式

以下の要素はレコードとして保管されませんが直接バイナリに保管されます:

uint32 file_version_number;
uint32 app_version_number;
// number of bytes in the id tag, presently 1
uint16 idtag_length;   
// number of bytes in the length part of a record, presently 2
uint16 length_length;  
// array of records, number determined by length of file
struct record items[]; 

ファイル形式の現行バージョンのナンバー(file_version_number)は 0x00001000 となり、下位の 12 ビット(bitmask 0x00000fff)がマイナーバージョンのナンバーを示し、残りがメジャーバージョンのナンバーとなります。ソフトウェアの旧バージョンがファイルをうまく読むことができないような方法でファイル形式が変更された場合は、マイナーバージョンにおける変更は 使用してはなりません。マイナーバージョンのナンバーが、アプリケーションが読むことができるよりも新しい(古い)場合、ファイルを読んではなりません

整数値のサイズは所与のメジャーバージョンに対し絶対で、ファイルのバージョンナンバーの整数値サイズはどのバージョンにおいても固定されています。

"app_version_number" とは、アプリケーションのバージョンナンバーで、file_version_number とは無関係です。これはファイル形式の対象外となる下位/上位互換を備えるのに必要なアクションを決定するアプリケーションに使用されます。アプリケーションのバージョンナンバーの解釈はアプリケーションに依存します。

"idtag_length" と "length_length" のフィールドは、tag_id_type や payload length のフィールドで定義されるように、また、payload_length_type で個々に定義されるように、IDタグのレコードで用いられるバイト数を与えます。

特に、これらのフィールドの値は tag_id_type と payload_length_type を以下の整数値タイプとして定義します:

valuetag_id_typepayload_length_type
inidtag_lengthlength_length
1uint8uint8
2uint16uint16
3uint24uint24
4uint32uint32

これらのタイプのアプリケーションの内部 表現は定義されていませんが、uint32 が推奨されます。アプリケーションが "idtag_length" や "length_length" の値で 4 よりも大きな値や、内部の符号なし整数値のサイズよりも大きな値をいかに処理するかは定義されていませんが、アプリケーションは そのような状況に備えて、下位互換のガイドの中で特定のルールを用意すべきです

Opera 4.x の現行バージョンでは、idtag_length=1 (uint8)ならびに length_length=2 (uint16)を用いています。

ヘッダーの後にはレコードだけが続きます。レコード編成ならびにそれらの解釈はアプリケーション限定となります。

下位互換

長い整数値を用いることができないファイル形式を使用するアプリケーションの旧バージョンは、これにかかわらず、ファイル処理を試みるべきですが、レコードの数値のタグがバージョンそれ自体の整数値幅を超える場合(例: 整数値のオーバーフロー)には、レコードを回避すべきです。ただし、レコードの length が整数値やバッファ許容量の制限を超える場合は、ファイルの処理を続行してはなりません

全てのアプリケーションは理解できないタグ値を無視しなくてはなりません

キャッシュファイル形式

このセクションには、訪問済みリンクファイル (vlink4.dat)やディスクキャッシュインデックスファイル(dcache4.url)、ダウンロードレスキューファイル(download.dat)で利用されるレコードタグおよび形式について詳述します。これらのファイルの現在の app_version_number は 0x00020000 (メジャーバージョン 2、マイナーバージョン 0)になります。

これらのファイルでは(異なるタグ値の)レコードを用いており、そのレコードには、同一のタグIDセットからのタグつきレコードのシークエンスが含まれます。異なるファイルでは以下のレコードにこれらのタグを用います:

FileTag idVersion number
Disk cache0x010x00020000
Visited Links0x020x00020000
ダウンロード0x410x00020000

それぞれのファイルはこのタイプのみのレコードから構成されていますが、ディスクキャッシュインデックスファイルは除きます。ディスクキャッシュインデックスファイルには id 0x40 のシングルレコードも含まれており、これには次のフリーキャッシュファイルナンバー(oprXXXXX)を探すのに用いられる 5 字の文字列が含まれています。

それぞれのレコードは再び、ファイル内のレコードと同様、同じバイナリ表現形式をもつレコードのシークエンスになります。

全てのファイルに共通の要素

これらの要素はキャッシュ関係の全ファイルで利用されます。訪問済みリンクの場合、これらは現在使われているフィールドのみになります。

ご注意: "(0x0001 | MSB_VALUE)" とは、ローカルの符号なし整数値の最上位ビットが設定されなければならないという事です。 32 ビット値が用いられる場合、これはタグの値が 0x80000001 であるという事になります。

タグIDコンテンツMeaning
0x0003stringThe name of the URL, fully qualified
0x0004time_t最終訪問時
(0x000b | MSB_VALUE)flagURL はフォームクエリの結果になります。
0x0022recordドキュメント内の関連リンクの名前と最終訪問時が含まれます。繰り返されることもあります。

関連リンク(tag 0x0022)レコードのコンテンツタグ

タグIDコンテンツMeaning
0x0023string関連リンク名
0x0024time_t最終訪問時

ディスクキャッシュならびにダウンロードレスキューファイルで用いられるフィールド

タグIDコンテンツMeaning
0x0005time_tファイルの最新ロード時のローカルタイム(GMTではなく)
0x0007uint8

ローディングのステータス:

2
ローディング完了
4
ローディング中止
5
ローディング失敗
0x0008uint32コンテンツサイズ
0x0009stringコンテンツの MIME type
0x000astringコンテンツのキャラクターセット
(0x000c | MSB_VALUE)flagファイルはユーザのローカルディスクにダウンロードされ、保存されます。ディスクキャッシュディレクトリの一部ではありません。
0x000dstringファイル名(キャッシュファイル: キャッシュディレクトリのみ)
(0x000f | MSB_VALUE)flag修正された場合は常にチェックすること
0x0010recordHTTP プロトコル固有情報が含まれます。

ダウンロードレスキューファイルのみで利用されるフィールド

タグIDコンテンツMeaning
0x0028time_tダウンロードされたファイルの最終/前回のセグメントのローディングが開始する時間を確認します。
0x0029time_tダウンロードされたファイルの最終/前回のセグメントのローディングが中止された時間を確認します。
0x002Auint32ダウンロードされるファイルの前回のセグメントにいくつのバイトがあったか、になります。ローディングの終了時間が不明な場合、この値はゼロ(0)仮定され、ダウンロード速度はゼロ(不明)に設定されます。

HTTP プロトコル固有レコードで利用されるフィールド

全てのメソッドは標準で GET となり、現在は POST リクエストをキャッシュすることはできません。

タグIDコンテンツMeaning
0x0015stringHTTP の Date ヘッダ
0x0016time_t有効期限
0x0017string最終修正時
0x0018stringドキュメントの MIME type
0x0019stringEntity タグ
0x001AstringURL(ロケーションヘッダ)へ移動済み
0x001Bstringレスポンスラインのテキスト
0x001Cuint32レスポンスコード
0x001DstringURL を更新
0x001Euint32デルタタイムを更新
0x001Fstring示唆されたファイル名
0x0020stringコンテンツのエンコード
0x0021stringコンテンツのロケーション
0x0025uint32

tag 0x0026 (いずれも表現される必要あり)とともに、リソースのローディングに最後に使用された User Agent ストリングを確認します。この値は User Agent ストリングを確認します。

同値は内部で使用されますが、修正してはなりません。

0x0026uint32

tag 0x0025 (いずれも表現される必要あり)とともに、リソースのローディングに最後に使用された User Agent ストリングを確認します。この値は User Agent のサブバージョンを確認します。

同値は内部で使用されますが、修正してはなりません。

(0x0030 | MSB_VALUE)flag将来に備えて保存されます。
(0x0031 | MSB_VALUE)flag将来に備えて保存されます。

Cookie ファイル形式

このセクションでは、cookies(cookies4.dat)の保管に用いられるレコードタグならびに形式について記述します。現在のこのファイルタイプの app_version_number は 0x00002000 (メジャーバージョン 2、マイナーバージョン 0)になります。

cookie ファイルはドメイン名コンポーネントのツリーとして編成されており、その時それぞれのコンポーネントはパスコンポーネントを保持し、それぞれのパスコンポーネントには cookies 数が含まれることもあります。

ご注意: コンポーネントはレコードのシークエンスで、単一のレコードではなく、flag レコードとともに終了されます。

Structure

ドメインコンポーネント

ドメインコンポーネントはそれぞれのサーバおよびドメイン向けに cookies を編成するのに利用されます。これらのサーバやドメイン用にcookies や cookie フィルタリング機能が定義されます。

ドメインコンポーネントはドメインレコードとともに開始され、これには特定のドメイン用にドメイン名や flag の幾つかが保持されています。domain-end flag レコードによって終了される前に、パスコンポーネントターミネータとサブドメイン数で続けられると、cookies を保持するパスコンポーネントやサブディレクトリのパスコンポーネント(および cookies)がその後に続きます。

例: ドメイン www.opera.com の cookies は以下のように保存されます:

["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 アドレスは除きますが、これは、Quad のドットつきストリング(例: "10.11.12.13")として完全な IP アドレスとともにのみ保存されます。さらに、ドメインコンポーネント名は全て最上位に保存され、どのようなサブドメインも含むことができません。

ドメインレコードではタグ "0x01" が使用され、以下のフィールドのシークエンスが含まれます:

タグIDコンテンツMeaning
0x001Estringドメインパート名
0x001Fint8

どのように cookies がこのドメイン用にフィルタリングされるか、になります。存在しない場合は、親ドメインのフィルタリングが使用されます。

  1. このドメインからの cookies は全て承認されます。
  2. このドメインからの cookies は全て承認されません。
  3. このサーバからの cookies は全て承認されます。Overrides 1 and 2 for higher level domains automatics.
  4. このサーバからの cookies は全て承認されません。上位のドメイン用に 1 と 2 を上書きします。

ドメイン設定は全てのサブドメインに適用されますが、サーバ固有の選択内容を伴うサブドメインは除きます。

0x0021int8Cookie を設定する URL に対応しない明白なパスをもつ cookies の処理になります。プライバシーの詳細設定で有効な場合は、標準でユーザに警告を行いますが、警告が有効であると、それらの cookie をドメインごとにフィルタリングすることが可能です: 値 1 は拒否を、値 2 は自動的に承認を示唆します。
0x0025int8

"Warn about third party cookies" モードの間、 このフィールドはそれらの cookie のフィルタリングに利用することができません。

  1. このドメインからのサードパーティ製の cookie は全て承認されます。
  2. このドメインからのサードパーティ製の cookie は全て承認されません。
  3. このサーバからの cookies は全て承認されます。上位ドメインの automatics 用に、1 と 2 を上書きします。
  4. このサーバからのサードパーティ製の cookie は全て承認されません。上位ドメイン用に 1 と 2 を上書きします。

ドメイン設定は全てのサブドメインに適用されますが、サーバ固有の選択内容を伴うサブドメインは除きます。

このレコードは 、ゼロもしくは、ドメインでサーバ上の最上位パスを定義するより多くのパスコンポーネントで続けることが可能です。また、パスコンポーネントターミネータが 常に 終了することも可能です。その時、ゼロもしくはより多くのドメインコンポーネントが続くことがあります。

ドメインコンポーネントは (0x0004 | MSB_VALUE) flag record によって終了されます。

パスコンポーネント

パスコンポーネントは、定義された cookie をもつこのディレクトリのサブディレクトリと同様に、所与のドメイン内の所与のディレクトリ用に定義された cookie を編成します。

ドメインコンポーネントレコードの直後に開始するパスコンポーネントを除き、それぞれのパスコンポーネントは常にパスレコードとともに開始します。さらに、その後に cookie レコードの任意の数とサブディレクトリのパスコンポーネントが続きます。

パスレコードはレコード ID "0x0002" を使用し、レコードには次のフィールドレコードがあります:

タグIDコンテンツMeaning
0x001Dstringパスのパート名

パスコンポーネントターミネータは (0x0005 | MSB_VALUE) flag レコードになります。

cookie レコード

cookie のエントリはタイプ "0x0003" のレコード内に保存され、以下のフィールドレコードを含みます::

タグIDコンテンツMeaning
0x0010stringcookie 名
0x0011stringcookie の値
0x0012time_t有効期限
0x0013time_tLast used
0x0014string使用のコメント/記述(RFC 2965)
0x0015string使用のコメント/記述(RFC 2965)の URL
0x0016stringversion=1 cookies (RFC 2965)とともに受信されるドメイン
0x0017stringversion=1 cookies (RFC 2965)とともに受信されるパス
0x0018stringversion=1 cookies (RFC 2965)とともに受信されるポート制限
(0x0019 | MSB_VALUE)flagcookie は HTTPS サーバにのみ送信されます。
0x001Aint8+cookie (RFC 2965)のバージョンナンバー
(0x001B | MSB_VALUE)flagcookie は送信元のサーバにのみ送信されます。
(0x001C | MSB_VALUE)flag削除予防用に保存: 未実装
(0x0020 | MSB_VALUE)flagパスが URL のプリフィックスのみの場合は、cookie は送信されません。パスが /foo の場合は、 /foo/bar は一致しますが、/foobar ではありません。
(0x0022 | MSB_VALUE)flagtrue の場合、cookie はパスワードログインフォームの結果として、もしくはそのような cookie へさかのぼりうる cookie を利用して取得された URL によって設定されました。
(0x0023 | MSB_VALUE)flagtrue の場合、cookie は HTTP 認証ログインの結果として、もしくはそのような cookie へさかのぼりうる cookie を利用して取得された URL によって設定されました。
(0x0024 | MSB_VALUE)flag

cookie がサードパーティ製のサーバによって設定されていた場合、フラグは "サードパーティ製の cookie を表示" モードで設定されます。また、URL がサードパーティ製の場合、これらの cookie のみ送信されます。サーバから直接 URL をローディングしている間に受信された cookie は、このモードではサードパーティ製の URL には送信されません。リバースは true ではありません

ご注意: サードパーティ製のサーバがファーストパーティのサーバへと変更し直す場合は、変更された URL はサードパーティ製と考えられます。