Ark SiteColumn & Report Arkアーキテクチャ
TOP 開発の現場から 第10回

このページでは、JustArkの様々な面に焦点を当てて、Ark開発スタッフ自らがメッセージを発信します。

第10回 WebDAV の概要 〜 IDisk Tool for Java の通信プロトコルとは 〜

 ・はじめに ・WebDAV とは ・で、何ができるの? ・実践編 ・おわりに

はじめに

Knock, knock.
Who's there?
WebDAV.
WebDAV who?
Welcome to WebDAV World!!

と、いきなりベタベタで始まってしまいましたが、皆さんの心はつかんだでしょうか?「わけわかんない!」という方もいらっしゃると思いますが、ここまで読んでいただけただけで担当者としての目的の半分は達成できています!その調子で最後までお付き合いください。今回は IDisk Tool for Java 担当の O が案内させていただきます。

JustArks には「インターネットディスクサービス 50MB 利用権」が付属していますが(皆さん、利用していますか?未登録の方は、この際、登録してみてください!)、そのディスクストレージサービスでは、WebDAV プロトコルを利用しています。2001年11月より前(クライアントツールは Windows 版の同期ツールだけです)のサービスは、プロトコルには FTP を使用していました。一般的に FTP は、(ファイアウォール等の設定で)利用者の環境によって LAN 外へのアクセスが制限されることがあります。
WebDAV の利点としては、
  • LAN 外へのアクセス制限が FTP ほど厳しくないこと
  • HTTP 拡張によるプロトコルのシンプルさ
  • (OSI 参照モデルの)レイヤ 4 以上で実現することによるセキュリティの確保 (レイヤ 3 以下がセキュアであれば、レイヤ 4 もセキュアになる)
  • (FTP と同様)規格がオープン
などがあります。

今回のコラムでは、他の記事とは少々毛色が異なりますが、WebDAV プロトコルについて紹介します。特に前提知識を必要としませんが、WebDAV プロトコルの紹介であるため、HTTP / Proxy Server / SSL 等の関連技術については説明しない点をご了承ください。

WebDAV とは

WebDAV とは World Wide Web Distributed Authoring and Versioning の略で、 RFC2518(HTTP Extensions for Distributed Authoring -- WEBDAV)にて定義されているプロトコルの名称です。WebDAV は Web のような分散環境での編集(Authoring)とバージョン管理(Versioning)を行うことを目的としていましたが、RFC2518 では、タイトルが示すようにバージョン管理の規定はありません。バージョン管理については他の作業部会で検討されており(RFC3253)、またそれ以外にもアクセスコントロールや検索について同じく他の作業部会で検討されています。

プロトコルの特徴としては、既に記述したように HTTP(バージョンは 1.1)を拡張しています。

IDisk Tool for Java は、WebDAV のすべての機能を使っているわけではなく、 ファイル操作(アップロード/ダウンロード/...)等に必要な機能のみを使用しています。

RFC2518 で定義される主な機能は以下の通りです。
プロパティ
プロパティは、特定のリソース(ファイル/コレクション)の状態を表し、モデルとしては名前と値のペアで構成されます。プロパティは2つのカテゴリ "live" と "dead" に分けられます。"live" プロパティは、そのシンタックスとセマンティクスがサーバによって決定され、"dead" プロパティはそれらがクライアントによって決定されます。更に、"live" プロパティは、値が read-only でサーバによって管理されるものとクライアントによって管理されるものとに分けられます。ただし、クライアントによって値を設定できるものであっても、サーバによってシンタックスの検証が行われることに注意する必要があります。

リソース管理
WebDAV では、リソースに "collection" というタイプを導入しています。HTTP URL 名前空間とサーバ側の名前空間を関連付けて、ディレクトリのようなモデルを表現します。

名前空間操作
Web リソース内での、コピー/移動といった仕組みを導入しています。

ロック
あるリソースをロックすることにより同時に変更可能な利用者が特定され、"lost update" 問題を防ぐことが可能です。

●実際の通信で使用されるものは?
ここでは、RFC2518 で新しく定義された「メソッド」「ヘッダー」「ステータスコード」について説明します。 あまり詳しく触れていませんが、実際に通信を行う際の一助になります(詳細は「実践編」で)。下記以外にも、IDisk Tool for Java の機能を実現するために、GET(ダウンロード時に使用)のような、HTTP で定義されたメソッド等を使用しています(これらも「実践編」で)。

◇メソッド

名前 説明
PROPFIND リソースのプロパティ情報の取得
コレクションに含まれるメンバリソースの検索
PROPPATCH リソースのプロパティ情報の設定/削除
MKCOL 新しいコレクションの作成
DELETE リソースの削除
COPY リソースのコピー
MOVE リソースの移動
LOCK リソースのロック
UNLOCK リソースのロック解除

◇ヘッダー

