2.9 KiB
HTTP PUT-with-Content-Range support.
The mod_dav module of the Apache web server was one of the first implementations of Webdav. Ever since the first released version, it has had support for partial uploads using the Content-Range header with PUT requests.
A sample request
PUT /file.txt
Content-Length: 4
Content-Range: bytes 3-6/*
ABCD
This request updates 'file.txt', specifically the bytes 3-6 (inclusive) to
ABCD.
There is no explicit support for appending to a file, that is simply done by writing just past the end of a file. For example, if a file has size 1000, and you want to append 4 bytes:
PUT /file.txt
Content-Length: 4
Content-Range: bytes 1000-1003/*
1234
Apache mod_dav behaviour:
- The
Content-Rangeheader is required, and the syntax isbytes START-END/LENGTH. - END must be bigger than or equal to START.
- LENGTH is parsed by Apache mod_dav, and it must either be a valid number
or a
*(star), but mod_dav otherwise ignores it. Since it is not clearly defined what LENGTH should be, always use*. - Neither the start, nor the end-byte have to be within the file's current size.
- If the start-byte is beyond the file's current length, the space in between
will be filled with NULL bytes (
0x00).
Notes
bytes<space>, notbytes=.- The
Content-Lengthheader is not required by the original Apache mod_dav implementation. The body must either have a valid Content-Length, or it must use theChunkedtransfer encoding. It is strongly encouraged though to include Content-Length, so that it can be validated against the range before accepting the PUT request. - If the
Content-Lengthheader is present, its value must be equal toEND - START + 1.
Status codes
The following status codes are used:
| Status code | Reason |
|---|---|
| 200 or 204 | When the operation was successful |
| 400 | Invalid Content-Range header |
| 416 | If there was something wrong with the bytes, such as a Content-Length not matching with what was sent as the start and end bytes, or an end byte being lower than the start byte. |
| 501 | Content-Range header present, but not supported. |
RECKOGNIZING PUT-with-Content-Range support (client).
There is no official way to know if PUT-with-content-range is supported by a webserver. For a client it's probably best to do an OPTIONS request, and then check two things:
- the
Serverheader must contain the wordApache - the
DAVheader must contain<http://apache.org/dav/propset/fs/1>.
In that case, your are sure to talk to an Apache webserver with mod_dav enabled.
IMPLEMENTING PUT-with-Content-Range support (server).
Don't. Implement sabredav-partialupdate.
MORE INFORMATION.
https://blog.sphere.chronosempire.org.uk/2012/11/21/webdav-and-the-http-patch-nightmare