THINGS THAT CAN HAPPEN ├───File exists │ ├───User disables overwrite │ │ └───Return because there's nothing to do │ │ │ ├───User enables overwrite │ │ ├───User requests range │ │ │ └───Raise exception because requesting a range and forcing overwrite are mutually exclusive │ │ │ │ │ └───User does not request range │ │ └───File opened, truncated, full download │ │ │ └───User does not specify overwrite │ ├───File is same size as content-length │ │ └───Return because there's nothing to do. │ │ │ ├───User requests range │ │ ├───Server respects range │ │ │ └───File opened, seeked to request, bytes filled in │ │ │ │ │ └───Server does not respect range │ │ └───Raise exception because user's request can't be fulfilled │ │ │ └───User does not request range │ ├───Server respects range │ │ └───File is opened, seeked to end, download resumes │ │ │ └───Server does not respect range │ └───Ask for permission to overwrite from beginning │ └───File does not exist ├───User requests range │ ├───Server respects range │ │ └───File created, seeked to request, bytes filled in. everything else left 0 │ └───Server does not respect range │ └───Raise exception because user's request can't be fulfilled │ └───User does not request range └───File created, full download Possible amibiguity: If the user requests a range, and the file does not exist, does he want: 1. to fill the file with zeroes, and patch the requested bytes into their correct spot; or 2. to create the file empty, and only write the requested bytes? I will assume #1 because that plays nicely with other Things That Can Happen, such as letting the user patch the other bytes in later.