HTTP 208 Already Reported is a WebDAV extension (RFC 5842) used inside a 207 Multi-Status response to indicate that members of a DAV binding have already been enumerated in a preceding part of the multistatus response and are not being included again. This prevents infinite loops and redundant data when a WebDAV collection contains multiple bindings (hard links) to the same resource, ensuring each resource appears exactly once in the response.
Response includes the status code, standard headers (including Content-Type), and a small diagnostic JSON body describing the request and returned status.
Simulator URL (copy in the app after load — not a normal link):
https://httpstatus.com/api/status/208
Example request:
curl -i "https://httpstatus.com/api/status/208"The members of a DAV binding have already been enumerated in a previous reply to this request.
On this code, Inspector focuses on semantics, headers, and correctness warnings that commonly affect clients and caches.
208 Already Reported (RFC 5842 Section 7.1) solves a specific problem: WebDAV bindings allow a single resource to appear in multiple collections (similar to hard links in a filesystem). When a PROPFIND with Depth: infinity traverses a collection tree, the same resource could appear multiple times. The 208 status in a <response> element signals 'this resource was already listed earlier in this multistatus response.' The client knows to reference the earlier entry. This is exclusively used within 207 multistatus bodies — you'll never see a standalone 208 response.
// WebDAV multistatus with 208 Already Reported
const xml = `<?xml version="1.0" encoding="utf-8"?>
<D:multistatus xmlns:D="DAV:">
<D:response>
<D:href>/shared/docs/report.pdf</D:href>
<D:propstat>
<D:prop><D:getcontentlength>1048576</D:getcontentlength></D:prop>
<D:status>HTTP/1.1 200 OK</D:status>
</D:propstat>
</D:response>
<D:response>
<D:href>/shared/archive/report.pdf</D:href>
<D:status>HTTP/1.1 208 Already Reported</D:status>
</D:response>
</D:multistatus>`;
res.status(207).type('application/xml').send(xml);# WebDAV multistatus response with 208
from lxml import etree
def build_multistatus(resources):
DAV = 'DAV:'
ms = etree.Element(f'{{{DAV}}}multistatus')
reported = set()
for resource in resources:
resp = etree.SubElement(ms, f'{{{DAV}}}response')
href = etree.SubElement(resp, f'{{{DAV}}}href')
href.text = resource.path
if resource.canonical_id in reported:
status = etree.SubElement(resp, f'{{{DAV}}}status')
status.text = 'HTTP/1.1 208 Already Reported'
else:
reported.add(resource.canonical_id)
# ... add full propstat ...
return etree.tostring(ms, xml_declaration=True)// Milton WebDAV library handles 208 for bound resources
// Custom implementation:
public String buildMultistatus(List<DavResource> resources) {
Set<String> reported = new HashSet<>();
StringBuilder xml = new StringBuilder();
xml.append("<D:multistatus xmlns:D='DAV:'>");
for (DavResource r : resources) {
xml.append("<D:response><D:href>").append(r.getPath()).append("</D:href>");
if (reported.contains(r.getCanonicalId())) {
xml.append("<D:status>HTTP/1.1 208 Already Reported</D:status>");
} else {
reported.add(r.getCanonicalId());
xml.append(buildPropstat(r));
}
xml.append("</D:response>");
}
xml.append("</D:multistatus>");
return xml.toString();
}// 208 is only used inside WebDAV 207 multistatus XML
type MultistatusResponse struct {
Href string `xml:"href"`
Status string `xml:"status,omitempty"`
}
func buildMultistatus(resources []Resource) []byte {
reported := map[string]bool{}
var responses []MultistatusResponse
for _, r := range resources {
if reported[r.CanonicalID] {
responses = append(responses, MultistatusResponse{
Href: r.Path,
Status: "HTTP/1.1 208 Already Reported",
})
} else {
reported[r.CanonicalID] = true
// add full response with properties
}
}
// marshal to XML
}