WebDAVのfile & directoryの一覧を取得するたった一つの冴えたやりかた
タイトルの後半は尾ひれです。
RubyのNet::HTTP#propfind経由でWebDAVのPROPFINDメソッドを呼べば良いのですが、Web上に個別の情報(WebDAVとRuby)があるもののつながった情報が見つからなかったのでメモ.
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とすべし.