WebDAVのファンタジー。 通常のクライアント

そして誰が簡単ですか?
前回の投稿では、 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 StarterWindows 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日



All Articles