そして誰が簡単ですか?前回の投稿では、 WebDAVプロトコルに基づいたインターフェースのアイデアについて概説しました。 その実装における自然な要件は、さまざまなオペレーティングシステムの通常のWebDAVクライアントとの作業の提供です。 RFCはドグマではないので、「動作」の詳細を理解することから始める必要があります。 つまり 接続、交換操作(送信、受信)およびリモート操作(作成、コピー、移動/名前変更、削除)の実行時にクライアントが開始するメソッドのセットとシーケンス:ファイル、フォルダー、ブランチ。 Cookieのカスタマーサポートを明確にすると便利です。 http認証 ローカルアドレスのプロキシ設定。 80以外のサーバーポートとの相互作用。
レビューは、タスクの範囲と利用可能なソフトウェアによって制限されるため、完了したふりをしません。
手元にあった:
-openSUSE 13.2 KDE( wdfs、cadaver、 Konqueror、Dolphin );
-ubuntu 14.04 LTS Gnome( davfs、 Nautilus );
-MS Windows 7 SP1 Starter 、 Windows 10 Home、Windows XP SP3 Professional (ネット使用、エクスプローラー)。
基本情報は、クラス1 WebDAVサーバーエミュレーターを使用して取得されました(サーバー:noname / 0.0.7; DAV:1;許可:OPTIONS、GET、HEAD、PUT、DELETE、PROPFIND、PROPPATCH、MKCOL、COPY、MOVE)。 サーバールート:/ test / dav /。 答えは名前空間プロパティD = "DAV:"のみを使用し、<D:href>タグは絶対アドレス指定を使用しました。 RFCによると、エミュレータは「必須」ですが、一致するという事実ではありません。 テスト中に生じる質問は、この結果かもしれません。
クライアント側では、操作はコンテキストメニュー(コピー|切り取り-貼り付け)によって開始され、ファイルシステムの場合はコンソールコマンドによって開始されました。
一般化された結果:
-一部のクライアントは、2つのステップでファイルを転送します:最初に、長さゼロ、次にファイル自体。
-ファイルをリモートでコピーする場合、ほとんどのクライアントはGET / PUTペアを使用してCOPYメソッドをシミュレートします(フォルダーの場合:MKCOL、GET / PUTファイル)。
-すべての人がMOVEメソッドを使用してオブジェクトを移動するわけではありません(MKCOL、GET / PUT、DELETEのセットをシミュレートします)。
-全員がMOVEを使用して名前を変更します。
-どのクライアントもPROPFINDメソッドを適用しません(深さ:無限)。
-全員がDELETEを使用するわけではありません(深さ:無限)。
-すべてのコンダクターが、ネストされたオブジェクトに対する操作後にフォルダーの内容をチェックするわけではありません(PROPFIND深さ:1);反対に、データ/アクションはキャッシュされます。
-ローカライズされたOSのキリル文字に問題はありません。
MS Windows 7 SP1 Starter(エクスプローラー、ネット使用)
ユーザーエージェント:Microsoft-WebDAV-MiniRedir / 6.1.7601
Cookieをサポートします。 ネゴシエートおよびダイジェスト(デフォルト)、基本( レジストリとのシャーマニズム後)認証。 プロキシIE設定。 非標準のhttpポート。 交換機能:
1.接続:\\ホスト:ポート\パスまたは\\ホスト@ポート\パス。 サーバーが最初に呼び出されると、クライアントはルートの「/」からパスの最初のセグメントまでOPTIONSをポーリングします。 肯定的な応答を受信していないため、最初のセグメントにPROPFINDを要求します。 クライアント(301-Moved Permanently)をOPTIONSのサーバールートアドレス、中間セグメントのPROPFIND要求に送信することで、誤解を解決しました。
クライアント要求にはヘッダー変換が含まれています:f
2. PROPFINDクライアント要求には本文が含まれていません。
Windows Explorerは、クリックするたびにPROPFINDシリーズを公開します。 ファイルのプロパティを定期的に要求します:desktop.ini、folder.gif、folder.jpg、Thumbs.db。 404クライアントの答えは非常に満足しています。 冗長なため、彼はコンソールに切り替えました:COPY、XCOPY、MOVE、DEL、RMDIR、REN ...
3.ファイル転送は一連の方法で実行されます。
-PROPFIND(深さ:0)宛先フォルダー。
-PROPFINDファイル(可用性を確認);
-不在時の長さがゼロのPUTファイル。
-LOCK(タイムアウト:Second-3600)ファイル:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:lockinfo xmlns:D="DAV:"> <D:lockscope><D:exclusive/></D:lockscope> <D:locktype><D:write/></D:locktype> <D:owner><D:href>HOST_NAME\USER_NAME</D:href></D:owner> </D:lockinfo>
サーバーの応答はRFCに準拠していますが、クライアントは501-Not Implementedも受け入れます。
-PROPPATCHファイルのプロパティ:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propertyupdate xmlns:D="DAV:" xmlns:Z="urn:schemas-microsoft-com:"> <D:set><D:prop> <Z:Win32CreationTime>Mon, 24 Jun 2013 11:16:17 GMT</Z:Win32CreationTime> <Z:Win32LastAccessTime>Tue, 23 Jun 2015 11:16:23 GMT</Z:Win32LastAccessTime> <Z:Win32LastModifiedTime>Mon, 24 Jun 2013 11:16:17 GMT</Z:Win32LastModifiedTime> <Z:Win32FileAttributes>00000000</Z:Win32FileAttributes> </D:prop></D:set> </D:propertyupdate>
クラス1サーバーがサポートする必要のあるPROPPATCHメソッド。 RFCでは、マルチステータスで403-Forbidden(cannot-modify-protected-property)応答を許可しています。 クライアントは拒否を無視し、自分自身を曲げ続けます。
-HEADファイル。
-PUTファイルの内容。
-PROPPATCHファイルのプロパティ:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propertyupdate xmlns:D="DAV:" xmlns:Z="urn:schemas-microsoft-com:"> <D:set><D:prop> <Z:Win32LastModifiedTime>Mon, 24 Jun 2013 11:16:17 GMT</Z:Win32LastModifiedTime> <Z:Win32FileAttributes>00000020</Z:Win32FileAttributes> </D:prop></D:set> </D:propertyupdate>
-ロック解除;
-PROPFINDファイル。
-PROPPATCHファイル属性Win32FileAttributes = 00000020。
4.ファイルを取得します。
-コンテナフォルダのPROPFIND(深さ:0)。
-PROPFINDファイル。
-GETファイル。
5.フォルダーを作成します。
-PROPFIND(深さ:0)宛先フォルダー。
-作成されたフォルダーのPROPFIND。
-MKCOL;
-ファイル転送に似たフォルダーのPROPPATCHプロパティ(値Win32FileAttributes = 00000010)。
6.ファイルのコピーは、2つのステップで実行されます。
-ファイルを取得(項目4);
-ファイルを転送します(3節)。
7.オブジェクト(ブランチを含む)の移動/名前変更は、MOVEメソッドを使用して実行されます(上書き:F;宛先:....;深さはありません。これは無限を意味します)。
8.ブランチコピーは、フォルダーの順次作成とファイルのコピー(項目6)によって実行されます。 ブランチの削除は、添付ファイルとフォルダーを順次削除することにより行われます。
ヒッチのないWindows 10 (ユーザーエージェント:Microsoft-WebDAV-MiniRedir / 10.0.10240)のダイアログは、上記と違いはありません。 Windows XP Redirector( User-Agent:Microsoft-WebDAV-MiniRedir / 5.1.2600 )はCookieをサポートしていません。 80以外のポート。 LOCK / UNLOCKは使用しません。 Windows XP Explorerは、ファイル転送/移動ダイアログ(PROPFIND /test//dav/file.txt HTTP / 1.1)のPROPFIND要求で、サーバールートの最初のセグメントの後に余分なスラッシュを挿入します。
Ubuntu 14.04 LTS Gnome(ノーチラス3.10.1)
ユーザーエージェント:gvfs / 1.20.3
Cookie、認証、プロキシ設定、非標準ポートをサポートしています。 交換の詳細:
1.接続(dav://ホスト:ポート/パス):
-サーバーのルートへのオプション。
-サーバールートのPROPFIND(深さ:0)(一連のプロパティを使用してオブジェクトの存在を確認します):
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propfind xmlns:D="DAV:"><D:prop> <D:resourcetype/> </D:prop></D:propfind>
-以前のルートセグメントへのオプション。送信元(301)から宛先へ。
-深さ:0/1ヘッダーおよび要求プロパティを持つサーバールートのPROPFIND( Apply-To-Redirect-Ref :T)(基本的にはそれらを使用します):
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propfind xmlns:D="DAV:"><D:prop> <D:creationdate/> <D:displayname/> <D:getcontentlength/> <D:getcontenttype/> <D:getetag/> <D:getlastmodified/> <D:resourcetype/> </D:prop></D:propfind>
2.ファイルを転送します。
-PROPFIND(深さ:0)宛先フォルダー。
-rfc4331に基づく宛先フォルダーのディスククォータのPROPFIND :
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propfind xmlns:D="DAV:"><D:prop> <D:quota-available-bytes/> <D:quota-used-bytes/> </D:prop></D:propfind>
-可用性のHEADファイル。
-PUTファイル。
-PROPFIND(深さ:0)ファイル5回(?)
3.ファイルを受け入れます。
-ファイルのPROPFIND(深さ:0)x5回(?);
-GETファイル。
4.フォルダーを作成します。
-PROPFIND(深さ:0)宛先フォルダー。
-PROPFINDディスククォータの宛先フォルダー。
-作成されたフォルダーのPROPFIND。
-作成されたフォルダーのMKCOL。
-作成されたフォルダーのPROPFIND x5回(?);
5.ファイルのコピー:
-宛先フォルダーのPROPFINDディスククォータ。
-PROPFINDソースファイルx5回。
-GETファイル。
-宛先フォルダーに存在するHEADファイル。
-宛先フォルダーへのPUTファイル。
-コピーしたファイルのPROPFIND x5回。
6.ファイル/フォルダー/ブランチの名前を変更します:
-ファイル/フォルダーのMOVE(上書き:F;宛先:...;深さが欠落しています)。
-オブジェクトのPROPFIND(深さ:0)
7.ファイルを削除します。
-PROPFIND(深さ:0)ファイル。
-PROPFIND(深さ:1)ファイル。
-ファイルを削除します。
8.ブランチのコピーは、宛先フォルダーにブランチ構造を作成し、続いてファイルをコピー(p。5)することにより行われます。 ブランチの削除は、添付ファイルとフォルダーを順次削除することにより行われます。 ファイル/フォルダー/ブランチの移動は、コピー(p.5 / p.8)の後にソースを削除することにより行われます。
openSUSE 13.2(wdfs、cadaver)、ubuntu 14.04 LTS( davfs )
顧客は、WebDAV RFC2518と互換性のあるネオン /0.30.0ライブラリを使用します。このライブラリからは、Cookieのサポートは0.25.0リリースで廃止されました。 提起された質問に関する機能リストからの引用:「現代のHTTP認証サポート:ダイジェスト、基本、およびネゴシエートプロトコルをサポートする、新しい認証標準RFC2617の完全な実装。 ...一部のプラットフォームでは、システムのプロキシ構成をオプションで使用できます。
wdfs
ユーザーエージェント:wdfs / 1.4.2 neon / 0.30.0
テストはコンソールチームによって実施されました。 現在のフォルダー:〜/
1.マウントfs(http://ホスト:ポート/パス):
-サーバーのルートへのオプション。
2.マウントポイントごとのls:
-PROPFIND(深さ:0/1):
<?xml version="1.0" encoding="utf-8"?> <propfind xmlns="DAV:"><prop> <resourcetype xmlns="DAV:"/> <getcontentlength xmlns="DAV:"/> <getlastmodified xmlns="DAV:"/> <creationdate xmlns="DAV:"/> </prop></propfind>
3.ファイルを転送します。
-宛先パスの各フォルダーのPROPFIND(深さ:0)。
-宛先フォルダーのPROPFINDファイル。
-長さゼロのPUTファイル。
-PROPFINDファイル。
-長さがゼロのGETファイル。
-PUTファイル。
4.ファイルを受け入れます。
-ファイルパスの各フォルダーのPROPFIND(深さ:0)。
-PROPFINDファイル。
-GETファイル。
5.フォルダーを作成します。
-宛先パスの各フォルダーのPROPFIND(深さ:0)。
-作成されたフォルダーのPROPFIND。
-MKCOLフォルダー。
-PROPFINDが作成したフォルダー。
6.ファイルのコピー:
-可用性のための宛先パスおよび宛先ファイルの各フォルダーのPROPFIND(深さ:0)。
-ソースパスとソースファイルの各フォルダーのPROPFIND(深さ:0)。
-ソースファイルの取得。
-長さゼロのPUTファイル。
-長さがゼロのPROPFINDファイル。
-長さがゼロのGETファイル。
-PUTファイル。
7.ファイル/フォルダー/ブランチの移動/名前変更:
-PROPFIND宛先フォルダー。
-ソースオブジェクトのPROPFIND。
-宛先フォルダーx2のソースオブジェクトのPROPFIND ? ;
-移動先フォルダーへの移動元オブジェクトの移動(上書き:T;移動先:...;深さ不在)。
8.フォルダー/ブランチの削除は、1つのDELETEメソッドによって行われます(深さはありません)。 ブランチのコピーは、フォルダーを順次作成し、ファイルをコピーすることで実行されます(GET / PUT)。
davfs
ユーザーエージェント:davfs2 / 1.4.7 neon / 0.30.0
テストはコンソールチームによって実施されました。 現在のフォルダー:〜/
1.マウントfs(http://ホスト:ポート/パス):
-サーバーのルートへのオプション。
-PROPFIND(深さ:1;接続:TE; TE:トレーラー)ルート:
<?xml version="1.0" encoding="utf-8"?> <propfind xmlns="DAV:"><prop> <getetag xmlns="DAV:"/> <getcontentlength xmlns="DAV:"/> <creationdate xmlns="DAV:"/> <getlastmodified xmlns="DAV:"/> <resourcetype xmlns="DAV:"/> <executable xmlns="http://apache.org/dav/props/"/> </prop></propfind>
-PROPFIND(深さ:0)ルート:
<?xml version="1.0" encoding="utf-8"?> <propfind xmlns="DAV:"><prop> <quota-available-bytes xmlns="DAV:"/> <quota-used-bytes xmlns="DAV:"/> </prop></propfind>
2.ファイルを転送します。
-宛先パスの各フォルダーのPROPFIND(深さ:1)。
-PUT(If-None-Match:*)ファイル。
-HEADファイル。
3.ファイルを受け入れます。
-ソースパスの各フォルダーのPROPFIND(深さ:1)。
-GET(If-Modified-Since:...)ファイル。
4.フォルダーを作成します。
-宛先パスの各フォルダーのPROPFIND(深さ:1)。
-MKDIR。
5.ファイルのコピー:
-PROPFIND(深さ:1)宛先フォルダー。
-ソースファイルのGET(If-Modified-Since:...);
-PUT(If-None-Match:*)ファイル。
-HEADファイル。
6.オブジェクトの名前変更/移動は、1つのMOVEメソッドによって行われます。
7.フォルダー/ブランチのコピーは、一般的な場合にフォルダーを順番に作成し、ファイルをコピー(受信/転送)することによって行われます。
8.フォルダー/ブランチの削除は、ファイルとフォルダーを順番に削除することによって行われます。
死体
ユーザーエージェント:cadaver / 0.23.3 neon / 0.30.0
接続:http://ホスト:ポート/パス
要求本文PROPFIND死体には次が含まれます。
<?xml version="1.0" encoding="utf-8" standalone="no"?> <propfind xmlns="DAV:"><prop> <getcontentlength/> <getlastmodified/> <executable xmlns="http://apache.org/dav/props/"/> <resourcetype/> <checked-in/> <checked-out/> </prop></propfind>
WebDAVメソッドは、対応するコマンドで表されます。 cadaverの基本的な機能は、オブジェクトのユーザープロパティを管理する機能です。
openSUSE 13.2 KDE(Konqueror 4.14.8、Dolphin 15.04.0)
ユーザーエージェント:Mozilla / 5.0(X11; Linux x86_64)KHTML / 4.14.9(Geckoなど)Konqueror / 4.14 SUSE
他のブラウザと同様に、KonquerorはCookieをサポートしています。 認証 ローカルアドレスのプロキシ設定。 非標準のhttpポート。 みんなではないように-WebDAV。
1.接続:webdav://ホスト:ポート/パス(localhostはIP経由でアクセス可能)。 クライアントはOPTIONSを気にせず、すぐにサーバールートにPROPFINDを要求します。
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propfind xmlns:D="DAV:"><D:prop> <D:creationdate/> <D:getcontentlength/> <D:displayname/> <D:source/> <D:getcontentlanguage/> <D:getcontenttype/> <D:getlastmodified/> <D:getetag/> <D:supportedlock/> <D:lockdiscovery/> <D:resourcetype/> </D:prop></D:propfind>
しかし、彼はサーバーが返すものに満足しています。 また、原則のサーバーは、supportedlockおよびlockdiscoveryプロパティを返しませんでした。
2.ファイルを転送します。
-PROPFIND(深さ:0)宛先フォルダー。
-宛先フォルダーのPROPFINDファイルのプロパティ:
<?xml version="1.0" encoding="utf-8" standalone="no"?> <D:propfind xmlns:D="DAV:"><D:prop> <D:creationdate/> <D:getcontentlength/> <D:displayname/> <D:resourcetype/> </D:prop></D:propfind>
-宛先フォルダー内のファイルのPROPFINDプロパティ(アイテム1)(存在する場合)。
-PUTファイル。
-p1からの宛先フォルダーのPROPFIND(深さ:1)プロパティー。
3.ファイルを取得します。
-ソースフォルダー内のPROPFINDファイル。
-GETファイル。
4.フォルダーを作成します。
-MKCOL;
-親フォルダーのPROPFIND(深さ:1)。
-作成されたフォルダーのPROPFIND(深さ:0)。
5.ファイルのコピー:
-宛先フォルダーのPROPFINDファイル。
-ファイルを宛先フォルダーにコピーします。
-PROPFIND(深さ:1)宛先フォルダー。
6.ファイル/フォルダー/ブランチの移動/名前変更:
-PROPFIND(深さ:0)宛先フォルダー。
-MOVE(上書き:F;深さ:無限)ファイル。
-PROPFIND(深さ:1)宛先フォルダー。
7.ブランチ/フォルダーをコピーする場合、先のフォルダーにフォルダー/ブランチが最初に作成され、次にCOPYメソッドを使用してファイルがコピーされます。
8.ファイル/フォルダー/ブランチを削除します。
-DELETE(深さが存在しない、これは無限を意味します)。
背後にはAppleクライアントとAndroidファイルマネージャーがいたので、後でこのギャップを埋めようとします。
2015年12月11日