)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3a5b7bf6ba81a20210237d3ec523e2b5cd253b0e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":"This patch deprecates the acceptance of Content-Range and enables"},{"line_number":14,"context_line":"Glance v2 API to accept the more appropriate ‘Range’ requests."},{"line_number":15,"context_line":"It further sets ‘Content-Range’ and ‘Accept-Ranges’ response headers."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba2be162_6b8fddcc","line":14,"range":{"start_line":13,"start_character":0,"end_line":14,"end_character":62},"updated":"2017-03-06 16:45:40.000000000","message":"See my comments elsewhere in the patch.  This should say \"This patch enables Glance v2 API to accept the more appropriate ‘Range’ requests\", i.e., don\u0027t say anything about deprecation.","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"00890d3ff0f25fe6f11aece882fd44bcee70d1aa","unresolved":false,"context_lines":[{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":"This patch deprecates the acceptance of Content-Range and enables"},{"line_number":14,"context_line":"Glance v2 API to accept the more appropriate ‘Range’ requests."},{"line_number":15,"context_line":"It further sets ‘Content-Range’ and ‘Accept-Ranges’ response headers."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba2be162_97242eb3","line":14,"range":{"start_line":13,"start_character":0,"end_line":14,"end_character":62},"in_reply_to":"ba2be162_6b8fddcc","updated":"2017-03-06 17:28:14.000000000","message":"Done","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3a5b7bf6ba81a20210237d3ec523e2b5cd253b0e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"It further sets ‘Content-Range’ and ‘Accept-Ranges’ response headers."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implemets lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ib7ebc792c32995751744be3f36cbc9a0c1eead2a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba2be162_abbf155f","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":9},"updated":"2017-03-06 16:45:40.000000000","message":"Implements","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"00890d3ff0f25fe6f11aece882fd44bcee70d1aa","unresolved":false,"context_lines":[{"line_number":15,"context_line":"It further sets ‘Content-Range’ and ‘Accept-Ranges’ response headers."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implemets lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"Change-Id: Ib7ebc792c32995751744be3f36cbc9a0c1eead2a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ba2be162_b729328c","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":9},"in_reply_to":"ba2be162_abbf155f","updated":"2017-03-06 17:28:14.000000000","message":"Done","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Accept Range requests and set appropriate response"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently glance v2 API accepts ‘Content-Range’ header for random"},{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ffe62b97_b8ebf875","line":9,"range":{"start_line":9,"start_character":24,"end_line":9,"end_character":31},"updated":"2017-03-29 13:48:15.000000000","message":"s/accepts/incorrectly accepts/","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently glance v2 API accepts ‘Content-Range’ header for random"},{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests. It further sets ‘Content-Range’ and ‘Accept-Ranges’ response headers."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ffe62b97_38dec8d9","line":12,"range":{"start_line":12,"start_character":17,"end_line":12,"end_character":19},"updated":"2017-03-29 13:48:15.000000000","message":"s/as/in/","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests. It further sets ‘Content-Range’ and ‘Accept-Ranges’ response headers."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implements lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"ffe62b97_f3040117","line":15,"updated":"2017-03-29 13:48:15.000000000","message":"Please add:\n\nFor backward compatibility with pre-Pike Glance clients, the incorrect \u0027Content-Range\u0027 header will be accepted silently in perpetuity.  Thus this patch contains tests for \u0027Content-Range\u0027 in requests to prevent regressions.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"b4b73388a29c93d41428753cd6ed9475a13eaebb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests for file and cinder stores.."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implements lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"dfeb2761_04540bfe","line":15,"range":{"start_line":15,"start_character":9,"end_line":15,"end_character":37},"updated":"2017-04-04 17:07:12.000000000","message":"I think we can omit this detail. See my comment on release notes.","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"7c3b6ce3efa39e98aa023f8a48ca29f8356d7033","unresolved":false,"context_lines":[{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests for file and cinder stores.."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implements lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"dfeb2761_24beefd4","line":15,"range":{"start_line":15,"start_character":9,"end_line":15,"end_character":37},"in_reply_to":"dfeb2761_04540bfe","updated":"2017-04-04 17:14:17.000000000","message":"Done","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Accept Range requests and set appropriate response"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently glance v2 API accepts ‘Content-Range’ header for random"},{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dfeb2761_4e71090c","line":9,"range":{"start_line":9,"start_character":24,"end_line":9,"end_character":31},"updated":"2017-04-04 22:09:29.000000000","message":"change this to \"incorrectly accepts\"","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"e0fe2b627d1f650e20379ffb9ee91402411f9be9","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Accept Range requests and set appropriate response"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Currently glance v2 API accepts ‘Content-Range’ header for random"},{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dfeb2761_dc238e55","line":9,"range":{"start_line":9,"start_character":24,"end_line":9,"end_character":31},"in_reply_to":"dfeb2761_4e71090c","updated":"2017-04-05 02:05:36.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently glance v2 API accepts ‘Content-Range’ header for random"},{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests and sets ‘Content-Range’ response header."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dfeb2761_ce5e3975","line":12,"range":{"start_line":12,"start_character":17,"end_line":12,"end_character":32},"updated":"2017-04-04 22:09:29.000000000","message":"\"in the response headers\"","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"e0fe2b627d1f650e20379ffb9ee91402411f9be9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Currently glance v2 API accepts ‘Content-Range’ header for random"},{"line_number":10,"context_line":"image access and does not set response headers."},{"line_number":11,"context_line":"As per rfc7233, ‘Range’ requests should be accepted and ‘Content-Range’"},{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests and sets ‘Content-Range’ response header."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dfeb2761_fc2ad229","line":12,"range":{"start_line":12,"start_character":17,"end_line":12,"end_character":32},"in_reply_to":"dfeb2761_ce5e3975","updated":"2017-04-05 02:05:36.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests and sets ‘Content-Range’ response header."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implements lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dfeb2761_6ee28da2","line":15,"updated":"2017-04-04 22:09:29.000000000","message":"Please add the following (I don\u0027t want anyone freaking out about this being a breaking change):\n\nFor backward compatibility with pre-Pike Glance clients, the incorrect \u0027Content-Range\u0027 header will be accepted silently in perpetuity.  Thus this patch contains tests for \u0027Content-Range\u0027 in requests to prevent regressions.","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"e0fe2b627d1f650e20379ffb9ee91402411f9be9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"must be returned as the response."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch enables Glance v2 API to accept the more appropriate ‘Range’"},{"line_number":15,"context_line":"requests and sets ‘Content-Range’ response header."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"DocImpact"},{"line_number":18,"context_line":"Implements lite-spec I5bdadde682a0c50836bd95e2a6651d6e7e18f172"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dfeb2761_1c269669","line":15,"in_reply_to":"dfeb2761_6ee28da2","updated":"2017-04-05 02:05:36.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"}],"glance/api/v2/image_data.py":[{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"73a3609055575a81981119a9842b7427945a4a74","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        # (setting status_code to 416)"},{"line_number":289,"context_line":"        range_val \u003d response.request.get_content_range(image.size)"},{"line_number":290,"context_line":"        if range_val:"},{"line_number":291,"context_line":"            if isinstance(range_val, webob.byterange.ContentRange):"},{"line_number":292,"context_line":"                response_end \u003d range_val.stop - 1"},{"line_number":293,"context_line":"                # NOTE(flaper87): if not present, both, start"},{"line_number":294,"context_line":"                # and stop, will be None."}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_15be22fe","line":291,"updated":"2017-03-29 18:04:29.000000000","message":"We need to add a comment here that for backwards compatibility we cannot remove support for accepting ContentRange, similar to that in wsgi.py. \n\nNit: I would even go so far as to say we should maybe swap the order so that Range checking appears before Content-Range.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        # (setting status_code to 416)"},{"line_number":289,"context_line":"        range_val \u003d response.request.get_content_range(image.size)"},{"line_number":290,"context_line":"        if range_val:"},{"line_number":291,"context_line":"            if isinstance(range_val, webob.byterange.ContentRange):"},{"line_number":292,"context_line":"                response_end \u003d range_val.stop - 1"},{"line_number":293,"context_line":"                # NOTE(flaper87): if not present, both, start"},{"line_number":294,"context_line":"                # and stop, will be None."}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_34a0fe41","line":291,"in_reply_to":"ffe62b97_15be22fe","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            # chunk_size was none, reset it to image.size to set the"},{"line_number":329,"context_line":"            # response header\u0027s Content-Length."},{"line_number":330,"context_line":"            if chunk_size is not None:"},{"line_number":331,"context_line":"                response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":332,"context_line":"                response.headers[\u0027Content-Range\u0027] \u003d \u0027bytes %s-%s/%s\u0027\\"},{"line_number":333,"context_line":"                                                    % (offset,"},{"line_number":334,"context_line":"                                                       response_end,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_58750cf9","line":331,"updated":"2017-03-29 13:48:15.000000000","message":"I\u0027m not asking to be a wise-ass, but what is the point of including the Accept-Ranges header here?  We\u0027ve got \u0027bytes\u0027 specified in the Content-Range header, so it\u0027s not adding any additional information.\n\nIt would make sense coming back in a HEAD request to v2/images/ID/file, but we don\u0027t currently allow a HEAD on that url.  That would indicate to a client that we *do* accept range requests.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"73a3609055575a81981119a9842b7427945a4a74","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            # chunk_size was none, reset it to image.size to set the"},{"line_number":329,"context_line":"            # response header\u0027s Content-Length."},{"line_number":330,"context_line":"            if chunk_size is not None:"},{"line_number":331,"context_line":"                response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":332,"context_line":"                response.headers[\u0027Content-Range\u0027] \u003d \u0027bytes %s-%s/%s\u0027\\"},{"line_number":333,"context_line":"                                                    % (offset,"},{"line_number":334,"context_line":"                                                       response_end,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_d52d5afe","line":331,"in_reply_to":"ffe62b97_58750cf9","updated":"2017-03-29 18:04:29.000000000","message":"\"The Accept-Ranges response-header field allows the server to indicate its acceptance of range requests for a resource\"\n\n\"The Content-Range entity-header is sent with a partial entity-body to specify where in the full entity-body the partial body should be applied.\" \n\n  -- https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html\n\nI feel like we should ALWAYS add an Accept-Ranges header for any calls to this endpoint, not just on download when chunk_sizes is not None. The value is small, but still probably valuable.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"6db13749f087e624c189d89cbf5c378f055c92f1","unresolved":false,"context_lines":[{"line_number":328,"context_line":"            # chunk_size was none, reset it to image.size to set the"},{"line_number":329,"context_line":"            # response header\u0027s Content-Length."},{"line_number":330,"context_line":"            if chunk_size is not None:"},{"line_number":331,"context_line":"                response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":332,"context_line":"                response.headers[\u0027Content-Range\u0027] \u003d \u0027bytes %s-%s/%s\u0027\\"},{"line_number":333,"context_line":"                                                    % (offset,"},{"line_number":334,"context_line":"                                                       response_end,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_5058352f","line":331,"in_reply_to":"ffe62b97_d52d5afe","updated":"2017-03-29 18:09:10.000000000","message":"Sure Brian, I had added it just to indicate that Glance supports Range requests. It is optional as per rfc7233. [1]\nSteve, sure. Will move this out of the conditional check.\n\n[1] https://tools.ietf.org/html/rfc7233#section-2.3","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"8d201d24be8abfcf1b16d6ec3a3499c8593eeadc","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def download(self, response, image):"},{"line_number":285,"context_line":"        offset, chunk_size \u003d 0, None"},{"line_number":286,"context_line":"        # NOTE(dharinic): In case of a malformed content range,"},{"line_number":287,"context_line":"        # glance/common/wsgi.py will raise HTTPRequestRangeNotSatisfiable"},{"line_number":288,"context_line":"        # (setting status_code to 416)"},{"line_number":289,"context_line":"        range_val \u003d response.request.get_range_from_request(image.size)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_d5753cfc","line":286,"range":{"start_line":286,"start_character":49,"end_line":286,"end_character":56},"updated":"2017-03-30 22:06:18.000000000","message":"Nit: Will edit this if submitting another PS","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"317555c1456c9c4f44698597bed64d6a7ff8820c","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        # NOTE(markwash): \"response.app_iter \u003d ...\" also erroneously resets the"},{"line_number":358,"context_line":"        # content-length"},{"line_number":359,"context_line":"        response.headers[\u0027Content-Length\u0027] \u003d six.text_type(chunk_size)"},{"line_number":360,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def upload(self, response, result):"},{"line_number":363,"context_line":"        response.status_int \u003d 204"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_eacbbb6f","line":360,"updated":"2017-03-30 18:28:24.000000000","message":"this is super nit-picky, but this line could go above so that this header is always returned, even on a BadRequest. Can be part of a follow-up though if you don\u0027t end up submitting another patch set.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"652256dd3cd5685086ed2b13f3a7988577444bd4","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        # NOTE(markwash): \"response.app_iter \u003d ...\" also erroneously resets the"},{"line_number":358,"context_line":"        # content-length"},{"line_number":359,"context_line":"        response.headers[\u0027Content-Length\u0027] \u003d six.text_type(chunk_size)"},{"line_number":360,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":361,"context_line":""},{"line_number":362,"context_line":"    def upload(self, response, result):"},{"line_number":363,"context_line":"        response.status_int \u003d 204"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_6abc4bbb","line":360,"in_reply_to":"dfeb2761_eacbbb6f","updated":"2017-03-30 18:31:59.000000000","message":"Sure Steve. Will move it above if submitting another PS.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"e2f1f56e6aed4e97287e4c674f4357ad8e523396","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                        # as per rfc7233"},{"line_number":300,"context_line":"                        offset \u003d image.size - abs(range_val.start)"},{"line_number":301,"context_line":"                if range_val.end is not None:"},{"line_number":302,"context_line":"                    if range_val.end \u003c\u003d image.size:"},{"line_number":303,"context_line":"                        chunk_size \u003d range_val.end - offset"},{"line_number":304,"context_line":"                        response_end \u003d range_val.end - 1"},{"line_number":305,"context_line":"                    else:    # default to the last byte of the image"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_94f0a892","line":302,"updated":"2017-04-01 00:04:57.000000000","message":"should this be \u003c due to 0-based index?","commit_id":"6257f1097962070ec5a111845ef9acdea5b7498f"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"d2383bc2c619c0d1af0061560a3861000e4d5033","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                        # as per rfc7233"},{"line_number":300,"context_line":"                        offset \u003d image.size - abs(range_val.start)"},{"line_number":301,"context_line":"                if range_val.end is not None:"},{"line_number":302,"context_line":"                    if range_val.end \u003c\u003d image.size:"},{"line_number":303,"context_line":"                        chunk_size \u003d range_val.end - offset"},{"line_number":304,"context_line":"                        response_end \u003d range_val.end - 1"},{"line_number":305,"context_line":"                    else:    # default to the last byte of the image"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_141378b7","line":302,"in_reply_to":"dfeb2761_94f0a892","updated":"2017-04-01 00:08:32.000000000","message":"Steve, the end object of our range_val is auto incremented (i.e., for \"0-0\", end is \"1\")\n\nPlease see tests in test_wsgi.py https://review.openstack.org/#/c/441501/9/glance/tests/unit/common/test_wsgi.py","commit_id":"6257f1097962070ec5a111845ef9acdea5b7498f"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"e2f1f56e6aed4e97287e4c674f4357ad8e523396","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            response.status_int \u003d 206"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        response.headers[\u0027Content-Type\u0027] \u003d \u0027application/octet-stream\u0027"},{"line_number":324,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        try:"},{"line_number":327,"context_line":"            # NOTE(markwash): filesystem store (and maybe others?) cause a"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_b4da8c14","line":324,"updated":"2017-04-01 00:04:57.000000000","message":"oops, this didn\u0027t get moved up to the top, before get_range_from_request.","commit_id":"6257f1097962070ec5a111845ef9acdea5b7498f"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"d2383bc2c619c0d1af0061560a3861000e4d5033","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            response.status_int \u003d 206"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        response.headers[\u0027Content-Type\u0027] \u003d \u0027application/octet-stream\u0027"},{"line_number":324,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        try:"},{"line_number":327,"context_line":"            # NOTE(markwash): filesystem store (and maybe others?) cause a"}],"source_content_type":"text/x-python","patch_set":9,"id":"dfeb2761_f427f411","line":324,"in_reply_to":"dfeb2761_b4da8c14","updated":"2017-04-01 00:08:32.000000000","message":"Ouch. My bad.","commit_id":"6257f1097962070ec5a111845ef9acdea5b7498f"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        offset, chunk_size \u003d 0, None"},{"line_number":292,"context_line":"        # NOTE(dharinic): In case of a malformed range header,"},{"line_number":293,"context_line":"        # glance/common/wsgi.py will raise HTTPRequestRangeNotSatisfiable"},{"line_number":294,"context_line":"        # (setting status_code to 416)"},{"line_number":295,"context_line":"        range_val \u003d response.request.get_range_from_request(image.size)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        if range_val:"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_9578782a","line":294,"range":{"start_line":292,"start_character":0,"end_line":294,"end_character":38},"updated":"2017-04-03 16:27:39.000000000","message":"Is there a reason this comment is added here?\nIt isn\u0027t directly addressing any code here.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        offset, chunk_size \u003d 0, None"},{"line_number":292,"context_line":"        # NOTE(dharinic): In case of a malformed range header,"},{"line_number":293,"context_line":"        # glance/common/wsgi.py will raise HTTPRequestRangeNotSatisfiable"},{"line_number":294,"context_line":"        # (setting status_code to 416)"},{"line_number":295,"context_line":"        range_val \u003d response.request.get_range_from_request(image.size)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        if range_val:"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_9bf42788","line":294,"range":{"start_line":292,"start_character":0,"end_line":294,"end_character":38},"in_reply_to":"dfeb2761_9578782a","updated":"2017-04-03 17:46:05.000000000","message":"Hemanth, this is to just to tell that we would get a 416 from wsgi. This was added by me in one of my older patches. I was editing it now.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"96596ab45147eded255be0c6f20ca90abbc86eed","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        offset, chunk_size \u003d 0, None"},{"line_number":292,"context_line":"        # NOTE(dharinic): In case of a malformed range header,"},{"line_number":293,"context_line":"        # glance/common/wsgi.py will raise HTTPRequestRangeNotSatisfiable"},{"line_number":294,"context_line":"        # (setting status_code to 416)"},{"line_number":295,"context_line":"        range_val \u003d response.request.get_range_from_request(image.size)"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        if range_val:"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_ef224952","line":294,"range":{"start_line":292,"start_character":0,"end_line":294,"end_character":38},"in_reply_to":"dfeb2761_9bf42788","updated":"2017-04-03 18:15:15.000000000","message":"I don\u0027t see it useful here. But, let\u0027s leave it as-is.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                    # processed to allow suffix-length for Range request"},{"line_number":310,"context_line":"                    # like \"bytes\u003d-2\" as per rfc7233."},{"line_number":311,"context_line":"                    if abs(range_val.start) \u003c image.size:"},{"line_number":312,"context_line":"                        offset \u003d image.size - abs(range_val.start)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"                if range_val.end is not None and range_val.end \u003c image.size:"},{"line_number":315,"context_line":"                    chunk_size \u003d range_val.end - offset"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_d5b28094","line":312,"range":{"start_line":312,"start_character":24,"end_line":312,"end_character":66},"updated":"2017-04-03 16:27:39.000000000","message":"nit:\n offset \u003d image.size + range_val.start\n\nJust avoids an extra call to abs().\nFeel free to ignore this comment :)","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":309,"context_line":"                    # processed to allow suffix-length for Range request"},{"line_number":310,"context_line":"                    # like \"bytes\u003d-2\" as per rfc7233."},{"line_number":311,"context_line":"                    if abs(range_val.start) \u003c image.size:"},{"line_number":312,"context_line":"                        offset \u003d image.size - abs(range_val.start)"},{"line_number":313,"context_line":""},{"line_number":314,"context_line":"                if range_val.end is not None and range_val.end \u003c image.size:"},{"line_number":315,"context_line":"                    chunk_size \u003d range_val.end - offset"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_db3f4f23","line":312,"range":{"start_line":312,"start_character":24,"end_line":312,"end_character":66},"in_reply_to":"dfeb2761_d5b28094","updated":"2017-04-03 17:46:05.000000000","message":"Good Nit. :)","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":324,"context_line":"                response_end \u003d range_val.stop - 1"},{"line_number":325,"context_line":"                # NOTE(flaper87): if not present, both, start"},{"line_number":326,"context_line":"                # and stop, will be None."},{"line_number":327,"context_line":"                if range_val.start is not None and range_val.stop is not None:"},{"line_number":328,"context_line":"                    offset \u003d range_val.start"},{"line_number":329,"context_line":"                    chunk_size \u003d range_val.stop - offset"},{"line_number":330,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_38c08150","line":327,"range":{"start_line":327,"start_character":16,"end_line":327,"end_character":78},"updated":"2017-04-03 16:27:39.000000000","message":"Isn\u0027t this always true?\nIf one of start or stop were missing, it\u0027d be an invalid Content Range header and we would never reach here.\nAm I missing something?","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":324,"context_line":"                response_end \u003d range_val.stop - 1"},{"line_number":325,"context_line":"                # NOTE(flaper87): if not present, both, start"},{"line_number":326,"context_line":"                # and stop, will be None."},{"line_number":327,"context_line":"                if range_val.start is not None and range_val.stop is not None:"},{"line_number":328,"context_line":"                    offset \u003d range_val.start"},{"line_number":329,"context_line":"                    chunk_size \u003d range_val.stop - offset"},{"line_number":330,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_09afad94","line":327,"range":{"start_line":327,"start_character":16,"end_line":327,"end_character":78},"in_reply_to":"dfeb2761_38c08150","updated":"2017-04-03 17:46:05.000000000","message":"No Hemanth, you are right. We need not have that conditional check. It was there just for a be-sure I guess.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"2f4441abfd73033c902f72da5d9220609150de20","unresolved":false,"context_lines":[{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def download(self, response, image):"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        if CONF.glance_store.default_store in [\u0027file\u0027, \u0027cinder\u0027]:"},{"line_number":290,"context_line":"            response.headers[\u0027Accept-Ranges\u0027] \u003d \u0027bytes\u0027"},{"line_number":291,"context_line":""},{"line_number":292,"context_line":"        offset, chunk_size \u003d 0, None"},{"line_number":293,"context_line":"        # NOTE(dharinic): In case of a malformed range header,"}],"source_content_type":"text/x-python","patch_set":15,"id":"dfeb2761_2dedd424","line":290,"range":{"start_line":289,"start_character":8,"end_line":290,"end_character":55},"updated":"2017-04-03 21:47:24.000000000","message":"This isn\u0027t the most appropriate way to check for random read capability. We should use this https://github.com/openstack/glance_store/blob/master/glance_store/capabilities.py#L99\n\nLooks like we need a handle to the backend store to be checking capabilities. Gotta be careful not to break any abstractions here. Requires some digging.","commit_id":"e5f231cfd1fec0893a9091b63154c33083405284"}],"glance/common/wsgi.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3a5b7bf6ba81a20210237d3ec523e2b5cd253b0e","unresolved":false,"context_lines":[{"line_number":981,"context_line":"            LOG.warn(_LW(\u0027Usage of Content-Range header for requests has been \u0027"},{"line_number":982,"context_line":"                         \u0027deprecated in Pike. The support for this will be \u0027"},{"line_number":983,"context_line":"                         \u0027removed after Queens. Please use \\\u0027Range\\\u0027 header \u0027"},{"line_number":984,"context_line":"                         \u0027for partial download requests instead.\u0027))"},{"line_number":985,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":986,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":987,"context_line":"            # image size of 3 is invalidated."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_4b75b930","line":984,"updated":"2017-03-06 16:45:40.000000000","message":"This is not what we agreed on in the spec-lite.  See my comment from Oct 12 on https://review.openstack.org/#/c/375123/\n\nWe\u0027re not going to remove support, we\u0027re just going to silently accept the incorrect header for backwards compatibility.","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"a4a8644041c1f0b0e7783a57d1a0a705b93903dd","unresolved":false,"context_lines":[{"line_number":981,"context_line":"            LOG.warn(_LW(\u0027Usage of Content-Range header for requests has been \u0027"},{"line_number":982,"context_line":"                         \u0027deprecated in Pike. The support for this will be \u0027"},{"line_number":983,"context_line":"                         \u0027removed after Queens. Please use \\\u0027Range\\\u0027 header \u0027"},{"line_number":984,"context_line":"                         \u0027for partial download requests instead.\u0027))"},{"line_number":985,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":986,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":987,"context_line":"            # image size of 3 is invalidated."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_ae2f233d","line":984,"in_reply_to":"ba2be162_4b75b930","updated":"2017-03-06 16:52:03.000000000","message":"Brian, I have not removed support. I have only added support for ``Range``. Please see lines 980-991 (They are for the old Content-Range)\nLines 994-1001 are for the newly supported correct ``Range``.","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"00890d3ff0f25fe6f11aece882fd44bcee70d1aa","unresolved":false,"context_lines":[{"line_number":981,"context_line":"            LOG.warn(_LW(\u0027Usage of Content-Range header for requests has been \u0027"},{"line_number":982,"context_line":"                         \u0027deprecated in Pike. The support for this will be \u0027"},{"line_number":983,"context_line":"                         \u0027removed after Queens. Please use \\\u0027Range\\\u0027 header \u0027"},{"line_number":984,"context_line":"                         \u0027for partial download requests instead.\u0027))"},{"line_number":985,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":986,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":987,"context_line":"            # image size of 3 is invalidated."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_fca8f1dd","line":984,"in_reply_to":"ba2be162_71198a79","updated":"2017-03-06 17:28:14.000000000","message":"Okay, I thought we will be giving a 2 cycle gap and then removing support for the not-correct \"Content-Range\" request.\nAs per your suggestion, I understand we wont be removing support ever. Will remove the LOG.warn in that case.\nThanks Brian.","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c5ddeded4642618ec0cf54a4ccff4f7cbb278f02","unresolved":false,"context_lines":[{"line_number":981,"context_line":"            LOG.warn(_LW(\u0027Usage of Content-Range header for requests has been \u0027"},{"line_number":982,"context_line":"                         \u0027deprecated in Pike. The support for this will be \u0027"},{"line_number":983,"context_line":"                         \u0027removed after Queens. Please use \\\u0027Range\\\u0027 header \u0027"},{"line_number":984,"context_line":"                         \u0027for partial download requests instead.\u0027))"},{"line_number":985,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":986,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":987,"context_line":"            # image size of 3 is invalidated."}],"source_content_type":"text/x-python","patch_set":5,"id":"ba2be162_71198a79","line":984,"in_reply_to":"ba2be162_ae2f233d","updated":"2017-03-06 17:00:17.000000000","message":"Great, but your warning says that support will be removed and that\u0027s false.  I think you should remove the log message, it\u0027s only going to be seen by the operator, not by the person using the incorrect header.  Either that, or if you have the project ID of the person making the request, you could log a warning \"Silently accepting incorrect header for partial download request.  Requestor is tenant %(tenant_id)s\" or something like that.","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        if c_range_str is not None:"},{"line_number":981,"context_line":"            # NOTE(dharinic): For backward compatibility reasons, we maintain"},{"line_number":982,"context_line":"            # support for \u0027Content-Range\u0027."},{"line_number":983,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":984,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":985,"context_line":"            # image size of 3 is invalidated."}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_e2978d39","line":982,"updated":"2017-03-29 13:48:15.000000000","message":"s/./in requests even though it\u0027s not correct to use it in requests./","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        if c_range_str is not None:"},{"line_number":981,"context_line":"            # NOTE(dharinic): For backward compatibility reasons, we maintain"},{"line_number":982,"context_line":"            # support for \u0027Content-Range\u0027."},{"line_number":983,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":984,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":985,"context_line":"            # image size of 3 is invalidated."}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_54cf0228","line":982,"in_reply_to":"ffe62b97_e2978d39","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"73a3609055575a81981119a9842b7427945a4a74","unresolved":false,"context_lines":[{"line_number":989,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":990,"context_line":"            return content_range"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"        if range_str is not None:"},{"line_number":993,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":994,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":995,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_7b479f78","line":992,"updated":"2017-03-29 18:04:29.000000000","message":"Nit: I would prefer to swap the order of these cases, so that if someone sends both we use the values in the Range instead. That seems more correct.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":989,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":990,"context_line":"            return content_range"},{"line_number":991,"context_line":""},{"line_number":992,"context_line":"        if range_str is not None:"},{"line_number":993,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":994,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":995,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_549dc207","line":992,"in_reply_to":"ffe62b97_7b479f78","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    def get_range_from_request(self, image_size):"},{"line_number":976,"context_line":"        \"\"\"Return the `Range` in a request.\"\"\""},{"line_number":977,"context_line":"        c_range_str \u003d self.headers.get(\u0027Content-Range\u0027)"},{"line_number":978,"context_line":"        range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        if range_str is not None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_ece617e9","line":977,"range":{"start_line":977,"start_character":8,"end_line":977,"end_character":55},"updated":"2017-03-31 16:45:36.000000000","message":"nit: this can be moved to L993.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"c0bc65ed97e19bb76ab322f22efc751f82e26dda","unresolved":false,"context_lines":[{"line_number":974,"context_line":""},{"line_number":975,"context_line":"    def get_range_from_request(self, image_size):"},{"line_number":976,"context_line":"        \"\"\"Return the `Range` in a request.\"\"\""},{"line_number":977,"context_line":"        c_range_str \u003d self.headers.get(\u0027Content-Range\u0027)"},{"line_number":978,"context_line":"        range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        if range_str is not None:"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_fac00453","line":977,"range":{"start_line":977,"start_character":8,"end_line":977,"end_character":55},"in_reply_to":"dfeb2761_ece617e9","updated":"2017-03-31 18:19:42.000000000","message":"Done","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":978,"context_line":"        range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        if range_str is not None:"},{"line_number":981,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":982,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_2cf07f67","line":981,"range":{"start_line":981,"start_character":12,"end_line":981,"end_character":49},"updated":"2017-03-31 16:45:36.000000000","message":"What is this for? We already fetched the \u0027Range\u0027 header and we\u0027ll reach this point only if it is present.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"c0bc65ed97e19bb76ab322f22efc751f82e26dda","unresolved":false,"context_lines":[{"line_number":978,"context_line":"        range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"        if range_str is not None:"},{"line_number":981,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":982,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_1abcc8da","line":981,"range":{"start_line":981,"start_character":12,"end_line":981,"end_character":49},"in_reply_to":"dfeb2761_2cf07f67","updated":"2017-03-31 18:19:42.000000000","message":"Done","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"992a7675c411f697512dcdbfc5929f7a6936d6cd","unresolved":false,"context_lines":[{"line_number":981,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":982,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_c0c5735d","line":984,"range":{"start_line":984,"start_character":18,"end_line":984,"end_character":22},"updated":"2017-03-31 18:07:33.000000000","message":"7233","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":980,"context_line":"        if range_str is not None:"},{"line_number":981,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":982,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_576a3080","line":985,"range":{"start_line":983,"start_character":0,"end_line":985,"end_character":26},"updated":"2017-03-31 16:45:36.000000000","message":"RFC2616 says:\n\n   A suffix-byte-range-spec is used to specify the suffix of \n   the entity-body, of a length given by the suffix-length \n   value. (That is, this form specifies the last N bytes of an \n   entity-body.) If the entity is shorter than the specified \n   suffix-length, the entire entity-body is used.\n\n\n   If a syntactically valid byte-range-set includes at least \n   one byte-range-spec whose first-byte-pos is less than the \n   current length of the entity-body, or at least one suffix-\n   byte-range-spec with a non-zero suffix-length, then the \n   byte-range-set is satisfiable.\n\n\n   Otherwise, the byte-range-set is unsatisfiable. If the byte-\n   range-set is unsatisfiable, the server SHOULD return a \n   response with a status of 416 (Requested range not \n   satisfiable). Otherwise, the server SHOULD return a response \n   with a status of 206 (Partial Content) containing the \n   satisfiable ranges of the entity-body.\n\n\nUnless my interpretation of the above is wrong, a suffix byte range ``bytes\u003d-4`` shouldn\u0027t result in 416 for an image of size 3 bytes. We should be returning the entire image.\n\nLet me know if I\u0027m missing something really obvious here.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"408daf21b993e8893bcf0945b36dc225044dbfe3","unresolved":false,"context_lines":[{"line_number":980,"context_line":"        if range_str is not None:"},{"line_number":981,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":982,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_3f92def7","line":985,"range":{"start_line":983,"start_character":0,"end_line":985,"end_character":26},"in_reply_to":"dfeb2761_576a3080","updated":"2017-03-31 18:11:22.000000000","message":"Nice catch.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"992a7675c411f697512dcdbfc5929f7a6936d6cd","unresolved":false,"context_lines":[{"line_number":980,"context_line":"        if range_str is not None:"},{"line_number":981,"context_line":"            range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":982,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_3a60acce","line":985,"range":{"start_line":983,"start_character":0,"end_line":985,"end_character":26},"in_reply_to":"dfeb2761_576a3080","updated":"2017-03-31 18:07:33.000000000","message":"This is totally my bad. I had the comment written wrong.\nI meant \"bytes\u003d4-\". Not \"bytes\u003d-4\"","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_092b68eb","line":986,"range":{"start_line":986,"start_character":15,"end_line":986,"end_character":29},"updated":"2017-03-31 16:45:36.000000000","message":"Is this a 400 instead?","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_46c95f76","line":986,"range":{"start_line":986,"start_character":46,"end_line":986,"end_character":48},"updated":"2017-03-31 16:45:36.000000000","message":"Should this be \u003e\u003d ?\nBecause beginning and end positions in ranges are zero offsets. \nSo, for an image of size 3, any range beginning with 3- should be invalid.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"408daf21b993e8893bcf0945b36dc225044dbfe3","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_9f71eae3","line":986,"range":{"start_line":986,"start_character":15,"end_line":986,"end_character":29},"in_reply_to":"dfeb2761_092b68eb","updated":"2017-03-31 18:11:22.000000000","message":"Hemanth: I don\u0027t see why a 400 would be more accurate/preferable over 416 here.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"992a7675c411f697512dcdbfc5929f7a6936d6cd","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_ba74bc9a","line":986,"range":{"start_line":986,"start_character":46,"end_line":986,"end_character":48},"in_reply_to":"dfeb2761_46c95f76","updated":"2017-03-31 18:07:33.000000000","message":"Done","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"408daf21b993e8893bcf0945b36dc225044dbfe3","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_df509235","line":986,"range":{"start_line":986,"start_character":46,"end_line":986,"end_character":48},"in_reply_to":"dfeb2761_46c95f76","updated":"2017-03-31 18:11:22.000000000","message":"Looks alike another good catch","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4232a6195a856eb33ff0c5f28c425fb55ad7601f","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_35a9df7a","line":986,"range":{"start_line":986,"start_character":46,"end_line":986,"end_character":48},"in_reply_to":"dfeb2761_7a7ab424","updated":"2017-03-31 19:26:54.000000000","message":"Dharini,\nWebOb will return None when it can\u0027t parse a given Range header. So, range_ can be none here even when the Range header is provided.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"f8c2b99740c01e182cb6a986add6e0de3ea36128","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_1576dba5","line":986,"range":{"start_line":986,"start_character":15,"end_line":986,"end_character":29},"in_reply_to":"dfeb2761_9f71eae3","updated":"2017-03-31 18:41:10.000000000","message":"My thought process was range_ would None when Range header was not parse-able. So, it must be syntactically malformed. On the other hand, when it\u0027s a syntactically valid Range header but unsatisfiable range, 416 is more appropriate.\n\nBasically, trying to distinguish between syntactically malfored vs unsatisfiable Range headers.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"c0bc65ed97e19bb76ab322f22efc751f82e26dda","unresolved":false,"context_lines":[{"line_number":983,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_7a7ab424","line":986,"range":{"start_line":986,"start_character":46,"end_line":986,"end_character":48},"in_reply_to":"dfeb2761_df509235","updated":"2017-03-31 18:19:42.000000000","message":"So, we do the same for Content-Range? This was one thing that i argued with myself a little but felt a person who specifies a range/content-range ehader so specifically but gives None, should be sent a 416. (I assumed that was why Flavio would have put it too when he added support for Content-Range).\nDo you guys feel we should send a 400?","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"},{"line_number":990,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_37768ca6","line":987,"range":{"start_line":987,"start_character":16,"end_line":987,"end_character":65},"updated":"2017-03-31 16:45:36.000000000","message":"nit: I don\u0027t know if this message is useful. 416 response code itself suggests that there is something wrong with the range header. Unless we add any value to it by saying what\u0027s exactly wrong with the range header, I don\u0027t think there\u0027s any value in repeating the same.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"9d4ae9f1386c5bae6551094e3952f22b87f2c253","unresolved":false,"context_lines":[{"line_number":984,"context_line":"            # rfc-2616, a range like bytes\u003d-4 for an image size of 3 is"},{"line_number":985,"context_line":"            # invalidated."},{"line_number":986,"context_line":"            if range_ is None or range_.start \u003e image_size:"},{"line_number":987,"context_line":"                msg \u003d _(\u0027Malformed Range header: %s\u0027) % range_str"},{"line_number":988,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":989,"context_line":"            return range_"},{"line_number":990,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_95f8abc4","line":987,"range":{"start_line":987,"start_character":16,"end_line":987,"end_character":65},"in_reply_to":"dfeb2761_37768ca6","updated":"2017-03-31 22:42:11.000000000","message":"I am getting rid of this message as to be specific, we need to split the above conditional check which i dont think is necessary.\nLet me know if you guys think we need to do it and provide the exact reason for the 416.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":996,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_669fc350","line":999,"range":{"start_line":998,"start_character":39,"end_line":999,"end_character":73},"updated":"2017-03-31 16:45:36.000000000","message":"I maybe confusing myself here with Range, but:\n#1 Should we also be checking for start \u003e\u003d image size?\n#2 stop \u003e image_size should just return whatever is remaining, right? (like in the case of Range)","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"f2334fdc2a80fa8553dfe38e4f3cefbf97b8b527","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":996,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_faac5236","line":999,"range":{"start_line":998,"start_character":39,"end_line":999,"end_character":73},"in_reply_to":"dfeb2761_54c340ee","updated":"2017-04-03 15:25:46.000000000","message":"I see what you are saying. \nLet me put it this way. If a user asks for 1-4/*, it is clear that that user doesn\u0027t know the image size, which is why there\u0027s an \u0027*\u0027 in the byte range. So, if the image size is unknown, how do we expect the user to be precise with the last pos? We are encouraging trial and error here.\n\nI agree with 1-4/3 is incorrect. But, we shouldn\u0027t be considering 1-4/* equivalent to 1-4/3 in the first place. \u0027*\u0027 should be considered as unknown NOT image size as the server knows it.\n\nWhatever we end up supporting needs to be documented very clearly since what we are doing here is by no means a standard way of doing things.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"864c9827d91ab37f13f13c46b1347457e931e2ec","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":996,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_7aae342f","line":999,"range":{"start_line":998,"start_character":39,"end_line":999,"end_character":73},"in_reply_to":"dfeb2761_5caed02e","updated":"2017-03-31 18:31:48.000000000","message":"Regarding #2,\n\nSo what 1-4.* means is that the user needs 1-4/3. And, as per rfc 7233 (https://tools.ietf.org/html/rfc7233#section-4.2), the last byte position cannot be more than the length. So I think we should have this.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"992a7675c411f697512dcdbfc5929f7a6936d6cd","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":996,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_5caed02e","line":999,"range":{"start_line":998,"start_character":39,"end_line":999,"end_character":73},"in_reply_to":"dfeb2761_669fc350","updated":"2017-03-31 18:07:33.000000000","message":"#1 webob takes care of this. Please see my test in L654 in [1]\n#2 The rfc does not say anything about this. Will change.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4232a6195a856eb33ff0c5f28c425fb55ad7601f","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":996,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_f03265a7","line":999,"range":{"start_line":998,"start_character":39,"end_line":999,"end_character":73},"in_reply_to":"dfeb2761_7aae342f","updated":"2017-03-31 19:26:54.000000000","message":"#1 How does webob know what the image size is at the time of parsing the Content-Range header?\n\n#2 Makes certain sense but I wonder whether we can argue that 1-4/* is same as 1-4/3. \u0027*\u0027 indicates that the image size is unknown. So, when it is unknown, I\u0027m thinking if we should think of the last-byte-pos as:\n\n  last-byte-pos \u003d last-byte-pos if image-size - 1  \u003e\u003d image_size else min(last-byte-pos, image-size - 1)","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"b380394111e1ce5d25435322ea119a2810951d21","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":996,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_54c340ee","line":999,"range":{"start_line":998,"start_character":39,"end_line":999,"end_character":73},"in_reply_to":"dfeb2761_f03265a7","updated":"2017-04-01 04:39:07.000000000","message":"#1. Done.\n\n#2, Hmm, still not sure we should validate (1-4/*).\n\nThe user had the image size unknown and so gave a request to download 1-4 bytes of an unknown sized image. When we translate it, we have a 1-4/3 which according to rfc is erroneous.\n\nHonestly, I feel that it rfc-erroneous cos one cannot set a response as 1-4/3. However, since we are taking this as a request, we are in a tangled situation thinking what to do.\n\nLet me know what you think. If you feel strongly that we should support it just like we do for \u0027Range\u0027, we can.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":997,"context_line":"            # image size of 3 is invalidated."},{"line_number":998,"context_line":"            if content_range is None or (content_range.length is None and"},{"line_number":999,"context_line":"                                         content_range.stop \u003e image_size):"},{"line_number":1000,"context_line":"                msg \u003d _(\u0027Malformed Content-Range header: %s\u0027) % c_range_str"},{"line_number":1001,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable(explanation\u003dmsg)"},{"line_number":1002,"context_line":"            return content_range"},{"line_number":1003,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_e664f3bb","line":1000,"range":{"start_line":1000,"start_character":16,"end_line":1000,"end_character":75},"updated":"2017-03-31 16:45:36.000000000","message":"same as above","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":972,"context_line":""},{"line_number":973,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":974,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":975,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance.\")"},{"line_number":976,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_d563a1db","line":975,"range":{"start_line":975,"start_character":24,"end_line":975,"end_character":75},"updated":"2017-04-03 16:27:39.000000000","message":"How about adding something to the effect of \"You may make multiple single range requests instead.\"?","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":972,"context_line":""},{"line_number":973,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":974,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":975,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance.\")"},{"line_number":976,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":977,"context_line":""},{"line_number":978,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_9ecad56a","line":975,"range":{"start_line":975,"start_character":24,"end_line":975,"end_character":75},"in_reply_to":"dfeb2761_d563a1db","updated":"2017-04-03 17:46:05.000000000","message":"Done","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":979,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":980,"context_line":"            # rfc7233, a range like bytes\u003d4- for an image size of 3 is"},{"line_number":981,"context_line":"            # invalidated."},{"line_number":982,"context_line":"            if range_ is None or range_.start \u003e\u003d image_size:"},{"line_number":983,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable()"},{"line_number":984,"context_line":"            return range_"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"        # NOTE(dharinic): For backward compatibility reasons, we maintain"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_d5e60145","line":983,"range":{"start_line":982,"start_character":12,"end_line":983,"end_character":64},"updated":"2017-04-03 16:27:39.000000000","message":"How about:\n if range_ is None: \n     raise webob.exc.HTTPRequestRangeNotSatisfiable(\"Invalid Range header.\")\n\n if range_.start \u003e\u003d image_size:\n     raise webob.exc.HTTPRequestRangeNotSatisfiable(\"Invalid start position in Range header. Start position MUST be in the inclusive range [0, %s].\" % (image_size - 1))","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":979,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":980,"context_line":"            # rfc7233, a range like bytes\u003d4- for an image size of 3 is"},{"line_number":981,"context_line":"            # invalidated."},{"line_number":982,"context_line":"            if range_ is None or range_.start \u003e\u003d image_size:"},{"line_number":983,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable()"},{"line_number":984,"context_line":"            return range_"},{"line_number":985,"context_line":""},{"line_number":986,"context_line":"        # NOTE(dharinic): For backward compatibility reasons, we maintain"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_697759a2","line":983,"range":{"start_line":982,"start_character":12,"end_line":983,"end_character":64},"in_reply_to":"dfeb2761_d5e60145","updated":"2017-04-03 17:46:05.000000000","message":"Done","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":991,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":992,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":993,"context_line":"            # image size of 3 is invalidated."},{"line_number":994,"context_line":"            if (content_range is None or (content_range.length is None and"},{"line_number":995,"context_line":"                content_range.stop \u003e image_size) or"},{"line_number":996,"context_line":"                    content_range.start \u003e\u003d image_size):"},{"line_number":997,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable()"},{"line_number":998,"context_line":"            return content_range"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_15958940","line":997,"range":{"start_line":994,"start_character":12,"end_line":997,"end_character":64},"updated":"2017-04-03 16:27:39.000000000","message":"Same as above for splitting this into multiple checks to throw a more appropriate error message.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":991,"context_line":"            content_range \u003d webob.byterange.ContentRange.parse(c_range_str)"},{"line_number":992,"context_line":"            # NOTE(dharinic): Ensure that a content range like 1-4/* for an"},{"line_number":993,"context_line":"            # image size of 3 is invalidated."},{"line_number":994,"context_line":"            if (content_range is None or (content_range.length is None and"},{"line_number":995,"context_line":"                content_range.stop \u003e image_size) or"},{"line_number":996,"context_line":"                    content_range.start \u003e\u003d image_size):"},{"line_number":997,"context_line":"                raise webob.exc.HTTPRequestRangeNotSatisfiable()"},{"line_number":998,"context_line":"            return content_range"},{"line_number":999,"context_line":""},{"line_number":1000,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_497a5588","line":997,"range":{"start_line":994,"start_character":12,"end_line":997,"end_character":64},"in_reply_to":"dfeb2761_15958940","updated":"2017-04-03 17:46:05.000000000","message":"Done","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"9965665865a24c08ecf43796b5b5474a578a6d96","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"        # we do not support random read access in stores other than"},{"line_number":972,"context_line":"        # file and cinder. So return None and proceed with full image serving."},{"line_number":973,"context_line":"        if CONF.glance_store.default_store not in [\u0027file\u0027, \u0027cinder\u0027]:"},{"line_number":974,"context_line":"            LOG.warn(\"Random image access is not supported for %s store. \""},{"line_number":975,"context_line":"                     \"Serving with full image instead.\","},{"line_number":976,"context_line":"                     CONF.glance_store.default_store)"},{"line_number":977,"context_line":"            return None"},{"line_number":978,"context_line":""},{"line_number":979,"context_line":"        range_str \u003d self.headers.get(\u0027Range\u0027)"},{"line_number":980,"context_line":"        if range_str is not None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"dfeb2761_6d44fcb7","line":977,"range":{"start_line":973,"start_character":8,"end_line":977,"end_character":23},"updated":"2017-04-03 22:02:08.000000000","message":"My another worry with this is: what is tomorrow swift starts supporting random reads. At that point, the resp code for range requests changes from 200 to 206. \nDo we get into the incompatibility fight again?","commit_id":"e5f231cfd1fec0893a9091b63154c33083405284"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":973,"context_line":""},{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_d95cc5ee","line":976,"range":{"start_line":976,"start_character":24,"end_line":976,"end_character":47},"updated":"2017-04-04 22:09:29.000000000","message":"\"A multiple range request\"","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"e0fe2b627d1f650e20379ffb9ee91402411f9be9","unresolved":false,"context_lines":[{"line_number":973,"context_line":""},{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_fcb892e5","line":976,"range":{"start_line":976,"start_character":24,"end_line":976,"end_character":47},"in_reply_to":"dfeb2761_4bc3365e","updated":"2017-04-05 02:05:36.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"b566c7819e195364d987e3d9608dcb6ae31ba7fb","unresolved":false,"context_lines":[{"line_number":973,"context_line":""},{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_3ecef22d","line":976,"range":{"start_line":976,"start_character":24,"end_line":976,"end_character":47},"in_reply_to":"dfeb2761_d95cc5ee","updated":"2017-04-05 01:57:39.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"bc134eb74f4ef617430621a3b1429ec73d2959f3","unresolved":false,"context_lines":[{"line_number":973,"context_line":""},{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_4bc3365e","line":976,"range":{"start_line":976,"start_character":24,"end_line":976,"end_character":47},"in_reply_to":"dfeb2761_d95cc5ee","updated":"2017-04-05 02:00:52.000000000","message":"I might prefer: is \u003d\u003e are \nbut not a big deal.","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_796b7984","line":977,"updated":"2017-04-04 22:09:29.000000000","message":"(this is a good \u0026 useful message, by the way)","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"bc134eb74f4ef617430621a3b1429ec73d2959f3","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_6bd5da1b","line":977,"range":{"start_line":977,"start_character":46,"end_line":977,"end_character":52},"updated":"2017-04-05 02:00:52.000000000","message":"perhaps: single \u003d\u003e individual","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"e0fe2b627d1f650e20379ffb9ee91402411f9be9","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_3cda7a4b","line":977,"range":{"start_line":977,"start_character":46,"end_line":977,"end_character":52},"in_reply_to":"dfeb2761_6bd5da1b","updated":"2017-04-05 02:05:36.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"b566c7819e195364d987e3d9608dcb6ae31ba7fb","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Multiple range requests is not supported in Glance. \""},{"line_number":977,"context_line":"                       \"You may make multiple single range requests instead.\")"},{"line_number":978,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":979,"context_line":""},{"line_number":980,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_1ecfae29","line":977,"in_reply_to":"dfeb2761_796b7984","updated":"2017-04-05 01:57:39.000000000","message":":)","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":979,"context_line":""},{"line_number":980,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":981,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":982,"context_line":"            # rfc7233, a range like bytes\u003d4- for an image size of 3 is"},{"line_number":983,"context_line":"            # invalidated."},{"line_number":984,"context_line":"            if range_ is None:"},{"line_number":985,"context_line":"                msg \u003d (\"Invalid Range header.\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_59fd55af","line":982,"range":{"start_line":982,"start_character":42,"end_line":982,"end_character":44},"updated":"2017-04-04 22:09:29.000000000","message":"I don\u0027t think you\u0027re talking about suffix-length usage here.  The \"bytes\u003d4-\" is a regular byte-range-spec without the optional last-byte-pos.  The general principle is that it\u0027s illegal for the first-byte-pos to be greater than the last-byte-pos, and when the last-byte-pos is missing, it\u0027s assumed to be the last byte in the image, which is basically the check you\u0027re doing in line 987.  (Maybe this comment is left over from a previous patch that was doing something different here?)","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"b566c7819e195364d987e3d9608dcb6ae31ba7fb","unresolved":false,"context_lines":[{"line_number":979,"context_line":""},{"line_number":980,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"},{"line_number":981,"context_line":"            # NOTE(dharinic): Ensure that in case of suffix-length usage as per"},{"line_number":982,"context_line":"            # rfc7233, a range like bytes\u003d4- for an image size of 3 is"},{"line_number":983,"context_line":"            # invalidated."},{"line_number":984,"context_line":"            if range_ is None:"},{"line_number":985,"context_line":"                msg \u003d (\"Invalid Range header.\")"}],"source_content_type":"text/x-python","patch_set":17,"id":"dfeb2761_dedca6e5","line":982,"range":{"start_line":982,"start_character":42,"end_line":982,"end_character":44},"in_reply_to":"dfeb2761_59fd55af","updated":"2017-04-05 01:57:39.000000000","message":"Done","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"84a31b6837b9601946c93ee91c57a34190f1f603","unresolved":false,"context_lines":[{"line_number":973,"context_line":""},{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Comma separated multiple range requests are not \""},{"line_number":977,"context_line":"                       \"supported in Glance. You may make multiple individual \""},{"line_number":978,"context_line":"                       \"range requests instead.\")"},{"line_number":979,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bff0334d_92d0dacb","line":976,"range":{"start_line":976,"start_character":24,"end_line":976,"end_character":40},"updated":"2017-04-05 18:37:00.000000000","message":"Nit:\nMultiple ranges are always comma separated, there is no other way to specify multiple ranges.\n\nI wonder if this message can be interpreted differently. Instead of \"multiple range requests\" maybe we can say \"Requests with multiple ranges\".\n\nFeel free to ignore, maybe I\u0027m overthinking this.","commit_id":"c84193a2b3677e682d2850e02f8a1f0ff412d6e4"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"180b877ae0d8e73aed95b78121d64a311205d4b1","unresolved":false,"context_lines":[{"line_number":973,"context_line":""},{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Comma separated multiple range requests are not \""},{"line_number":977,"context_line":"                       \"supported in Glance. You may make multiple individual \""},{"line_number":978,"context_line":"                       \"range requests instead.\")"},{"line_number":979,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":18,"id":"bff0334d_b5d6284f","line":976,"range":{"start_line":976,"start_character":24,"end_line":976,"end_character":40},"in_reply_to":"bff0334d_92d0dacb","updated":"2017-04-05 18:53:19.000000000","message":"Done","commit_id":"c84193a2b3677e682d2850e02f8a1f0ff412d6e4"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"84a31b6837b9601946c93ee91c57a34190f1f603","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Comma separated multiple range requests are not \""},{"line_number":977,"context_line":"                       \"supported in Glance. You may make multiple individual \""},{"line_number":978,"context_line":"                       \"range requests instead.\")"},{"line_number":979,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":980,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bff0334d_920d7a92","line":977,"range":{"start_line":977,"start_character":67,"end_line":977,"end_character":77},"updated":"2017-04-05 18:37:00.000000000","message":"Nit.\nIn HTTP parlance, these are called \u0027single\u0027 range.\nAgain, feel free to ignore.","commit_id":"c84193a2b3677e682d2850e02f8a1f0ff412d6e4"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"180b877ae0d8e73aed95b78121d64a311205d4b1","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Comma separated multiple range requests are not \""},{"line_number":977,"context_line":"                       \"supported in Glance. You may make multiple individual \""},{"line_number":978,"context_line":"                       \"range requests instead.\")"},{"line_number":979,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":980,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"bff0334d_755e60e7","line":977,"range":{"start_line":977,"start_character":67,"end_line":977,"end_character":77},"in_reply_to":"bff0334d_920d7a92","updated":"2017-04-05 18:53:19.000000000","message":"Done. Editing this to sound better.","commit_id":"c84193a2b3677e682d2850e02f8a1f0ff412d6e4"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2ec5dbe1c3fdbf75917e20bd1a4da2096510830e","unresolved":false,"context_lines":[{"line_number":974,"context_line":"            # NOTE(dharinic): We do not support multi range requests."},{"line_number":975,"context_line":"            if \u0027,\u0027 in range_str:"},{"line_number":976,"context_line":"                msg \u003d (\"Requests with multiple ranges are not supported in \""},{"line_number":977,"context_line":"                       \"Glance. You may make multiple requests with single \""},{"line_number":978,"context_line":"                       \"ranges individually instead.\")"},{"line_number":979,"context_line":"                raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":980,"context_line":""},{"line_number":981,"context_line":"            range_ \u003d webob.byterange.Range.parse(range_str)"}],"source_content_type":"text/x-python","patch_set":19,"id":"bff0334d_b8d61f4f","line":978,"range":{"start_line":977,"start_character":32,"end_line":978,"end_character":52},"updated":"2017-04-05 19:22:39.000000000","message":"I\u0027m going to get in on the nit action, too.  This would read better as:\n\nYou may make multiple single range requests instead.","commit_id":"8236d0fd8a1b0c5224cb9279e52d8f4a2c0c13c9"}],"glance/tests/functional/v2/test_images.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":767,"context_line":"        for x in range(15):"},{"line_number":768,"context_line":"            # NOTE(flaper87): Read just 1 byte. Content-Range is"},{"line_number":769,"context_line":"            # 0-indexed and it specifies the first byte to read"},{"line_number":770,"context_line":"            # and the last byte to read."},{"line_number":771,"context_line":"            content_range \u003d \u0027bytes %s-%s/15\u0027 % (x, x)"},{"line_number":772,"context_line":"            headers \u003d self._headers({\u0027Content-Range\u0027: content_range})"},{"line_number":773,"context_line":"            path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_42287995","line":770,"updated":"2017-03-29 13:48:15.000000000","message":"Should probably add a note here about supporting content-range (see suggestion at line 780)","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":767,"context_line":"        for x in range(15):"},{"line_number":768,"context_line":"            # NOTE(flaper87): Read just 1 byte. Content-Range is"},{"line_number":769,"context_line":"            # 0-indexed and it specifies the first byte to read"},{"line_number":770,"context_line":"            # and the last byte to read."},{"line_number":771,"context_line":"            content_range \u003d \u0027bytes %s-%s/15\u0027 % (x, x)"},{"line_number":772,"context_line":"            headers \u003d self._headers({\u0027Content-Range\u0027: content_range})"},{"line_number":773,"context_line":"            path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_14585a85","line":770,"in_reply_to":"ffe62b97_42287995","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":777,"context_line":""},{"line_number":778,"context_line":"        self.assertEqual(result_body, image_data)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        # test for failure on unsatisfiable request for ContentRange."},{"line_number":781,"context_line":"        content_range \u003d \u0027bytes 3-16/15\u0027"},{"line_number":782,"context_line":"        headers \u003d self._headers({\u0027Content-Range\u0027: content_range})"},{"line_number":783,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_828681b8","line":780,"updated":"2017-03-29 13:48:15.000000000","message":"Please add \u0027Even though Content-Range is incorrect on requests, we support it for backward compatibility with clients written for pre-Pike Glance.\u0027","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":777,"context_line":""},{"line_number":778,"context_line":"        self.assertEqual(result_body, image_data)"},{"line_number":779,"context_line":""},{"line_number":780,"context_line":"        # test for failure on unsatisfiable request for ContentRange."},{"line_number":781,"context_line":"        content_range \u003d \u0027bytes 3-16/15\u0027"},{"line_number":782,"context_line":"        headers \u003d self._headers({\u0027Content-Range\u0027: content_range})"},{"line_number":783,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_b4488eb2","line":780,"in_reply_to":"ffe62b97_828681b8","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"73a3609055575a81981119a9842b7427945a4a74","unresolved":false,"context_lines":[{"line_number":799,"context_line":"        response \u003d requests.get(path, headers\u003dheaders)"},{"line_number":800,"context_line":"        self.assertEqual(http.REQUESTED_RANGE_NOT_SATISFIABLE,"},{"line_number":801,"context_line":"                         response.status_code)"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"        self.stop_servers()"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def test_download_policy_when_cache_is_not_enabled(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_0de4d60b","line":802,"updated":"2017-03-29 18:04:29.000000000","message":"We really shouldn\u0027t clump all of these tests into one function. At the very least, separate the Content-Range tests from the Range tests.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":799,"context_line":"        response \u003d requests.get(path, headers\u003dheaders)"},{"line_number":800,"context_line":"        self.assertEqual(http.REQUESTED_RANGE_NOT_SATISFIABLE,"},{"line_number":801,"context_line":"                         response.status_code)"},{"line_number":802,"context_line":""},{"line_number":803,"context_line":"        self.stop_servers()"},{"line_number":804,"context_line":""},{"line_number":805,"context_line":"    def test_download_policy_when_cache_is_not_enabled(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_94c90a27","line":802,"in_reply_to":"ffe62b97_0de4d60b","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":760,"context_line":"        image_id \u003d image[\u0027id\u0027]"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"        # Upload data to image"},{"line_number":763,"context_line":"        image_data \u003d \u0027Z\u0027 * 15"},{"line_number":764,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"},{"line_number":765,"context_line":"        headers \u003d self._headers({\u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":766,"context_line":"        response \u003d requests.put(path, headers\u003dheaders, data\u003dimage_data)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_9769d826","line":763,"range":{"start_line":763,"start_character":8,"end_line":763,"end_character":29},"updated":"2017-03-31 16:45:36.000000000","message":"To be able to test what I mentioned in the below comment, let\u0027s make this \u0027ABCDEFGHIJKLMNOPQRSTUVWXYZ\u0027\nThat way, you know exactly what data to expect for a certain range request.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"408daf21b993e8893bcf0945b36dc225044dbfe3","unresolved":false,"context_lines":[{"line_number":760,"context_line":"        image_id \u003d image[\u0027id\u0027]"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"        # Upload data to image"},{"line_number":763,"context_line":"        image_data \u003d \u0027Z\u0027 * 15"},{"line_number":764,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"},{"line_number":765,"context_line":"        headers \u003d self._headers({\u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":766,"context_line":"        response \u003d requests.put(path, headers\u003dheaders, data\u003dimage_data)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_9f18ca81","line":763,"range":{"start_line":763,"start_character":8,"end_line":763,"end_character":29},"in_reply_to":"dfeb2761_9769d826","updated":"2017-03-31 18:11:22.000000000","message":"Good idea, but I would prefer to apply this thinking in the unit test where we are more thorough about hitting all of the cases. Duplicating detailed testing here seems to offer less value and inflates the test size.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"9d4ae9f1386c5bae6551094e3952f22b87f2c253","unresolved":false,"context_lines":[{"line_number":760,"context_line":"        image_id \u003d image[\u0027id\u0027]"},{"line_number":761,"context_line":""},{"line_number":762,"context_line":"        # Upload data to image"},{"line_number":763,"context_line":"        image_data \u003d \u0027Z\u0027 * 15"},{"line_number":764,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"},{"line_number":765,"context_line":"        headers \u003d self._headers({\u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":766,"context_line":"        response \u003d requests.put(path, headers\u003dheaders, data\u003dimage_data)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_550223b6","line":763,"range":{"start_line":763,"start_character":8,"end_line":763,"end_character":29},"in_reply_to":"dfeb2761_9f18ca81","updated":"2017-03-31 22:42:11.000000000","message":"Done","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        headers \u003d self._headers({\u0027Range\u0027: range_})"},{"line_number":772,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"},{"line_number":773,"context_line":"        response \u003d requests.get(path, headers\u003dheaders)"},{"line_number":774,"context_line":"        self.assertEqual(http.PARTIAL_CONTENT, response.status_code)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        # test for failure on unsatisfiable Range request."},{"line_number":777,"context_line":"        range_ \u003d \u0027bytes\u003d10-5\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_d712c0b1","line":774,"range":{"start_line":774,"start_character":8,"end_line":774,"end_character":68},"updated":"2017-03-31 16:45:36.000000000","message":"Here we should check/assert the data returned as well.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"9d4ae9f1386c5bae6551094e3952f22b87f2c253","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        headers \u003d self._headers({\u0027Range\u0027: range_})"},{"line_number":772,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"},{"line_number":773,"context_line":"        response \u003d requests.get(path, headers\u003dheaders)"},{"line_number":774,"context_line":"        self.assertEqual(http.PARTIAL_CONTENT, response.status_code)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        # test for failure on unsatisfiable Range request."},{"line_number":777,"context_line":"        range_ \u003d \u0027bytes\u003d10-5\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_35ff9fab","line":774,"range":{"start_line":774,"start_character":8,"end_line":774,"end_character":68},"in_reply_to":"dfeb2761_5f0a4226","updated":"2017-03-31 22:42:11.000000000","message":"Done","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"408daf21b993e8893bcf0945b36dc225044dbfe3","unresolved":false,"context_lines":[{"line_number":771,"context_line":"        headers \u003d self._headers({\u0027Range\u0027: range_})"},{"line_number":772,"context_line":"        path \u003d self._url(\u0027/v2/images/%s/file\u0027 % image_id)"},{"line_number":773,"context_line":"        response \u003d requests.get(path, headers\u003dheaders)"},{"line_number":774,"context_line":"        self.assertEqual(http.PARTIAL_CONTENT, response.status_code)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"        # test for failure on unsatisfiable Range request."},{"line_number":777,"context_line":"        range_ \u003d \u0027bytes\u003d10-5\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_5f0a4226","line":774,"range":{"start_line":774,"start_character":8,"end_line":774,"end_character":68},"in_reply_to":"dfeb2761_d712c0b1","updated":"2017-03-31 18:11:22.000000000","message":"See above.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"}],"glance/tests/unit/v2/test_image_data_resource.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":548,"context_line":"        self.assertEqual(\u0027application/octet-stream\u0027,"},{"line_number":549,"context_line":"                         response.headers[\u0027Content-Type\u0027])"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def _test_partial_download_successful_ContentRange(self, d_range):"},{"line_number":552,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":553,"context_line":"        request.environ \u003d {}"},{"line_number":554,"context_line":"        request.headers[\u0027Content-Range\u0027] \u003d d_range"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_5549555d","line":551,"updated":"2017-03-29 13:48:15.000000000","message":"Should add a note here about the Content-Range tests being here to prevent regressions since Glance has to support use of Content-Range on requests for compatibility with pre-Pike Glance clients.  Just make up a generic note (see test_images.py for a suggestion) and then copy it to each of the *ContentRange tests below.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":548,"context_line":"        self.assertEqual(\u0027application/octet-stream\u0027,"},{"line_number":549,"context_line":"                         response.headers[\u0027Content-Type\u0027])"},{"line_number":550,"context_line":""},{"line_number":551,"context_line":"    def _test_partial_download_successful_ContentRange(self, d_range):"},{"line_number":552,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":553,"context_line":"        request.environ \u003d {}"},{"line_number":554,"context_line":"        request.headers[\u0027Content-Range\u0027] \u003d d_range"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_545a6282","line":551,"in_reply_to":"ffe62b97_5549555d","updated":"2017-03-29 22:01:02.000000000","message":"Good suggestion Brian. I am reordering all these tests.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"73a3609055575a81981119a9842b7427945a4a74","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":616,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":617,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":618,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _test_partial_download_failures_Range(self, d_range):"},{"line_number":621,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_edd8921e","line":618,"updated":"2017-03-29 18:04:29.000000000","message":"Some additional test cases I would like to see covered:\n\n- test for success on bytes\u003d2-15 (s.t. last-byte-pos \u003e end_pos)\n- extra credit: either test for a success, or status code 500, on bytes\u003d0-0,-1 (a Server Error for now may be good enough, we can add support for multiple ranges later)","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c78b4b39eaea7eff429e62fe0c481ee6b45f08ab","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":616,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":617,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":618,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _test_partial_download_failures_Range(self, d_range):"},{"line_number":621,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"dfeb2761_1294b636","line":618,"in_reply_to":"ffe62b97_3ad227d2","updated":"2017-03-31 15:37:55.000000000","message":"WebOb doesn\u0027t support multi-range requests. If we want to support it, we should do it ourselves.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"24ee46b984e03a38fae85a257fa76954116d8d12","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":616,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":617,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":618,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _test_partial_download_failures_Range(self, d_range):"},{"line_number":621,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_04e364a6","line":618,"in_reply_to":"ffe62b97_3ad227d2","updated":"2017-03-30 15:32:07.000000000","message":"not worried about it much, considered it extra credit. can be solved in a follow-up patch","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"8dd255e3a4940e76905e571dbaf39184dc7fd5e9","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":616,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":617,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":618,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _test_partial_download_failures_Range(self, d_range):"},{"line_number":621,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_9aa373b2","line":618,"in_reply_to":"ffe62b97_7489e672","updated":"2017-03-29 22:20:04.000000000","message":"I rushed at the end, and couldn\u0027t remember/didn\u0027t check for multi-range requests support.\n\nAlso seeing that 2-4 does cover that other case sufficiently.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"aa840f0fdd436d606c105f9ea230dec70fab90bf","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":616,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":617,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":618,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _test_partial_download_failures_Range(self, d_range):"},{"line_number":621,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_3ad227d2","line":618,"in_reply_to":"ffe62b97_9aa373b2","updated":"2017-03-29 22:34:10.000000000","message":"What i have currently will download the first byte for \u00270-0,-1\u0027.\nI think this multi-range request might require some more tinkering if \u00270-0,-1\u0027 is to be served with first and last byte.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":615,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":616,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":617,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":618,"context_line":"        self._test_partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":619,"context_line":""},{"line_number":620,"context_line":"    def _test_partial_download_failures_Range(self, d_range):"},{"line_number":621,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ffe62b97_7489e672","line":618,"in_reply_to":"ffe62b97_edd8921e","updated":"2017-03-29 22:01:02.000000000","message":"Steve. the test in L617 covers your first point. (bytes\u003d2-4 of a 3 byte image)\nFor the second, I have code logic that accepts multi range requests. Had skipped adding a test. Will include now. Thanks Steve.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":560,"context_line":"            response.request \u003d request"},{"line_number":561,"context_line":"            image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":562,"context_line":"            self.serializer.download(response, image)"},{"line_number":563,"context_line":"            self.assertEqual(206, response.status_code)"},{"line_number":564,"context_line":"            self.assertEqual(\u00272\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":565,"context_line":"            self.assertEqual(\u0027bytes 2-3/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":566,"context_line":"            self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-3\u0027)"},{"line_number":569,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_32957ae5","line":566,"range":{"start_line":563,"start_character":12,"end_line":566,"end_character":72},"updated":"2017-03-31 16:45:36.000000000","message":"We should test the data returned as well.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":569,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":570,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":571,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"        def partial_download_failures_Range(d_range):"},{"line_number":574,"context_line":"            request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":575,"context_line":"            request.environ \u003d {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_32f0da67","line":572,"updated":"2017-03-31 16:45:36.000000000","message":"How about partial_download_successful_Range(\u0027bytes\u003d-4\u0027) ?","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5c34346edfcd7d2205035049aa493d1f749500a9","unresolved":false,"context_lines":[{"line_number":569,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":570,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":571,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"        def partial_download_failures_Range(d_range):"},{"line_number":574,"context_line":"            request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":575,"context_line":"            request.environ \u003d {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_7a9f5450","line":572,"in_reply_to":"dfeb2761_1ae96819","updated":"2017-03-31 18:29:29.000000000","message":"Yeah i will just rename my test methods.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"408daf21b993e8893bcf0945b36dc225044dbfe3","unresolved":false,"context_lines":[{"line_number":569,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-\u0027)"},{"line_number":570,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d2-4\u0027)"},{"line_number":571,"context_line":"        partial_download_successful_Range(\u0027bytes\u003d-2\u0027)"},{"line_number":572,"context_line":""},{"line_number":573,"context_line":"        def partial_download_failures_Range(d_range):"},{"line_number":574,"context_line":"            request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":575,"context_line":"            request.environ \u003d {}"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_1ae96819","line":572,"in_reply_to":"dfeb2761_32f0da67","updated":"2017-03-31 18:11:22.000000000","message":"I guess that belongs in the \"partial download\" testing, because it uses the Range header, but it downloads a full image and as Hemanth pointed out, that might not be a partial download. Perhaps just drop \"partial\" from the test names? That is implied by the mention of range.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                              response, image)"},{"line_number":583,"context_line":"            return"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        partial_download_failures_Range(\u0027bytes\u003d4-1\u0027)"},{"line_number":586,"context_line":"        partial_download_failures_Range(\u0027bytes\u003d4-\u0027)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def test_multi_range_requests(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_0914889f","line":585,"range":{"start_line":585,"start_character":8,"end_line":585,"end_character":52},"updated":"2017-03-31 16:45:36.000000000","message":"how about adding partial_download_failures_Range(\u0027bytes\u003d3-\u0027) ?","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5c34346edfcd7d2205035049aa493d1f749500a9","unresolved":false,"context_lines":[{"line_number":582,"context_line":"                              response, image)"},{"line_number":583,"context_line":"            return"},{"line_number":584,"context_line":""},{"line_number":585,"context_line":"        partial_download_failures_Range(\u0027bytes\u003d4-1\u0027)"},{"line_number":586,"context_line":"        partial_download_failures_Range(\u0027bytes\u003d4-\u0027)"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"    def test_multi_range_requests(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_3aa9cc7a","line":585,"range":{"start_line":585,"start_character":8,"end_line":585,"end_character":52},"in_reply_to":"dfeb2761_0914889f","updated":"2017-03-31 18:29:29.000000000","message":"Done","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def test_multi_range_requests(self):"},{"line_number":589,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":590,"context_line":"        request.environ \u003d {}"},{"line_number":591,"context_line":"        request.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d0-0,-1\u0027"},{"line_number":592,"context_line":"        response \u003d webob.Response()"},{"line_number":593,"context_line":"        response.request \u003d request"},{"line_number":594,"context_line":"        image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":595,"context_line":"        self.serializer.download(response, image)"},{"line_number":596,"context_line":"        self.assertEqual(206, response.status_code)"},{"line_number":597,"context_line":"        self.assertEqual(\u00271\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":598,"context_line":"        self.assertEqual(\u0027bytes 0-0/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":599,"context_line":"        self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def test_download_failure_with_valid_range(self):"},{"line_number":602,"context_line":"        with mock.patch.object(glance.api.policy.ImageProxy,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_464a7f55","line":599,"range":{"start_line":591,"start_character":0,"end_line":599,"end_character":68},"updated":"2017-03-31 16:45:36.000000000","message":"Is this correct behavior as per the RFC?\nIt looks like we are ignoring the other range (-1 in this case), is that okay?","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"ded78135da4b536d81bd00cc4dc5e63cca46f3aa","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def test_multi_range_requests(self):"},{"line_number":589,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":590,"context_line":"        request.environ \u003d {}"},{"line_number":591,"context_line":"        request.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d0-0,-1\u0027"},{"line_number":592,"context_line":"        response \u003d webob.Response()"},{"line_number":593,"context_line":"        response.request \u003d request"},{"line_number":594,"context_line":"        image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":595,"context_line":"        self.serializer.download(response, image)"},{"line_number":596,"context_line":"        self.assertEqual(206, response.status_code)"},{"line_number":597,"context_line":"        self.assertEqual(\u00271\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":598,"context_line":"        self.assertEqual(\u0027bytes 0-0/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":599,"context_line":"        self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def test_download_failure_with_valid_range(self):"},{"line_number":602,"context_line":"        with mock.patch.object(glance.api.policy.ImageProxy,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_fa6484bb","line":599,"range":{"start_line":591,"start_character":0,"end_line":599,"end_character":68},"in_reply_to":"dfeb2761_464a7f55","updated":"2017-03-31 18:14:13.000000000","message":"Steve suggested that we add support for multi-range  as a follow up. However, the way the code currently is, it will support \"0-0\". It is ignoring the \"-1\" that follows after a comma. I can work and add support for it too. (Will make the code nasty.. But its better to do it fully i guess)","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"9d4ae9f1386c5bae6551094e3952f22b87f2c253","unresolved":false,"context_lines":[{"line_number":588,"context_line":"    def test_multi_range_requests(self):"},{"line_number":589,"context_line":"        request \u003d wsgi.Request.blank(\u0027/\u0027)"},{"line_number":590,"context_line":"        request.environ \u003d {}"},{"line_number":591,"context_line":"        request.headers[\u0027Range\u0027] \u003d \u0027bytes\u003d0-0,-1\u0027"},{"line_number":592,"context_line":"        response \u003d webob.Response()"},{"line_number":593,"context_line":"        response.request \u003d request"},{"line_number":594,"context_line":"        image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":595,"context_line":"        self.serializer.download(response, image)"},{"line_number":596,"context_line":"        self.assertEqual(206, response.status_code)"},{"line_number":597,"context_line":"        self.assertEqual(\u00271\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":598,"context_line":"        self.assertEqual(\u0027bytes 0-0/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":599,"context_line":"        self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":600,"context_line":""},{"line_number":601,"context_line":"    def test_download_failure_with_valid_range(self):"},{"line_number":602,"context_line":"        with mock.patch.object(glance.api.policy.ImageProxy,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_ae77d93a","line":599,"range":{"start_line":591,"start_character":0,"end_line":599,"end_character":68},"in_reply_to":"dfeb2761_fa6484bb","updated":"2017-03-31 22:42:11.000000000","message":"Just noting that we decided to throw 400 in IRC.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":629,"context_line":"            response.request \u003d request"},{"line_number":630,"context_line":"            image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":631,"context_line":"            self.serializer.download(response, image)"},{"line_number":632,"context_line":"            self.assertEqual(206, response.status_code)"},{"line_number":633,"context_line":"            self.assertEqual(\u00272\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":634,"context_line":"            self.assertEqual(\u0027bytes 1-2/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":635,"context_line":"            self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":636,"context_line":""},{"line_number":637,"context_line":"        partial_download_successful_ContentRange(\u0027bytes 1-2/3\u0027)"},{"line_number":638,"context_line":"        partial_download_successful_ContentRange(\u0027bytes 1-2/*\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_46915f99","line":635,"range":{"start_line":632,"start_character":0,"end_line":635,"end_character":72},"updated":"2017-03-31 16:45:36.000000000","message":"same, we must test the return data as well.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":650,"context_line":"            return"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 1-4/3\u0027)"},{"line_number":653,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 1-4/*\u0027)"},{"line_number":654,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 4-1/3\u0027)"},{"line_number":655,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 4-1/*\u0027)"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_e6d63350","line":653,"range":{"start_line":653,"start_character":8,"end_line":653,"end_character":61},"updated":"2017-03-31 16:45:36.000000000","message":"Not so sure about this one. I\u0027m confusing myself here with Range and Content-Range probably. But, request a bigger chunk than what is available should be okay, at least according to Range specification.\n\nEssentially, 1-4/* should return 1st and 2nd bytes right?","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5c34346edfcd7d2205035049aa493d1f749500a9","unresolved":false,"context_lines":[{"line_number":650,"context_line":"            return"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 1-4/3\u0027)"},{"line_number":653,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 1-4/*\u0027)"},{"line_number":654,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 4-1/3\u0027)"},{"line_number":655,"context_line":"        partial_download_failures_ContentRange(\u0027bytes 4-1/*\u0027)"},{"line_number":656,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dfeb2761_baeefc85","line":653,"range":{"start_line":653,"start_character":8,"end_line":653,"end_character":61},"in_reply_to":"dfeb2761_e6d63350","updated":"2017-03-31 18:29:29.000000000","message":"So what 1-4.* means is that the user needs 1-4/3. And, as per rfc 7233 (https://tools.ietf.org/html/rfc7233#section-4.2), the last byte position cannot be more than the length. So I think this is good as a failure itself.\n\nThis is an example as to how Range and Content-Range can be different. This test is treated as a failure only cos it has a \"length\" which Range headers lack.","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":559,"context_line":"            response \u003d webob.Response()"},{"line_number":560,"context_line":"            response.request \u003d request"},{"line_number":561,"context_line":"            image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":562,"context_line":"            self.serializer.download(response, image)"},{"line_number":563,"context_line":"            self.assertEqual(206, response.status_code)"},{"line_number":564,"context_line":"            self.assertEqual(\u00272\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":565,"context_line":"            self.assertEqual(\u0027bytes 1-2/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":566,"context_line":"            self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        download_successful_Range(\u0027bytes\u003d1-2\u0027)"},{"line_number":569,"context_line":"        download_successful_Range(\u0027bytes\u003d1-\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_b5937ca3","line":566,"range":{"start_line":562,"start_character":0,"end_line":566,"end_character":72},"updated":"2017-04-03 16:27:39.000000000","message":"Are we not asserting the response body due to the error you encountered?","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":559,"context_line":"            response \u003d webob.Response()"},{"line_number":560,"context_line":"            response.request \u003d request"},{"line_number":561,"context_line":"            image \u003d FakeImage(size\u003d3, data\u003d[b\u0027Z\u0027, b\u0027Z\u0027, b\u0027Z\u0027])"},{"line_number":562,"context_line":"            self.serializer.download(response, image)"},{"line_number":563,"context_line":"            self.assertEqual(206, response.status_code)"},{"line_number":564,"context_line":"            self.assertEqual(\u00272\u0027, response.headers[\u0027Content-Length\u0027])"},{"line_number":565,"context_line":"            self.assertEqual(\u0027bytes 1-2/3\u0027, response.headers[\u0027Content-Range\u0027])"},{"line_number":566,"context_line":"            self.assertEqual(\u0027bytes\u0027, response.headers[\u0027Accept-Ranges\u0027])"},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"        download_successful_Range(\u0027bytes\u003d1-2\u0027)"},{"line_number":569,"context_line":"        download_successful_Range(\u0027bytes\u003d1-\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_245bb8f7","line":566,"range":{"start_line":562,"start_character":0,"end_line":566,"end_character":72},"in_reply_to":"dfeb2761_b5937ca3","updated":"2017-04-03 17:46:05.000000000","message":"Yes Hemanth. An example of the error:\nhttp://paste.openstack.org/show/605116/\n\nwsgi\u0027s request response works in a weird way that in case of a partial download, it invalidates the response.body saying that there is a Content-length mismatch.\nThere is no issue if we download the full image with the range though.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        full_image_download_w_range(\u0027bytes\u003d0-3\u0027)"},{"line_number":589,"context_line":"        full_image_download_w_range(\u0027bytes\u003d-3\u0027)"},{"line_number":590,"context_line":"        full_image_download_w_range(\u0027bytes\u003d-4\u0027)"},{"line_number":591,"context_line":"        full_image_download_w_range(\u0027bytes\u003d-100\u0027)"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        def download_failures_Range(d_range):"},{"line_number":594,"context_line":"            request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_95e75841","line":591,"updated":"2017-04-03 16:27:39.000000000","message":"How about adding full_image_download_w_range(\u0027bytes\u003d0-\u0027)?","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":588,"context_line":"        full_image_download_w_range(\u0027bytes\u003d0-3\u0027)"},{"line_number":589,"context_line":"        full_image_download_w_range(\u0027bytes\u003d-3\u0027)"},{"line_number":590,"context_line":"        full_image_download_w_range(\u0027bytes\u003d-4\u0027)"},{"line_number":591,"context_line":"        full_image_download_w_range(\u0027bytes\u003d-100\u0027)"},{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        def download_failures_Range(d_range):"},{"line_number":594,"context_line":"            request \u003d wsgi.Request.blank(\u0027/\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_5b633f43","line":591,"in_reply_to":"dfeb2761_95e75841","updated":"2017-04-03 17:46:05.000000000","message":"Done","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"4ff0e24714245b4be770d0dcf501a5d8ed498a80","unresolved":false,"context_lines":[{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        download_failures_ContentRange(\u0027bytes 1-3/3\u0027)"},{"line_number":676,"context_line":"        download_failures_ContentRange(\u0027bytes 1-4/3\u0027)"},{"line_number":677,"context_line":"        download_failures_ContentRange(\u0027bytes 1-4/*\u0027)"},{"line_number":678,"context_line":"        download_failures_ContentRange(\u0027bytes 4-1/3\u0027)"},{"line_number":679,"context_line":"        download_failures_ContentRange(\u0027bytes 4-1/*\u0027)"},{"line_number":680,"context_line":"        download_failures_ContentRange(\u0027bytes 4-8/*\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_b5f49cd0","line":677,"range":{"start_line":677,"start_character":8,"end_line":677,"end_character":53},"updated":"2017-04-03 16:27:39.000000000","message":"As I commented earlier, this shouldn\u0027t be an error.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"1dbc7f8c179083deb9ceecf00ccf5b25328140d2","unresolved":false,"context_lines":[{"line_number":674,"context_line":""},{"line_number":675,"context_line":"        download_failures_ContentRange(\u0027bytes 1-3/3\u0027)"},{"line_number":676,"context_line":"        download_failures_ContentRange(\u0027bytes 1-4/3\u0027)"},{"line_number":677,"context_line":"        download_failures_ContentRange(\u0027bytes 1-4/*\u0027)"},{"line_number":678,"context_line":"        download_failures_ContentRange(\u0027bytes 4-1/3\u0027)"},{"line_number":679,"context_line":"        download_failures_ContentRange(\u0027bytes 4-1/*\u0027)"},{"line_number":680,"context_line":"        download_failures_ContentRange(\u0027bytes 4-8/*\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dfeb2761_a95561c8","line":677,"range":{"start_line":677,"start_character":8,"end_line":677,"end_character":53},"in_reply_to":"dfeb2761_b5f49cd0","updated":"2017-04-03 17:46:05.000000000","message":"Lets address this issue in a follow-up patch as discussed on IRC.","commit_id":"96d8bb18c8aaa19ad39544c23ed16d6ba5bddd60"}],"releasenotes/notes/range-header-request-83cf11eebf865fb1.yaml":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3a5b7bf6ba81a20210237d3ec523e2b5cd253b0e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"deprecations:"},{"line_number":3,"context_line":"  - Please note that the acceptance of ``Content-Range`` request header for"},{"line_number":4,"context_line":"    partial image downloads has been deprecated and its support will be removed"},{"line_number":5,"context_line":"    after Queens. Please use the ``Range`` request header for this purpose"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"ba2be162_abd63525","line":2,"updated":"2017-03-06 16:45:40.000000000","message":"remove this section","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"3a5b7bf6ba81a20210237d3ec523e2b5cd253b0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"ba2be162_2bca456f","line":12,"updated":"2017-03-06 16:45:40.000000000","message":"Replace the first sentence with this:\n\nGlance had been accepting the Content-Range header for GET v2/images/{image_id}/file requests, contrary to RFC 7233. The Range header is now accepted for such requests.","commit_id":"635552e18fbf5ab103b8fae79b8b459424e2252d"},{"author":{"_account_id":12807,"name":"Steve Lewis (stevelle)","email":"stevelle@gmail.com","username":"stevelle"},"change_message_id":"73a3609055575a81981119a9842b7427945a4a74","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - Glance had been accepting the Content-Range header for"},{"line_number":4,"context_line":"    GET v2/images/{image_id}/file requests, contrary to RFC 7233."},{"line_number":5,"context_line":"    The Range header is now accepted for such requests. The response header"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"ffe62b97_edfbf243","line":2,"updated":"2017-03-29 18:04:29.000000000","message":"I would like this to go under fixes, myself.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - Glance had been accepting the Content-Range header for"},{"line_number":4,"context_line":"    GET v2/images/{image_id}/file requests, contrary to RFC 7233."},{"line_number":5,"context_line":"    The Range header is now accepted for such requests. The response header"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"ffe62b97_d4a9d223","line":2,"in_reply_to":"ffe62b97_edfbf243","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"dc8eae769f1ea703bdbd0a269f4765908e121f9f","unresolved":false,"context_lines":[{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - Glance had been accepting the Content-Range header for"},{"line_number":4,"context_line":"    GET v2/images/{image_id}/file requests, contrary to RFC 7233."},{"line_number":5,"context_line":"    The Range header is now accepted for such requests. The response header"},{"line_number":6,"context_line":"    will now include ``Content-Range`` and ``Accept-Ranges`` upon a successful"},{"line_number":7,"context_line":"    delivery of the requested partial content."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"ffe62b97_75cd7983","line":7,"range":{"start_line":5,"start_character":56,"end_line":7,"end_character":46},"updated":"2017-03-29 13:48:15.000000000","message":"let\u0027s make this a separate point:\n\n- Following RFC 7233, Glance now includes a ``Content-Range`` header upon successful delivery of the requested partial content.","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"5b72eeb393c564b4d1c47a6b0c495395b0aaffb4","unresolved":false,"context_lines":[{"line_number":2,"context_line":"other:"},{"line_number":3,"context_line":"  - Glance had been accepting the Content-Range header for"},{"line_number":4,"context_line":"    GET v2/images/{image_id}/file requests, contrary to RFC 7233."},{"line_number":5,"context_line":"    The Range header is now accepted for such requests. The response header"},{"line_number":6,"context_line":"    will now include ``Content-Range`` and ``Accept-Ranges`` upon a successful"},{"line_number":7,"context_line":"    delivery of the requested partial content."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"ffe62b97_b4a40e4c","line":7,"range":{"start_line":5,"start_character":56,"end_line":7,"end_character":46},"in_reply_to":"ffe62b97_75cd7983","updated":"2017-03-29 22:01:02.000000000","message":"Done","commit_id":"28626252c162d7fe9e70c4f0d68ba60fb4f9687a"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"c16961826b968a5a9c4b805bcaff0fe8960b92f9","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Following RFC 7233, Glance will now:"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    * Accept the Range header in requests to serve partial images."},{"line_number":9,"context_line":"    * Includes a ``Content-Range`` header upon successful delivery of the requested partial content."}],"source_content_type":"text/x-yaml","patch_set":8,"id":"dfeb2761_96133ab9","line":9,"range":{"start_line":9,"start_character":13,"end_line":9,"end_character":14},"updated":"2017-03-31 16:45:36.000000000","message":"can be dropped","commit_id":"92652198aae8e940bd60e7f170fb27b8fada2b16"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"b4b73388a29c93d41428753cd6ed9475a13eaebb","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Glance had been accepting the Content-Range header for GET v2/images/{image_id}/file requests,"},{"line_number":5,"context_line":"    contrary to RFC 7233."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"dfeb2761_0938a4ec","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"updated":"2017-04-04 17:07:12.000000000","message":"Should this be under fixes?\nWhat about features/other?","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"7c3b6ce3efa39e98aa023f8a48ca29f8356d7033","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Glance had been accepting the Content-Range header for GET v2/images/{image_id}/file requests,"},{"line_number":5,"context_line":"    contrary to RFC 7233."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"dfeb2761_e43ec789","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"in_reply_to":"dfeb2761_0938a4ec","updated":"2017-04-04 17:14:17.000000000","message":"I had it under \u0027others\u0027. Moved it to \u0027fixes\u0027 based on earlier reviews.\nThe reason for fixes could be that now we support the correct request header. Thoughts?","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"a0e79294be3ff53a8201685121a0c76116a70b45","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Glance had been accepting the Content-Range header for GET v2/images/{image_id}/file requests,"},{"line_number":5,"context_line":"    contrary to RFC 7233."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"dfeb2761_84ca5b4b","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":5},"in_reply_to":"dfeb2761_e43ec789","updated":"2017-04-04 17:19:05.000000000","message":"Could be a matter of perspective but I was thinking it\u0027s a feature  (at least not a fix) because we are not fixing anything existing, which is accepting Content-Range. We are adding stuff on top.\n\nLet\u0027s see what Brian thinks. Writing release notes is not one of my super powers :)","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"b4b73388a29c93d41428753cd6ed9475a13eaebb","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    contrary to RFC 7233."},{"line_number":6,"context_line":"    Following RFC 7233, Glance will now:"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    * Accept the Range header in requests to serve partial images for file and cinder stores.."},{"line_number":9,"context_line":"    * Include a ``Content-Range`` header upon successful delivery of the requested partial content."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"dfeb2761_a97898c3","line":8,"range":{"start_line":8,"start_character":65,"end_line":8,"end_character":94},"updated":"2017-04-04 17:07:12.000000000","message":"This could be confusing. Either we elaborate the entire story around how partial image downloads are dependent on the backend stores or we just don\u0027t talk about it. We can add this detail in the release notes for the bug fix we plan to work on next.","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"7c3b6ce3efa39e98aa023f8a48ca29f8356d7033","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    contrary to RFC 7233."},{"line_number":6,"context_line":"    Following RFC 7233, Glance will now:"},{"line_number":7,"context_line":""},{"line_number":8,"context_line":"    * Accept the Range header in requests to serve partial images for file and cinder stores.."},{"line_number":9,"context_line":"    * Include a ``Content-Range`` header upon successful delivery of the requested partial content."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"dfeb2761_c4f503ef","line":8,"range":{"start_line":8,"start_character":65,"end_line":8,"end_character":94},"in_reply_to":"dfeb2761_a97898c3","updated":"2017-04-04 17:14:17.000000000","message":"Done","commit_id":"b454421b66dc15cdc0f855ddd1e58f34301b388b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Glance had been accepting the Content-Range header for GET v2/images/{image_id}/file requests,"},{"line_number":5,"context_line":"    contrary to RFC 7233."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"dfeb2761_54e19c29","line":2,"updated":"2017-04-04 22:09:29.000000000","message":"I think this is correct, this seems like a fix to me.","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"4b7f4ffdf78885fef571366c0e4f172b9adaafc5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"dfeb2761_147d547e","line":10,"updated":"2017-04-04 22:09:29.000000000","message":"Maybe add a new paragraph after the bullet points (assuming that what I\u0027m about to say is correct):\n\nNot all Glance storage backends support partial downloads.  A Range request to a Glance server with such a backend will result in the entire image content being delivered.  The response code in this case is a 206.\n\n(The RFC 7233 says that you MUST include a Content-Range with a 206. Looks like that\u0027s what\u0027s happening at line 341 of image_data.py.  Don\u0027t know if we want to add that in this case, the Content-Range header will indicate that the full image was delivered.)","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"b566c7819e195364d987e3d9608dcb6ae31ba7fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":17,"id":"dfeb2761_9e2cdeac","line":10,"in_reply_to":"dfeb2761_147d547e","updated":"2017-04-05 01:57:39.000000000","message":"The Content-Range will be included. But it will be formed with the details fed in via the Range request.\nSay we got a partial image download request for a 100 byte image stored in Swift with Range \"bytes\u003d10-20\".\nThe response status code will be 206. And the response Content-Range will be \"bytes 10-20/100\" but we would be returning the full image (0-99/100).\n\nHemanth had suggested to check for store capabilities for random read. We could check for the read random capabilities of the store before attempting to fetch the image. However, there is some levels of abstractions being skipped if we do this (create a store object and just check for it read random capabilities.)\nBut also note that similar but not exact things were being done in v1 images.py.\n\nThe other dirty solution was a hard coded hack which for checking the store, as in PS 15 which is bad. So currently we return full image but with the responses of what a successful partial image served, would have been for an image download from any store but for file and cinder.","commit_id":"c85a9a33e43c4063e3daa229c32a39547d69792b"},{"author":{"_account_id":8158,"name":"Hemanth Makkapati","email":"makstacker+osgerrit@gmail.com","username":"hemanth.makkapati"},"change_message_id":"84a31b6837b9601946c93ee91c57a34190f1f603","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    * Include a ``Content-Range`` header upon successful delivery of the requested partial content."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    Please note that not all Glance storage backends support partial downloads. A Range request to a"},{"line_number":12,"context_line":"    Glance server with such a backend will result in the entire image content being delivered."},{"line_number":13,"context_line":"    The response code in this case will be 206."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"bff0334d_d2dc221a","line":13,"range":{"start_line":12,"start_character":93,"end_line":13,"end_character":47},"updated":"2017-04-05 18:37:00.000000000","message":"Not sure if the distinction is obvious here.\nHow about replacing with \"despite the 206 response code\" just to mark the distinction very clearly?\n\nPlease don\u0027t hate me for nitpicking :)","commit_id":"c84193a2b3677e682d2850e02f8a1f0ff412d6e4"},{"author":{"_account_id":21722,"name":"Dharini Chandrasekar","email":"dharini.chandrasekar@intel.com","username":"dharinic"},"change_message_id":"180b877ae0d8e73aed95b78121d64a311205d4b1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    * Include a ``Content-Range`` header upon successful delivery of the requested partial content."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    Please note that not all Glance storage backends support partial downloads. A Range request to a"},{"line_number":12,"context_line":"    Glance server with such a backend will result in the entire image content being delivered."},{"line_number":13,"context_line":"    The response code in this case will be 206."}],"source_content_type":"text/x-yaml","patch_set":18,"id":"bff0334d_b5c06852","line":13,"range":{"start_line":12,"start_character":93,"end_line":13,"end_character":47},"in_reply_to":"bff0334d_d2dc221a","updated":"2017-04-05 18:53:19.000000000","message":"Done","commit_id":"c84193a2b3677e682d2850e02f8a1f0ff412d6e4"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2ec5dbe1c3fdbf75917e20bd1a4da2096510830e","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    * Accept the Range header in requests to serve partial images."},{"line_number":9,"context_line":"    * Include a ``Content-Range`` header upon successful delivery of the requested partial content."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    Please note that not all Glance storage backends support partial downloads. A Range request to a"},{"line_number":12,"context_line":"    Glance server with such a backend will result in the entire image content being delivered"},{"line_number":13,"context_line":"    despite the 206 response code."}],"source_content_type":"text/x-yaml","patch_set":19,"id":"bff0334d_d80443c9","line":13,"range":{"start_line":11,"start_character":80,"end_line":13,"end_character":34},"updated":"2017-04-05 19:22:39.000000000","message":"We\u0027ll be removing/replacing this sentence on a follow-up patch after you decide how to handle backends that don\u0027t support partial downloads--we\u0027ll either be rejecting the request entirely, or returning the entire image, but either with 200 or with 206 and the correct Content-Range value (indicating the entire image).","commit_id":"8236d0fd8a1b0c5224cb9279e52d8f4a2c0c13c9"}]}
