Repository navigation
Conversation
|
This PR is stale because it has been open for 30 days with no activity. |
|
@DavidBord Thanks! I think built-in range support is going to be helpful |
|
It’s needed to resume downloads and this may significantly reduce load in some cases. That’s why even minimal busybox httpd has a support of Range requests |
|
This PR is stale because it has been open for 30 days with no activity. |
|
This is a most welcome update. Thank you @DavidBord |
|
Personally I think it's fundamental to support Others I think are OK. I'm using a modified version of this patch in my program https://github.com/imba-tjd/qrsend. I will share info when I found defects. |
| shutil.copyfileobj(source, outputfile) | ||
| if start_byte is not None and end_byte is not None: | ||
| source.seek(start_byte) | ||
| outputfile.write(source.read(end_byte)) |
There was a problem hiding this comment.
Fatal error. When you use 2-5, the start_byte is 2 and end_byte is 5. Then you read(5).
The correct behavior is read(4), which is end_byte-start_byte+1. Though I won't suggest whether putting +1 here or previous place.
More importantly, read() will load all data into memory in a row before start writing. This has serious performance issue when resuming large file. I tried source.truncate() but it turns out an io.UnsupportedOperation.
Besides Content-Length needs changing too. So that new testing is recommended to be added, too.
|
Is there a way to help reviewing this PR? I'd like to help. |
There was another PR which was detailed discussed. However it seems to be deleted. Maybe it will be recoverd. This PR is poorly implemented and can be closed IMO. |
|
You can use |
|
This PR is stale because it has been open for 30 days with no activity. |
87935c0 to
a89f588
Compare
|
I went through the review feedback on this PR. |
Documentation build overview
418 files changed ·
|
cd2dfba to
1aedfad
Compare
|
Closing this was the wrong decision, closing #118949 instead and keeping this alive. |
Co-authored-by: Muse Code (Meta Muse Spark) # Conflicts: # Doc/whatsnew/3.16.rst # Lib/http/server.py
Hi, I'm the author of #118949. Much more disscussion is done there. Maybe we should coauthor this if you took code pieces there?
It's Microsoft somehow banning my GitHub account by mistake and took down that. Now it's back. |
|
Yes, please credit the author of the other PR in both the commits and the NEWS/What's New entry. |
picnixz
left a comment
There was a problem hiding this comment.
I want to ask some questions:
- How much from your original work has been kept?
- How much did you take from the other PR?
AFAICT, the tests in this PR are better written, but the implementation itself is closer to what I wanted to have. In particular, I don't like the http_range keyword and the lack of documentation since we are adding new keyword parameters and expecting files to be seekable as well.
Please however address the credit attribution first because depending on how much was pulled from the other PR, I would rather have the other PR merged.
| .. versionchanged:: 3.15 | ||
| Added *extra_response_headers* parameter. | ||
|
|
||
| .. versionchanged:: 3.16 |
There was a problem hiding this comment.
| .. versionchanged:: 3.16 | |
| .. versionchanged:: next |
|
|
||
| * :class:`~http.server.SimpleHTTPRequestHandler` now supports HTTP | ||
| single-part range requests for files, as specified in :rfc:`9110#section-14`. | ||
| (Contributed by David Bord in :gh:`86809`.) |
There was a problem hiding this comment.
| (Contributed by David Bord in :gh:`86809`.) | |
| (Contributed by David Bord in :gh:`86809`.) |
Please credit the other PR's author.
@lyc8503 Please indicate how you want to be credited here.
| return None | ||
| else: | ||
| self._range = (start, end) |
There was a problem hiding this comment.
| return None | |
| else: | |
| self._range = (start, end) | |
| return None | |
| self._range = (start, end) |
| if f: | ||
| try: | ||
| self.copyfile(f, self.wfile) | ||
| self.copyfile(f, self.wfile, http_range=self._range) |
There was a problem hiding this comment.
Personally, I would prefer that we have range=self._range rather than http_range, even if we are shadowing a built-in. The range itself can be given explicitly as it's simply a (start, end) pair.
| return path | ||
|
|
||
| def copyfile(self, source, outputfile): | ||
| def copyfile(self, source, outputfile, *, http_range=None): |
There was a problem hiding this comment.
You must document that this method has a new keyword argument now.
| os.chmod(self.tempdir, 0o755) | ||
|
|
||
| @support.subTests( | ||
| 'range_header,content_range,content_length,start,end', |
There was a problem hiding this comment.
| 'range_header,content_range,content_length,start,end', | |
| ('range_header', 'content_range', 'content_length', 'start', 'end'), |
| ('bYtEs=2-5', 'bytes 2-5/30', '4', 2, 6), | ||
| ('bytes=3-', 'bytes 3-29/30', '27', 3, None), | ||
| ('bytes=-5', 'bytes 25-29/30', '5', 25, None), | ||
| ('bytes=29-29', 'bytes 29-29/30', '1', 29, None), | ||
| ('bytes=25-100', 'bytes 25-29/30', '5', 25, None), |
There was a problem hiding this comment.
For each param, please indicate what case exercises (using a # comment)
| self.assertEqual(response.getheader('content-range'), 'bytes */30') | ||
| self.assertEqual(response.getheader('content-length'), '0') |
There was a problem hiding this comment.
| self.assertEqual(response.getheader('content-range'), 'bytes */30') | |
| self.assertEqual(response.getheader('content-length'), '0') | |
| self.assertEqual(response.getheader('Content-Range'), 'bytes */30') | |
| self.assertEqual(response.getheader('Content-Length'), '0') |
| self.assertEqual(response.getheader('content-range'), 'bytes */0') | ||
| self.assertEqual(response.getheader('content-length'), '0') |
There was a problem hiding this comment.
| self.assertEqual(response.getheader('content-range'), 'bytes */0') | |
| self.assertEqual(response.getheader('content-length'), '0') | |
| self.assertEqual(response.getheader('Content-Range'), 'bytes */0') | |
| self.assertEqual(response.getheader('Content-Length'), '0') |
| SimpleHTTPRequestHandler now supports single-part HTTP range requests, as | ||
| specified in RFC 9110 section 14. |
There was a problem hiding this comment.
| SimpleHTTPRequestHandler now supports single-part HTTP range requests, as | |
| specified in RFC 9110 section 14. | |
| Added support for HTTP single-part range requests on files to | |
| :class:`~http.server.SimpleHTTPRequestHandler`, as specified | |
| in :rfc:`9110#section-14`. |
|
A Python core developer has requested some changes be made to your pull request before we can consider merging it. If you could please address their requests along with any other requests in other reviews from core developers that would be appreciated. Once you have made the requested changes, please leave a comment on this pull request containing the phrase |
|
I looked at the commit history and despite the force push, the original PR's code is no longer the author's AFAICT. I can't find any tests either and thus I would rather have the other PR be altered with the tests this one brings. From a work perspective, the other PR made the work that I would like to see shipped. |
https://bugs.python.org/issue42643