
2026/01/08 0:50
WebDAVにおける数多くの困難
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
記事では、主要なサービスプロバイダーが公式標準にほとんど従わないため、WebDAV/CalDAV ライブラリを信頼性のあるものとして構築することは非実用的だと主張しています。これにより、多くの奇妙な挙動や臨時の回避策が生じます。
- go-webdav など既存の Go ライブラリは、サーバー側のコレクション同期など必須機能を欠いており、著者のデータモデルとも合致しません。
- RFC 2518、RFC 4918、および7つの拡張 RFC を検討しましたが、実用には複雑すぎてレガシー要素が多く重いと判明しました。
- WebDAV のスキーマが不明瞭であるため、著者は Apple CalendarDAVXThunderbird、Apple iCloud、Google Calendar、Radicale などの実際のクライアント/サーバーから HTTP トラフィックを逆解析し、プロキシや Wireshark を使用してリクエストボディとヘッダーを検査しました。
- Go の標準 XML ライブラリは不十分であったため、DOM 風に XML ノードを操作するカスタムラッパーを作成しました。
- MVP は既存サービスとの通信に成功したものの、Apple と Google が RFC の一部しか実装しておらず、一般的な応答しか返さないことが判明しました。
- CalDAV クライアントは大きく異なります:効率性を重視する場合はほとんどが sync-collection を使用すべきですが、Apple Calendar は ctags/etags に依存しています。
- 著者は主要プロバイダーの奇妙さと標準遵守に対する明確なドキュメントやサポート不足にフラストレーションを抱いています。
- オープンソースライブラリには、Google の特殊性など特定実装向けの回避策が頻繁に含まれています。
結論: 広範な非準拠とベンダー固有の奇妙さのため、WebDAV/CalDAV ライブラリを作成することは、理性を重視する人には推奨されません。
本文
標準は素晴らしい――それが破綻するとき
WebDAV/CalDAV クライアントとサーバーを実装するのは簡単そうに思えます。
2000 年代初頭に仕様化され、文書化も整っていて、ある程度広くサポートされています。
それが「ホームチャート」を作る際に最初に抱いた楽観的な前提です。
既存の Go 実装
NIH シンドロームを言及する前に、まず既存の Go 実装 go‑webdav を調べました。
そのライブラリは必要とした重要機能(サーバ側でのコレクション同期など)が不足しており、インターフェースも我々のデータモデルに合致しませんでした。
この機能がプロダクトの中核であるため、実装内容を自分たちで掌握することにしました。
クライアント/サーバー構築の出発点は?
- RFC を読む
- RFC 2518(オリジナル)は RFC 4918 に置き換えられましたが、どこを採用すべきか詳細に掘り下げませんでした。
- 拡張 RFC は全部で 7 本しかありません。
これらを読み進めると、我々が実装したいのは「カレンダーイベントの CRUD」のみだと判明しました。
RFC 全体を実装しようと試みてほぼ 1 ヶ月かけた結果、不要なレガシーコードが多すぎて諦めることに。
リバースエンジニアリング
RFC の基本的な理解を得た上で、既存のクライアント/サーバーをリバースエンジニアリングしました。
リクエストとレスポンスを観察するだけで、API を把握し、必要となるリクエスト/レスポンス種別を特定できました。
対象にしたクライアント/サーバー
| クライアント | サーバー |
|---|---|
| Apple Calendar | Apple iCloud |
| DavXThunderbird | Google Calendar |
| Radicale |
HTTP プロキシや Wireshark を使ってトラフィックをキャプチャ。
WebDAV はヘッダーもボディも細部まで確認が必要なため、両方を解析しました。
Go で XML を扱う
Go のデフォルト XML ライブラリは実用的ではありませんでした。そこで、JavaScript が HTML 要素を操作するように XML ノードを管理できるラッパーを作成しました。
var davDisplayName = xmel.Element{ Name: "displayname", Space: davNS, } davDisplayName.SetValue("name") n, err := davResponse.Find(davCollectionType) davOwner = davOwner.AddChild(davHref.SetValue("http://example.com"))
WebDAV の「非構造化」スキーマが多いリクエスト/レスポンスでは、
このライブラリがマシャリング/アンマシャリングを簡潔に行える重要な要素でした。
標準はあくまで「提案」
MVP を完成させた後、既存実装と互換性テストを行いました。
多くの場合期待通り動作しましたが、時間が経つにつれて RFC から逸脱するケースが増えてきました。
| プロバイダー | 備考 |
|---|---|
| Apple / Google | RFC の一部しか実装せず、サポート/省略情報を公開しない。WebDAV は HTTP レスポンスで機能を広告すべきだが、実際はそれを行わない。 |
| クライアント | CalDAV クライアントのリクエストスタイルは極めて多様。ほとんどは (効率的)を使うべきなのに、Apple Calendar は ctags と etags を使用。 |
大手プロバイダーが標準から逸脱したり独自の奇妙な実装を追加するケースはフラストレーションの源です。
非コンフォーマンスを訴えても「やめて」と言われ、法的措置を取る余地もありません。
同様の問題は他のオープンソースライブラリにも見られ、Google 仕様への回避策がコメントで散在しています。
結論
精神的安定を重視する方には、WebDAV/CalDAV ライブラリ作成は推奨できません。