WebDAVのfile & directoryの一覧を取得するたった一つの冴えたやりかた

タイトルの後半は尾ひれです。

RubyのNet::HTTP#propfind経由でWebDAVのPROPFINDメソッドを呼べば良いのですが、Web上に個別の情報(WebDAVRuby)があるもののつながった情報が見つからなかったのでメモ.

Webサーバーに依存するかもしれないけれど、とりあえず以下のコードで一覧表示できた.

require 'net/http'
require "rexml/document"

Net::HTTP.version_1_2

req_body = <<-EOS
<?xml version="1.0" encoding="utf-8" ?>
<D:propfind xmlns:D="DAV:">
  <!-- D:allprop/ -->
  <D:href/>
  <D:prop xmlns:lp1="DAV:">
    <lp1:getlastmodified/>
  </D:prop>
</D:propfind>
EOS

res = Net::HTTP.start('192.168.2.50', 80) {|http|
  http.propfind('/komamitsu/', req_body, {'Depth' => 'infinity'})
}
# puts res.body

doc = REXML::Document.new res.body

doc.elements.each('D:multistatus/D:response/D:href'){|e| p e.text}

今回は取得する属性を絞っているけれど、全部欲しい場合はコメントアウトされているallpropに切り替えると良い。

一点、注意事項としてはDepth:infinityにして最下層まで取得しているのだけど、Apacheの場合こんなエラーがでる.

PROPFIND requests with a Depth of "infinity" are not allowed ...

そんな場合は落ち着いてDAVDepthInfinity Onとすべし.