1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//! # io-webdav
//!
//! I/O-free WebDAV client coroutines built on io-http: every network
//! exchange is a resumable state machine emitting read and write
//! requests instead of performing I/O itself. The caller owns the
//! socket and pumps the coroutine with the bytes it read, whatever the
//! runtime (blocking, async, in-memory tests). The `client` feature
//! ships a ready-made std-blocking pump for callers who just want a
//! working client.
//!
//! ## Layout: one folder per RFC
//!
//! The source tree mirrors how the WebDAV specifications are split,
//! one module per RFC. [`rfc4918`] implements the WebDAV core: the
//! PROPFIND, PROPPATCH, MKCOL, COPY, MOVE, DELETE, GET, PUT, OPTIONS
//! and REPORT requests, the multistatus response parser, the
//! [`rfc4918::WebdavAuth`] modes and the low-level send coroutine every
//! higher request builds on. [`rfc4791`] covers CalDAV: calendar
//! collections and calendar object resources (items), with calendar
//! home-set discovery. [`rfc6352`] covers CardDAV: address book
//! collections and contact cards, with address book home-set
//! discovery, batch multiget and ETag-only enumeration. [`rfc5397`]
//! discovers the current user principal, the entry point of the
//! discovery flow. [`rfc6578`] adds collection synchronization: the
//! sync-collection REPORT and its sync tokens.
//!
//! Two modules span the RFC modules and therefore live at the crate
//! root: [`coroutine`] defines the coroutine contract every state
//! machine implements, and the optional [`client`] module (`client`
//! feature) is the std-blocking pump: a light client wrapping any
//! stream you opened yourself, or a full client opening the TCP/TLS
//! connection itself when one of the TLS features is enabled.
//!
//! ## The coroutine contract
//!
//! Every coroutine implements [`coroutine::WebdavCoroutine`]: a resume
//! method taking the bytes read since the last step and returning
//! either an intermediate yield or a terminal completion. Standard
//! coroutines yield the shared read and write requests of
//! [`coroutine::WebdavYield`]; the redirect-aware discovery coroutines
//! declare their own [`rfc4918::coroutine::WebdavRedirectYield`],
//! surfacing a 3xx response to the caller as a redirect request instead
//! of following it, so the caller decides whether to reconnect to the
//! new authority and retry. The [`webdav_try`] macro chains an inner
//! coroutine step inside an outer resume, re-yielding and
//! short-circuiting like the question mark operator.
//!
//! ## Conventions
//!
//! The crate is no_std with alloc; std only enters behind the `client`
//! feature. Every public item carries the bare `Webdav` prefix, the
//! protocol not being version-scoped. Logging follows the library
//! rules: state changes at debug level, in-process steps and data dumps
//! at trace level.
extern crate alloc;
extern crate std;