名前 説明 主な関連メソッド
DAV リソースがサポートする DAV のレベル OPTIONS
Depth リソースに対する実行範囲
  • 0:対象リソースのみ
  • 1:対象リソースとその直下のリソース
  • infinity:対象リソースに(再帰的に)含まれるすべてのリソース
メソッド毎に指定可能な値が制限されることもありますので、注意してください。
COPY
MOVE
PROPFIND
Destination "COPY" や "MOVE" メソッドで、その対象となる URI を指定 COPY
MOVE
Lock-Token ロック解除する際のリクエストに含まれる UNLOCK
Overwrite "COPY" や "MOVE" メソッドで、対象リソースの存在状態に応じた上書き適用 COPY
MOVE
Status-URI 処理中のリクエストに依存します。
例:"MOVE" では、対象リソースが処理中(102(Processing))の場合に、対象 URI を表す
MOVE
Timeout ロック時間の指定 LOCK

◇ステータスコード

名前 説明
102 サーバ側でリクエスト処理中
207 複数の終了状態所有
422 リクエストエンティティ不正
423 ロック状態
424 あるアクションの失敗により、関連する他のアクションが失敗した状態
507 あるリクエストを処理するためのサーバ容量が不足

で、何ができるの?

●IDisk Tool for Java では
IDisk Tool for Java では WebDAV の機能を使用して、ファイル転送機能を実現しています。
利用者の皆さんがリソースに対して明示的に
  • ロックをかけたり
  • プロパティを設定したり
するようなことはできませんが、インターネット上の専用ディスクスペースに、
  • 複数の端末からアクセスしたり
  • バックアップを行ったり
することが可能になります。
●他の応用は?
RFC2518 では WebDAV が目標としている機能にはまだまだ遠いのですが、それでも IDisk Tool for Java の機能はそのすべてを利用したわけではありません。
オーサリングツールが WebDAV を使用する場合、
  • ロックをかける
  • プロパティを設定する
という仕組みを用いて、リソースに対して
  • 排他制御を行う
  • メタ情報を設定(取得)する
などをサポートし、その価値を高める必要があります。ただ、RFC2518 で可能なことはここまでで、ここから先はWebDAV の他の作業部会で検討されている仕様に目を向けていく必要があります。

実践編

ここまではいろいろな Web ページや書籍等で紹介されていますので、ここからは実際にリクエストを投げてレスポンスを受け取るという通信内容について見ていきます。IDisk Tool for Java で提供している主な機能について、どのようなリクエストが投げられ、どのようなレスポンスが受け取られているのかを軸に紹介していきます。

表示の都合上等で、ヘッダーやボディ部などのデータの一部を編集/省略させていただいている箇所がありますが、ご了承ください。

●前準備

ツール上で有効な機能
メニューコマンド [表示 - 処理内容表示] をチェックすることにより、実際に行われている通信内容が参照できます。Host ヘッダー/Authorization ヘッダー/リクエスト行のホスト情報等、必ずしもほんとうに投げられたリクエストと異なる部分もありますので、ご注意ください。TCP/IP の世界ですのでハックすることは可能ですが、ツール上では簡単に参照できないようにするための施策です。

HTTP の基本
本章では、リクエストとレスポンスの通信内容を見ていきます。HTTP のリクエストとレスポンスの構成を知っておくと理解しやすいです。・・・というか、「まったく知らない」のと「ちょっと知っている」のでは理解度にかなり差が出てくると思いますので、簡単に(簡略し過ぎ?)説明します。

◇ シーケンス
1.ソケットオープン シーケンス1
2.リクエスト送信 シーケンス2
3.レスポンス受信 シーケンス3
4.ソケットクローズ シーケンス4

◇ リクエストの構成

リクエスト行 「メソッド」「リクエスト URI」「HTTP バージョン」より、構成されます。
ヘッダ情報(+空行) データを受送信するために必要な情報や補助的な情報を記述します。
省略可能ですが、最後の空行は必須です。
メッセージボディ メソッド等によって内容が変更します。
例えば、"PUT" メソッドでは、実際に PUT(アップロード)するデータを書き込みます。
省略可能です。

◇ レスポンスの構成

レスポンス行 「HTTP バージョン」「レスポンスコード」「(可読な)略説」より、構成されます。
ヘッダ情報(+空行) リソースの情報です。
省略されることがありますが、空行は存在します。
エンティティボディ メソッドやレスポンスコードによって内容が変更されます。
省略されることがあります。

◇ リクエスト例

GET /(?????)/file/index.html HTTP/1.1
Host: (ホスト名)
User-Agent: js-idisktool4j/1.02
Authorization: (認証情報)

リクエスト行
ヘッダー


空行
リクエスト行では、
メソッド ・・・ GET
リクエスト URI ・・・ /(?????)/file/index.html
HTTP バージョン ・・・ HTTP/1.1

が指定されています。
ヘッダー情報に、"Authorization" ヘッダーが設定されていますが、これは、リクエスト URI へアクセスする際の認証情報を設定する必要があります。
このヘッダー情報が適切に設定されていない場合、認証に失敗したというレスポンスが返ることになります。
この例ではボディ部が省略されています。

