)]}'
{"swift/common/middleware/dlo.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"588df951f07b67a76444494bbf38338628a7f7ce","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    break"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"                seg_name \u003d segment[\u0027name\u0027]"},{"line_number":190,"context_line":"                if six.PY2 and isinstance(seg_name, six.text_type):"},{"line_number":191,"context_line":"                    seg_name \u003d seg_name.encode(\"utf-8\")"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"                # We deliberately omit the etag and size here;"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_7d501e33","line":190,"range":{"start_line":190,"start_character":31,"end_line":190,"end_character":66},"updated":"2019-02-26 22:42:54.000000000","message":"These days, this part should always be true, yeah?","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8150ed6ba92b3dac968936f9e0b2cad75c30d192","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    break"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"                seg_name \u003d segment[\u0027name\u0027]"},{"line_number":190,"context_line":"                if six.PY2 and isinstance(seg_name, six.text_type):"},{"line_number":191,"context_line":"                    seg_name \u003d seg_name.encode(\"utf-8\")"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"                # We deliberately omit the etag and size here;"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_aa7ffb12","line":190,"range":{"start_line":190,"start_character":31,"end_line":190,"end_character":66},"in_reply_to":"5fc1f717_6a6113d3","updated":"2019-03-27 05:09:15.000000000","message":"IIRC, it was the change in https://review.openstack.org/#/c/642920/3/swift/common/request_helpers.py","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"7f02875f9653b0aafd281b35504b4e2d78cc1517","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    break"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"                seg_name \u003d segment[\u0027name\u0027]"},{"line_number":190,"context_line":"                if six.PY2 and isinstance(seg_name, six.text_type):"},{"line_number":191,"context_line":"                    seg_name \u003d seg_name.encode(\"utf-8\")"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"                # We deliberately omit the etag and size here;"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_6a6113d3","line":190,"range":{"start_line":190,"start_character":31,"end_line":190,"end_character":66},"in_reply_to":"9fdfeff1_7d501e33","updated":"2019-03-27 04:38:33.000000000","message":"Actually, I take it back. Yes, isinstance() is probably unnecessary. But swapping out for wsgi_seg_name from the alt does not work: something double-converts the path: it turns into a result of p.encode(\u0027utf-8\u0027).decode(\u0027latin-1\u0027).encode(\u0027utf-8\u0027).decode(\u0027latin-1\u0027). So I had to keep this. I don\u0027t know how you manage in the alt.","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"43be6bfc5384e1facc1eecdcce1f8eafbdcfcbde","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                    break"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"                seg_name \u003d segment[\u0027name\u0027]"},{"line_number":190,"context_line":"                if six.PY2 and isinstance(seg_name, six.text_type):"},{"line_number":191,"context_line":"                    seg_name \u003d seg_name.encode(\"utf-8\")"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"                # We deliberately omit the etag and size here;"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_fb7e3f68","line":190,"range":{"start_line":190,"start_character":31,"end_line":190,"end_character":66},"in_reply_to":"9fdfeff1_7d501e33","updated":"2019-03-26 22:02:18.000000000","message":"Obviated by taking wsgi_seg_name thing from the alt.","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90c163b0dfc4f93ed018714ea69d6ff157cbf11c","unresolved":false,"context_lines":[{"line_number":196,"context_line":"                # that the objects\u0027 names match the specified prefix."},{"line_number":197,"context_line":"                # SegmentedIterable will instead check that the data read"},{"line_number":198,"context_line":"                # from each segment matches the response headers."},{"line_number":199,"context_line":"                _path \u003d \"/\".join([\"\", version, account, container, seg_name])"},{"line_number":200,"context_line":"                _first \u003d None if first_byte \u003c\u003d 0 else first_byte"},{"line_number":201,"context_line":"                _last \u003d None if last_byte \u003e\u003d seg_length - 1 else last_byte"},{"line_number":202,"context_line":"                yield {"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_bf5e9141","line":199,"range":{"start_line":199,"start_character":47,"end_line":199,"end_character":75},"updated":"2019-03-12 23:12:54.000000000","message":"Which ones are wsgi strings and which ones are native? It seems like account must be wsgi while container and seg_name are native...","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"588df951f07b67a76444494bbf38338628a7f7ce","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":235,"context_line":"        container \u003d unquote(container)"},{"line_number":236,"context_line":"        obj_prefix \u003d unquote(obj_prefix)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":239,"context_line":"        error_response, segments \u003d self._get_container_listing("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_dd3d8a2c","line":236,"updated":"2019-02-26 22:42:54.000000000","message":"What encoding is unquote() going to use? Looks like it\u0027s coming from urllib.parse, so I guess UTF-8? How\u0027s our test coverage for non-ascii manifests?","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"43be6bfc5384e1facc1eecdcce1f8eafbdcfcbde","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":235,"context_line":"        container \u003d unquote(container)"},{"line_number":236,"context_line":"        obj_prefix \u003d unquote(obj_prefix)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":239,"context_line":"        error_response, segments \u003d self._get_container_listing("}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_9b993bc5","line":236,"in_reply_to":"5fc1f717_d2e64be9","updated":"2019-03-26 22:02:18.000000000","message":"Done","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90c163b0dfc4f93ed018714ea69d6ff157cbf11c","unresolved":false,"context_lines":[{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":235,"context_line":"        container \u003d unquote(container)"},{"line_number":236,"context_line":"        obj_prefix \u003d unquote(obj_prefix)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":239,"context_line":"        error_response, segments \u003d self._get_container_listing("}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_d2e64be9","line":236,"in_reply_to":"9fdfeff1_dd3d8a2c","updated":"2019-03-12 23:12:54.000000000","message":"I\u0027m worried about how unquote() is lossy -- I think we\u0027re gonna want wsgi_unquote here.","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90c163b0dfc4f93ed018714ea69d6ff157cbf11c","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                                if h.lower() !\u003d \"etag\"]"},{"line_number":311,"context_line":"            etag \u003d md5()"},{"line_number":312,"context_line":"            for seg_dict in segments:"},{"line_number":313,"context_line":"                etag.update(seg_dict[\u0027hash\u0027].strip(\u0027\"\u0027).encode(\u0027ascii\u0027))"},{"line_number":314,"context_line":"            response_headers.append((\u0027Etag\u0027, \u0027\"%s\"\u0027 % etag.hexdigest()))"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        app_iter \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_5fa9ad21","line":313,"range":{"start_line":313,"start_character":64,"end_line":313,"end_character":69},"updated":"2019-03-12 23:12:54.000000000","message":"I\u0027m debating about being defensive and saying utf8 here...\n\nIf we stick with ASCII, maybe we could crack open the hash entry and only grab things before any semicolon that may be present?","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"43be6bfc5384e1facc1eecdcce1f8eafbdcfcbde","unresolved":false,"context_lines":[{"line_number":310,"context_line":"                                if h.lower() !\u003d \"etag\"]"},{"line_number":311,"context_line":"            etag \u003d md5()"},{"line_number":312,"context_line":"            for seg_dict in segments:"},{"line_number":313,"context_line":"                etag.update(seg_dict[\u0027hash\u0027].strip(\u0027\"\u0027).encode(\u0027ascii\u0027))"},{"line_number":314,"context_line":"            response_headers.append((\u0027Etag\u0027, \u0027\"%s\"\u0027 % etag.hexdigest()))"},{"line_number":315,"context_line":""},{"line_number":316,"context_line":"        app_iter \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_fb571f00","line":313,"range":{"start_line":313,"start_character":64,"end_line":313,"end_character":69},"in_reply_to":"5fc1f717_5fa9ad21","updated":"2019-03-26 22:02:18.000000000","message":"Done","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8150ed6ba92b3dac968936f9e0b2cad75c30d192","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                               prefix, marker\u003d\u0027\u0027):"},{"line_number":146,"context_line":"        con_req \u003d make_subrequest("},{"line_number":147,"context_line":"            req.environ,"},{"line_number":148,"context_line":"            path\u003dquote(\u0027/\u0027.join([\u0027\u0027, version, account, container])),"},{"line_number":149,"context_line":"            method\u003d\u0027GET\u0027,"},{"line_number":150,"context_line":"            headers\u003d{\u0027x-auth-token\u0027: req.headers.get(\u0027x-auth-token\u0027)},"},{"line_number":151,"context_line":"            agent\u003d(\u0027%(orig)s \u0027 + \u0027DLO MultipartGET\u0027), swift_source\u003d\u0027DLO\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_aaa4dba6","line":148,"range":{"start_line":148,"start_character":17,"end_line":148,"end_character":22},"updated":"2019-03-27 05:09:15.000000000","message":"Hmm... still using quote? Maybe that\u0027ll still work if we\u0027ve got all native strings...","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"34926a4f23fa4d9ff8e9a2c475b66cc6ea6f6dff","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                               prefix, marker\u003d\u0027\u0027):"},{"line_number":146,"context_line":"        con_req \u003d make_subrequest("},{"line_number":147,"context_line":"            req.environ,"},{"line_number":148,"context_line":"            path\u003dquote(\u0027/\u0027.join([\u0027\u0027, version, account, container])),"},{"line_number":149,"context_line":"            method\u003d\u0027GET\u0027,"},{"line_number":150,"context_line":"            headers\u003d{\u0027x-auth-token\u0027: req.headers.get(\u0027x-auth-token\u0027)},"},{"line_number":151,"context_line":"            agent\u003d(\u0027%(orig)s \u0027 + \u0027DLO MultipartGET\u0027), swift_source\u003d\u0027DLO\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_26587a54","line":148,"range":{"start_line":148,"start_character":17,"end_line":148,"end_character":22},"in_reply_to":"5fc1f717_aaa4dba6","updated":"2019-04-05 02:38:05.000000000","message":"Oh, right. Container is user-supplied.","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8150ed6ba92b3dac968936f9e0b2cad75c30d192","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            elif last_byte \u003c 0:"},{"line_number":215,"context_line":"                break"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            wsgi_marker \u003d str_to_wsgi(segments[-1][\u0027name\u0027])"},{"line_number":218,"context_line":"            error_response, segments \u003d self._get_container_listing("},{"line_number":219,"context_line":"                req, version, account, container, prefix, wsgi_marker)"},{"line_number":220,"context_line":"            if error_response:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_4ae217d7","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":23},"updated":"2019-03-27 05:09:15.000000000","message":"So this\u0027ll be unicode on py2, and we\u0027re relying on common.utils.quote properly handling that...","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"34926a4f23fa4d9ff8e9a2c475b66cc6ea6f6dff","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            elif last_byte \u003c 0:"},{"line_number":215,"context_line":"                break"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            wsgi_marker \u003d str_to_wsgi(segments[-1][\u0027name\u0027])"},{"line_number":218,"context_line":"            error_response, segments \u003d self._get_container_listing("},{"line_number":219,"context_line":"                req, version, account, container, prefix, wsgi_marker)"},{"line_number":220,"context_line":"            if error_response:"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_b15586fc","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":23},"in_reply_to":"5fc1f717_4ae217d7","updated":"2019-04-05 02:38:05.000000000","message":"I don\u0027t understand this comment. The str_to_wsgi() is a straight assignment on py2.\nBTW, applying what you\u0027ve done in the alternative breaks tests.","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0090c4906356028f36df62cdbe8ef2b33a92ab64","unresolved":false,"context_lines":[{"line_number":214,"context_line":"            elif last_byte \u003c 0:"},{"line_number":215,"context_line":"                break"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"            wsgi_marker \u003d str_to_wsgi(segments[-1][\u0027name\u0027])"},{"line_number":218,"context_line":"            error_response, segments \u003d self._get_container_listing("},{"line_number":219,"context_line":"                req, version, account, container, prefix, wsgi_marker)"},{"line_number":220,"context_line":"            if error_response:"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fce034c_50c1e17f","line":217,"range":{"start_line":217,"start_character":12,"end_line":217,"end_character":23},"in_reply_to":"5fc1f717_b15586fc","updated":"2019-04-15 19:53:23.000000000","message":"I meant that segments[-1][\u0027name\u0027] would be unicode... you\u0027re right, of course, that str_to_wsgi is the identity function on py2 -- I just wanted to call out that we\u0027re relying on utils\u0027s quote() behaving the way we want...","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"8150ed6ba92b3dac968936f9e0b2cad75c30d192","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            response_headers \u003d self._response_headers"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":235,"context_line":"        container \u003d wsgi_unquote(container)"},{"line_number":236,"context_line":"        obj_prefix \u003d wsgi_unquote(obj_prefix)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_4a30d756","line":235,"range":{"start_line":235,"start_character":20,"end_line":235,"end_character":32},"updated":"2019-03-27 05:09:15.000000000","message":"So we wsgi_to_str() x_object_manifest immediately before calling this func... I\u0027m not sure we can still use wsgi_unquote here :-/","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"34926a4f23fa4d9ff8e9a2c475b66cc6ea6f6dff","unresolved":false,"context_lines":[{"line_number":232,"context_line":"            response_headers \u003d self._response_headers"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":235,"context_line":"        container \u003d wsgi_unquote(container)"},{"line_number":236,"context_line":"        obj_prefix \u003d wsgi_unquote(obj_prefix)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5fc1f717_00ba01bf","line":235,"range":{"start_line":235,"start_character":20,"end_line":235,"end_character":32},"in_reply_to":"5fc1f717_4a30d756","updated":"2019-04-05 02:38:05.000000000","message":"Done","commit_id":"8edf4206688d078f4f24c9a3abaf2def1c094f00"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0090c4906356028f36df62cdbe8ef2b33a92ab64","unresolved":false,"context_lines":[{"line_number":150,"context_line":"            method\u003d\u0027GET\u0027,"},{"line_number":151,"context_line":"            headers\u003d{\u0027x-auth-token\u0027: req.headers.get(\u0027x-auth-token\u0027)},"},{"line_number":152,"context_line":"            agent\u003d(\u0027%(orig)s \u0027 + \u0027DLO MultipartGET\u0027), swift_source\u003d\u0027DLO\u0027)"},{"line_number":153,"context_line":"        con_req.query_string \u003d \u0027prefix\u003d%s\u0027 % quote(prefix)"},{"line_number":154,"context_line":"        if marker:"},{"line_number":155,"context_line":"            con_req.query_string +\u003d \u0027\u0026marker\u003d%s\u0027 % quote(marker)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        con_resp \u003d con_req.get_response(self.dlo.app)"},{"line_number":158,"context_line":"        if not is_success(con_resp.status_int):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_fa078e1b","line":155,"range":{"start_line":153,"start_character":8,"end_line":155,"end_character":64},"updated":"2019-04-15 19:53:23.000000000","message":"So account/container should be wsgi, but prefix/marker should be native...","commit_id":"7ad5dc7eba7cf07e1fbb5e4d31303c003000208d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0090c4906356028f36df62cdbe8ef2b33a92ab64","unresolved":false,"context_lines":[{"line_number":217,"context_line":""},{"line_number":218,"context_line":"            wsgi_marker \u003d str_to_wsgi(segments[-1][\u0027name\u0027])"},{"line_number":219,"context_line":"            error_response, segments \u003d self._get_container_listing("},{"line_number":220,"context_line":"                req, version, account, container, prefix, wsgi_marker)"},{"line_number":221,"context_line":"            if error_response:"},{"line_number":222,"context_line":"                # we\u0027ve already started sending the response body to the"},{"line_number":223,"context_line":"                # client, so all we can do is raise an exception to make the"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_b54d9773","line":220,"range":{"start_line":220,"start_character":58,"end_line":220,"end_character":69},"updated":"2019-04-15 19:53:23.000000000","message":"...except marker is going to be wsgi? :-(\n\nNo, not exactly... on py2, it\u0027ll be unicode, and on py3 it\u0027ll be wsgi... hmm... still seems like a problem to wsgi-fy it on py3 then pass it to quote()...","commit_id":"7ad5dc7eba7cf07e1fbb5e4d31303c003000208d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0090c4906356028f36df62cdbe8ef2b33a92ab64","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":236,"context_line":"        container \u003d unquote(container)"},{"line_number":237,"context_line":"        obj_prefix \u003d unquote(obj_prefix)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":240,"context_line":"        error_response, segments \u003d self._get_container_listing("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_f5b8ff2a","line":237,"updated":"2019-04-15 19:53:23.000000000","message":"OK, our manifest should already be native strings... so unquote() makes sense here... provided that the manifest path we scribbled down was half-way sane. What about something that\u0027s mixed quoted and unquoted? For example,\n\n b\u0027X-Object-Manifest: snowman/%e2\\x98%83\u0027\n\nseems to get me replacement chars:\n\n \u003e\u003e\u003e unquote(wsgi_to_str(\u0027snowman/%e2\\x98%83\u0027))\n \u0027snowman/�\\udc98�\u0027\n\nMaybe we should push the unquoting into handle_request()? Like\n\n response \u003d self.get_or_head_response(req, wsgi_to_str(wsgi_unquote(value)))","commit_id":"7ad5dc7eba7cf07e1fbb5e4d31303c003000208d"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"543b2de3efe44116b23ef4828135bcea3940f7ce","unresolved":false,"context_lines":[{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        container, obj_prefix \u003d x_object_manifest.split(\u0027/\u0027, 1)"},{"line_number":236,"context_line":"        container \u003d unquote(container)"},{"line_number":237,"context_line":"        obj_prefix \u003d unquote(obj_prefix)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":240,"context_line":"        error_response, segments \u003d self._get_container_listing("}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_7e8e12d1","line":237,"in_reply_to":"3fce034c_f5b8ff2a","updated":"2019-04-17 03:04:23.000000000","message":"Oh good lord. You are so right, I had enough of fixups just to make tests pass. I wrote down every last function and every parameter, documented their types, then tracked down all variables like Ho-san tracking RBAC cases. BTW, used the above suggestion, too.","commit_id":"7ad5dc7eba7cf07e1fbb5e4d31303c003000208d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0090c4906356028f36df62cdbe8ef2b33a92ab64","unresolved":false,"context_lines":[{"line_number":353,"context_line":"        for header, value in self._response_headers:"},{"line_number":354,"context_line":"            if (header.lower() \u003d\u003d \u0027x-object-manifest\u0027):"},{"line_number":355,"context_line":"                close_if_possible(resp_iter)"},{"line_number":356,"context_line":"                response \u003d self.get_or_head_response(req, wsgi_to_str(value))"},{"line_number":357,"context_line":"                return response(req.environ, start_response)"},{"line_number":358,"context_line":"        # Not a dynamic large object manifest; just pass it through."},{"line_number":359,"context_line":"        start_response(self._response_status,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fce034c_b5283786","line":356,"range":{"start_line":356,"start_character":58,"end_line":356,"end_character":76},"updated":"2019-04-15 19:53:23.000000000","message":"At least prefix is native!","commit_id":"7ad5dc7eba7cf07e1fbb5e4d31303c003000208d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1c4787f8dae71996306d0c6b43e4cd4999e73047","unresolved":false,"context_lines":[{"line_number":228,"context_line":"                    (error_response.status_int, account, container))"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    def get_or_head_response(self, req, x_object_manifest,"},{"line_number":231,"context_line":"                             response_headers\u003dNone):"},{"line_number":232,"context_line":"        if response_headers is None:"},{"line_number":233,"context_line":"            response_headers \u003d self._response_headers"},{"line_number":234,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3fce034c_99b2f893","side":"PARENT","line":231,"range":{"start_line":231,"start_character":29,"end_line":231,"end_character":45},"updated":"2019-04-17 04:03:06.000000000","message":"Ha! Why *did* we have that?","commit_id":"5090a15f527f17fe7b1acaa5166a957eaeeb0497"}],"test/unit/common/middleware/test_dlo.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a22e429de20e0a7f3a794b1eba6e961850636e3f","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        with closing_if_possible(body_iter):"},{"line_number":62,"context_line":"            for chunk in body_iter:"},{"line_number":63,"context_line":"                body +\u003d chunk"},{"line_number":64,"context_line":"        return status[0], headers[0], body"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def setUp(self):"},{"line_number":67,"context_line":"        self.app \u003d FakeSwift()"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_af2dcc8f","line":64,"range":{"start_line":64,"start_character":38,"end_line":64,"end_character":42},"updated":"2019-02-28 01:40:24.000000000","message":"OH! Right. We already do the joining here in call_dlo(), so the extra b\u0027\u0027.join(body) in tests is just redundant...","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"43be6bfc5384e1facc1eecdcce1f8eafbdcfcbde","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        with closing_if_possible(body_iter):"},{"line_number":62,"context_line":"            for chunk in body_iter:"},{"line_number":63,"context_line":"                body +\u003d chunk"},{"line_number":64,"context_line":"        return status[0], headers[0], body"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def setUp(self):"},{"line_number":67,"context_line":"        self.app \u003d FakeSwift()"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_bb3d17bc","line":64,"range":{"start_line":64,"start_character":38,"end_line":64,"end_character":42},"in_reply_to":"9fdfeff1_af2dcc8f","updated":"2019-03-26 22:02:18.000000000","message":"Precisely.","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"588df951f07b67a76444494bbf38338628a7f7ce","unresolved":false,"context_lines":[{"line_number":589,"context_line":"        if six.PY2:"},{"line_number":590,"context_line":"            self.assertEqual(\u0027\u0027.join(body), \"aaaaa\")"},{"line_number":591,"context_line":"        else:"},{"line_number":592,"context_line":"            self.assertEqual(body, b\u0027aaaaa\u0027)"},{"line_number":593,"context_line":"        self.assertEqual(self.dlo.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":594,"context_line":"            \u0027While processing manifest /v1/AUTH_test/mancon/manifest, \u0027"},{"line_number":595,"context_line":"            \u0027got 403 while retrieving /v1/AUTH_test/c/seg_02\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_7d99fe1c","line":592,"updated":"2019-02-26 22:42:54.000000000","message":"? Can\u0027t we just do\n\n self.assertEqual(b\u0027\u0027.join(body), b\"aaaaa\")  # first segment made it out","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"35efb12be4c17ae6a9c85c1d2901f3918123c527","unresolved":false,"context_lines":[{"line_number":589,"context_line":"        if six.PY2:"},{"line_number":590,"context_line":"            self.assertEqual(\u0027\u0027.join(body), \"aaaaa\")"},{"line_number":591,"context_line":"        else:"},{"line_number":592,"context_line":"            self.assertEqual(body, b\u0027aaaaa\u0027)"},{"line_number":593,"context_line":"        self.assertEqual(self.dlo.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":594,"context_line":"            \u0027While processing manifest /v1/AUTH_test/mancon/manifest, \u0027"},{"line_number":595,"context_line":"            \u0027got 403 while retrieving /v1/AUTH_test/c/seg_02\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_f875fccc","line":592,"in_reply_to":"9fdfeff1_7d99fe1c","updated":"2019-02-26 23:50:33.000000000","message":"\u003e\u003e\u003e b\u0027\u0027.join(b\u0027aaa\u0027)\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\nTypeError: sequence item 0: expected a bytes-like object, int found","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"588df951f07b67a76444494bbf38338628a7f7ce","unresolved":false,"context_lines":[{"line_number":651,"context_line":"            # stop after error"},{"line_number":652,"context_line":"            self.assertEqual(\u0027\u0027.join(body), \"aaaaabbWRONGbb\")"},{"line_number":653,"context_line":"        else:"},{"line_number":654,"context_line":"            self.assertEqual(body, b\"aaaaabbWRONGbb\")"},{"line_number":655,"context_line":""},{"line_number":656,"context_line":"    def test_etag_comparison_ignores_quotes(self):"},{"line_number":657,"context_line":"        # a little future-proofing here in case we ever fix this in swob"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_1d9a3212","line":654,"updated":"2019-02-26 22:42:54.000000000","message":"Similar thought...","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"588df951f07b67a76444494bbf38338628a7f7ce","unresolved":false,"context_lines":[{"line_number":692,"context_line":"        if six.PY2:"},{"line_number":693,"context_line":"            path \u003d b\u0027/v1/AUTH_test/c/\\xC3\\xa9\u0027"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            path \u003d u\u0027/v1/AUTH_test/c/\\xe9\u0027"},{"line_number":696,"context_line":"        self.app.register("},{"line_number":697,"context_line":"            \u0027GET\u0027, path + \u00271\u0027,"},{"line_number":698,"context_line":"            swob.HTTPOk, {\u0027Content-Length\u0027: \u00275\u0027, \u0027Etag\u0027: md5hex(\"AAAAA\")},"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fdfeff1_5dbd1a66","line":695,"updated":"2019-02-26 22:42:54.000000000","message":"Wait, so we\u0027re registering... native strings? That seems fishy...","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90c163b0dfc4f93ed018714ea69d6ff157cbf11c","unresolved":false,"context_lines":[{"line_number":692,"context_line":"        if six.PY2:"},{"line_number":693,"context_line":"            path \u003d b\u0027/v1/AUTH_test/c/\\xC3\\xa9\u0027"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            path \u003d u\u0027/v1/AUTH_test/c/\\xe9\u0027"},{"line_number":696,"context_line":"        self.app.register("},{"line_number":697,"context_line":"            \u0027GET\u0027, path + \u00271\u0027,"},{"line_number":698,"context_line":"            swob.HTTPOk, {\u0027Content-Length\u0027: \u00275\u0027, \u0027Etag\u0027: md5hex(\"AAAAA\")},"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_52c57b3b","line":695,"in_reply_to":"9fdfeff1_5dbd1a66","updated":"2019-03-12 23:12:54.000000000","message":"Yeah, we want WSGI strings here. (So, old code was fine. Maybe should have a comment calling out the wsgi-ness, though.)","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"90c163b0dfc4f93ed018714ea69d6ff157cbf11c","unresolved":false,"context_lines":[{"line_number":869,"context_line":"        self.assertEqual(10, mware.rate_limit_after_segment)"},{"line_number":870,"context_line":"        self.assertEqual(3600, mware.max_get_time)"},{"line_number":871,"context_line":""},{"line_number":872,"context_line":"        conffile.close()"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    def test_finding_defaults_from_file(self):"},{"line_number":875,"context_line":"        # If DLO has no config vars, go pull them from the proxy server\u0027s"}],"source_content_type":"text/x-python","patch_set":1,"id":"5fc1f717_9f0f1536","line":872,"updated":"2019-03-12 23:12:54.000000000","message":"Alternatively, we could use a with block.","commit_id":"b2680e9acb169bfdbc8248c3c0e4ce81841eded6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"1c4787f8dae71996306d0c6b43e4cd4999e73047","unresolved":false,"context_lines":[{"line_number":586,"context_line":""},{"line_number":587,"context_line":"        self.assertEqual(status, \"200 OK\")"},{"line_number":588,"context_line":"        # first segment made it out"},{"line_number":589,"context_line":"        if six.PY2:"},{"line_number":590,"context_line":"            self.assertEqual(\u0027\u0027.join(body), \"aaaaa\")"},{"line_number":591,"context_line":"        else:"},{"line_number":592,"context_line":"            self.assertEqual(body, b\u0027aaaaa\u0027)"},{"line_number":593,"context_line":"        self.assertEqual(self.dlo.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":594,"context_line":"            \u0027While processing manifest /v1/AUTH_test/mancon/manifest, \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fce034c_d96de004","line":591,"range":{"start_line":589,"start_character":8,"end_line":591,"end_character":13},"updated":"2019-04-17 04:03:06.000000000","message":"I might still drop this, but it\u0027s not super-important.","commit_id":"893acffbc01ba817361f8d8735513dc784fb92c0"}]}
