XMLHttpRequestでWebDAV

XMLHttpRequestでWebDAVもつかえるっぽい。
WebDAVをサポートしているオンラインファイルストレージがあれば、HTMLを置くだけでファイルブラウザとしても使える。

  var req = createXMLHttpRequest();
  req.onreadystatechange = function() {
    if (req.readyState == 4) {
      if (req.status==207) {
        //... 
      }
    }
  };
  req.open('PROPFIND', '/', true);
  req.setRequestHeader('Depth', '1');
  req.send('<?xml version="1.0" ?><propfind xmlns="DAV:"><allprop/></propfind>');

PROPFINDリクエストの結果として、ディレクトリの中身のXMLレスポンスが返って来る。

例:

<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:" xmlns:ns0="DAV:">
  <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
    <D:href>/</D:href>
    <D:propstat>
      <D:prop>
        <lp1:resourcetype><D:collection/></lp1:resourcetype>
        <lp1:creationdate>2006-08-18T17:47:26Z</lp1:creationdate>
        <lp1:getlastmodified>Fri, 18 Aug 2006 17:47:26 GMT</lp1:getlastmodified>
        <lp1:getetag>"118012-1000-5a772780"</lp1:getetag>
        <D:getcontenttype>text/html</D:getcontenttype>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>
  <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
    <D:href>/js/</D:href>
    <D:propstat>
      <D:prop>
        <lp1:resourcetype><D:collection/></lp1:resourcetype>
        <lp1:creationdate>2006-08-18T17:43:02Z</lp1:creationdate>
        <lp1:getlastmodified>Fri, 18 Aug 2006 17:43:02 GMT</lp1:getlastmodified>
        <lp1:getetag>"118018-1000-4abad580"</lp1:getetag>
        <D:getcontenttype>httpd/unix-directory</D:getcontenttype>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>
  <D:response xmlns:lp1="DAV:" xmlns:lp2="http://apache.org/dav/props/">
    <D:href>/index.html</D:href>
    <D:propstat>
      <D:prop>
        <lp1:resourcetype/>
        <lp1:creationdate>2006-08-18T12:19:01Z</lp1:creationdate>
        <lp1:getcontentlength>5046</lp1:getcontentlength>
        <lp1:getlastmodified>Fri, 18 Aug 2006 12:19:01 GMT</lp1:getlastmodified>
        <lp1:getetag>"118016-13b6-c3f4b740"</lp1:getetag>
        <D:getcontenttype>text/html</D:getcontenttype>
      </D:prop>
      <D:status>HTTP/1.1 200 OK</D:status>
    </D:propstat>
  </D:response>
</D:multistatus>

これをresponseXMLからデータを取り出して適当にHTMLレンダリングする。ステータスコードは200じゃなくって207なことに注意。

XMLHttpRequestは同じドメイン内でしか使えないため、JavaScriptを書いたHTMLは同じWebDAVサービスストーレジにファイルとして置いておくことになる。
WebDAVが認証を必要としていても、あらかじめHTMLロード時にログインされていれば、XMLHttpRequestをコールするたびに認証を再び聞かれることはない。

PROPFINDだけじゃなく、PUT、DELETEなどの更新系操作も可能。簡易メモくらいのアプリなら楽に作れるかも。

ちなみにWebDAV環境はこちらで試しました。
http://www.freedav.com