◇ レスポンス例

HTTP/1.0 200 OK
Date: Mon, 25 Mar 2002 00:38:12 GMT
X-JS-VFS-Version: 1.0
Content-Length: 140
Content-Type: text/html; charset=Shift_JIS
Proxy-Connection: close

<HTML>
<HEAD>
・・・
</HEAD>
<BODY>
・・・
</BODY>
</HTML>
レスポンス行
ヘッダー




空行
ボディ
レスポンス行では、
HTTP バージョン ・・・ HTTP/1.0
レスポンスコード ・・・ 200
(可読な)略説 ・・・ OK
が返されています。
ヘッダー情報には、ボディのサイズ("Content-Length")や内容についての情報("Content-Type")が返されています。

●接続
機能 本来 HTTP の通信にて、継続的な「接続(やそれにともなう切断)」といった概念はない(HTTP1.1 では keep-alive 可能です)のですが、便宜的にユーザー認証の確認や初期ディレクトリの設定等を行っています。
使用する
主なメソッド
HEAD
PROPFIND
例1
HEAD リクエスト
HEAD レスポンス
補足説明1 この例では、HEAD メソッドを使用し、ボディ部がありません(HEAD において必須ではない)。
例2
PROPFIND リクエスト リクエスト行/ヘッダー部
ボディ部
PROPFIND レスポンス レスポンス行/ヘッダー部
ボディ部
補足説明2 PROPFIND メソッドを使用する場合、ボディ部に XML 形式にて取得したい情報を設定できます。
この例では、「最終更新日時」と「サイズ」を指定しています。
「ヘッダー」で簡単に説明した「Depth」を値「1」で使用しています。
ツールでは、これらの情報とリクエスト URI で指定したコレクションに含まれるリソースの情報を一覧形式にしてペイン部に表示しています。
また、レスポンスのボディ部も、リクエストのボディ部と同様、XML 形式にて必要な情報が取得されています(レスポンスコード:207)。
「/(ユーザ名)/file/」というリクエスト URI 自身であるコレクションと「/(ユーザ名)/file/a.txt」と「/(ユーザ名)/file/a/」というリソースが含まれていることがわかります。
また、プロパティとして、「DAV:getlastmodified」と「DAV:getcontentlength」が取得されています。
備考 サーバー側でコレクションを移動する場合やファイル転送後の一覧更新等にも PROPFIND メソッドを使用しています。
画面イメージ

●アップロード
機能 ローカルストレージにあるリソースをサーバー(インターネットディスク)に転送します。
使用する
主なメソッド
PUT
リクエスト
レスポンス
補足説明 リクエストのボディ部には、転送するリソースの内容を設定します。
備考

●ダウンロード
機能 サーバー(インターネットディスク)にあるリソースをクライアントストレージに転送します。
使用する
主なメソッド
GET
リクエスト
レスポンス
補足説明 レスポンスのボディ部として、取得するデータが返りますので、そのデータをローカルストレージに保存します (サイズは、「Content-Length」を参照しています)。
備考

●コピー
機能 サーバー(インターネットディスク)内でリソースをコピーします。
使用する
主なメソッド
COPY
リクエスト
レスポンス
補足説明 リクエストの「Destination」ヘッダーにコピー先を指定します。
備考

●移動
機能 サーバー(インターネットディスク)内でリソースを移動します。
使用する
主なメソッド
MOVE
リクエスト
レスポンス
補足説明 リクエストの「Destination」ヘッダーに移動先を指定します。
備考

●同期
「同期」は、「最終更新日時」をローカルとサーバーのリソースで比較を行い、「アップロード」「ダウンロード」機能を使い分けた機能です。
この章で説明した機能を使用して実現可能です。

●削除
機能 リソースを削除します。
使用する
主なメソッド
DELETE
リクエスト
レスポンス
補足説明
備考

●名前変更
「名前変更」は、「移動」機能を使用して実現可能です。

●ディレクトリ作成
機能 コレクションを作成します。
使用する
主なメソッド
MKCOL
リクエスト
レスポンス
補足説明
備考

●プロパティ
一覧表示の際に取得した「サイズ」「更新日時」を表示します。
公開されていなければ、通信は発生しません。
公開されていれば、その公開 URL を取得するために通信を行いますが、WebDAV 外の機能です。

おわりに

WebDAV について、概略をかけ足で紹介しましたが、いかがでしたか?「WebDAV の仕組み自体は簡単!」と思っていただければ幸いです。IDisk Tool for Java の実装でも、WebDAV プロトコル部分は比較的短時間で終わり、それ以外の苦労の方が多かったですから。。。プログラマー(もしくは、WebDAV に興味がある方)であれば、実際に WebDAV(HTTP)サーバーにアクセスしてみると驚くほど簡単に通信ができることが体験できると思います。その後、何かしようと思って躓いた時に、「実践編」が役に立つことを願っています。


TOP 開発の現場から 第10回