Contentstore streaming range

Currently, users can only download ContentStore files from first byte to last byte.

With this change, when a request to the ContentStore includes the HTTP "Range" parameter, it is parsed and StaticContentStream will stream the requested bytes.

This change makes possible to stream video files (.mp4 especially) from the ContentStore. Users can now seek a specific time in the video without loading all the file.

This is useful for courses with a limited number of students that doesn't require a dedicated video server.


Testing : Upload a .mp4 in Files & Uploads, add a Video XBlock in a Unit. You can now load the end of the video without loading everything. I tested it on Chrome and Firefox for mp4 videos.
This mean adding a throw something, and then put a try/except in the middleware ?
In the middleware file, I do not check at all the user values, I just make sure they can be converted to integers.
That's why I did this inside the function.

Also, why do we accept first_byte last_byte outside of [0, length-1], and do we accept bad inputs in the try/except of the str->int convertion for first and last in middleware ?

Either we act 100% "nice" and return an answer that is not really what the user asked, or we return a error 300 on every case of badly formed inputs, not just this one.