)]}'
{"swift/common/middleware/listing_formats.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"198be36b7918ee0e1e5eb290039e4397783d057c","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        params[\u0027format\u0027] \u003d \u0027json\u0027"},{"line_number":135,"context_line":"        req.params \u003d params"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        status, headers, resp_iter \u003d req.call_application(self.app)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        header_to_index \u003d {}"},{"line_number":140,"context_line":"        resp_content_type \u003d resp_length \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_6f0b72d5","line":137,"updated":"2018-01-17 02:56:23.000000000","message":"I wonder how much of this would simplify if we just used get_response?  \n\nWell, all the set_header non-sense goes away and we can more easily use stuff like:\n\n        resp.headers[\u0027Vary\u0027] \u003d csv_append(resp.headers.get(\u0027Vary\u0027),\n                                          \u0027Accept\u0027, delim\u003d\", \")\n\n\n    diff --git a/swift/common/utils.py b/swift/common/utils.py\n    index 80a645b..342df1d 100644\n    --- a/swift/common/utils.py\n    +++ b/swift/common/utils.py\n    @@ -3383,14 +3383,14 @@ def list_from_csv(comma_separated_str):\n         return []\n     \n     \n    -def csv_append(csv_string, item):\n    +def csv_append(csv_string, item, delim\u003d\",\"):\n         \"\"\"\n         Appends an item to a comma-separated string.\n     \n         If the comma-separated string is empty/None, just returns item.\n         \"\"\"\n         if csv_string:\n    -        return \",\".join((csv_string, item))\n    +        return delim.join((csv_string, item))\n         else:\n             return item","commit_id":"b4cff2b3b5a5b9e7eadd5113a62379912486d2e6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f181a8ec14a798c2ab7858e38ef5f28e3adee5f","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        params[\u0027format\u0027] \u003d \u0027json\u0027"},{"line_number":135,"context_line":"        req.params \u003d params"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        status, headers, resp_iter \u003d req.call_application(self.app)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"        header_to_index \u003d {}"},{"line_number":140,"context_line":"        resp_content_type \u003d resp_length \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_676e9597","line":137,"in_reply_to":"7f96bb07_6f0b72d5","updated":"2018-01-29 22:04:26.000000000","message":"Can\u0027t use get_response :-(\n\nswob.Response eats duplicate headers. Which is fine most of the time, but doesn\u0027t work if you\u0027re before auth. Only test that caught it was something in tempest that looked for WWW-Authenticate coming from *both* tempauth and keystone.","commit_id":"b4cff2b3b5a5b9e7eadd5113a62379912486d2e6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"198be36b7918ee0e1e5eb290039e4397783d057c","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            elif header \u003d\u003d \u0027vary\u0027:"},{"line_number":150,"context_line":"                header_to_index[header] \u003d i"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        if not status.startswith((\u0027200 \u0027, \u0027204 \u0027)):"},{"line_number":153,"context_line":"            start_response(status, headers)"},{"line_number":154,"context_line":"            return resp_iter"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_6f2e1293","line":152,"updated":"2018-01-17 02:56:23.000000000","message":"I\u0027m guessing this is an exhaustive list of 2XX responses we can send... but I\u0027d bet is_success would work just as well...\n\nhttps://gist.github.com/clayg/5711f6cba33a16668cdf0449c1e2b146\n\n^ seems to work?","commit_id":"b4cff2b3b5a5b9e7eadd5113a62379912486d2e6"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9f181a8ec14a798c2ab7858e38ef5f28e3adee5f","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            elif header \u003d\u003d \u0027vary\u0027:"},{"line_number":150,"context_line":"                header_to_index[header] \u003d i"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        if not status.startswith((\u0027200 \u0027, \u0027204 \u0027)):"},{"line_number":153,"context_line":"            start_response(status, headers)"},{"line_number":154,"context_line":"            return resp_iter"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_e44cb59f","line":152,"in_reply_to":"7f96bb07_6f2e1293","updated":"2018-01-29 22:04:26.000000000","message":"If we ever update account/container servers to be able to respond 206, there\u0027s pretty much *no way* we\u0027re gonna be able to eat that response. I\u0027d rather we only try to process what we *know* we know how to process.","commit_id":"b4cff2b3b5a5b9e7eadd5113a62379912486d2e6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"198be36b7918ee0e1e5eb290039e4397783d057c","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            headers[header_to_index[\u0027vary\u0027]] \u003d ("},{"line_number":158,"context_line":"                \u0027Vary\u0027, headers[header_to_index[\u0027vary\u0027]][1] + \u0027, Accept\u0027)"},{"line_number":159,"context_line":"        else:"},{"line_number":160,"context_line":"            headers.append((\u0027Vary\u0027, \u0027Accept\u0027))"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        if resp_content_type !\u003d \u0027application/json\u0027:"},{"line_number":163,"context_line":"            start_response(status, headers)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_6f05b210","line":160,"updated":"2018-01-17 02:56:23.000000000","message":"ok, so this is just a csv append if the tuple for Vary is already in the headers list otherwise add it...","commit_id":"b4cff2b3b5a5b9e7eadd5113a62379912486d2e6"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"198be36b7918ee0e1e5eb290039e4397783d057c","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        if resp_content_type !\u003d \u0027application/json\u0027:"},{"line_number":163,"context_line":"            start_response(status, headers)"},{"line_number":164,"context_line":"            return resp_iter"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        if resp_length is None or \\"},{"line_number":167,"context_line":"                resp_length \u003e MAX_CONTAINER_LISTING_CONTENT_LENGTH:"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_2f5eca75","line":164,"updated":"2018-01-17 02:56:23.000000000","message":"This block would end up catching our error response even if we did guard them with the 200/204 check...","commit_id":"b4cff2b3b5a5b9e7eadd5113a62379912486d2e6"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"cb12e212fa2df148a7ccec5e8ce79d0e90e4272f","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            elif header \u003d\u003d \u0027content-length\u0027:"},{"line_number":148,"context_line":"                header_to_index[header] \u003d i"},{"line_number":149,"context_line":"                resp_length \u003d int(value)"},{"line_number":150,"context_line":"            elif header \u003d\u003d \u0027vary\u0027:"},{"line_number":151,"context_line":"                header_to_index[header] \u003d i"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not status.startswith((\u0027200 \u0027, \u0027204 \u0027)):"},{"line_number":154,"context_line":"            start_response(status, headers)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_7d871311","line":151,"range":{"start_line":150,"start_character":0,"end_line":151,"end_character":43},"updated":"2018-02-07 03:50:30.000000000","message":"Maybe I misunderstand something...\nI think this code handles \"vary\" header from account/container server.\nHowever, in my understanding, account/container server doesn\u0027t send \"vary\" header.\nWhat is the purpose of this code?","commit_id":"904df7fefca4415c5f4e00baa579b3ef3fe1816e"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"81fc57c276127162e5996c2f8455a1f7c1bfe1a9","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            elif header \u003d\u003d \u0027content-length\u0027:"},{"line_number":148,"context_line":"                header_to_index[header] \u003d i"},{"line_number":149,"context_line":"                resp_length \u003d int(value)"},{"line_number":150,"context_line":"            elif header \u003d\u003d \u0027vary\u0027:"},{"line_number":151,"context_line":"                header_to_index[header] \u003d i"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not status.startswith((\u0027200 \u0027, \u0027204 \u0027)):"},{"line_number":154,"context_line":"            start_response(status, headers)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_29c62d9c","line":151,"range":{"start_line":150,"start_character":0,"end_line":151,"end_character":43},"in_reply_to":"3fa0c359_23dbaced","updated":"2018-02-07 06:45:12.000000000","message":"I see :)\nI agree that these codes are reasonable.\nBut I think these codes are not covered in unit tests.\nWould you add unit tests for \"vary\" headers from the third-party middlewares?","commit_id":"904df7fefca4415c5f4e00baa579b3ef3fe1816e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"b9bef847a1ffd54e00ee2abfa67e557e52c6884e","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            elif header \u003d\u003d \u0027content-length\u0027:"},{"line_number":148,"context_line":"                header_to_index[header] \u003d i"},{"line_number":149,"context_line":"                resp_length \u003d int(value)"},{"line_number":150,"context_line":"            elif header \u003d\u003d \u0027vary\u0027:"},{"line_number":151,"context_line":"                header_to_index[header] \u003d i"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        if not status.startswith((\u0027200 \u0027, \u0027204 \u0027)):"},{"line_number":154,"context_line":"            start_response(status, headers)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_23dbaced","line":151,"range":{"start_line":150,"start_character":0,"end_line":151,"end_character":43},"in_reply_to":"3fa0c359_7d871311","updated":"2018-02-07 05:36:01.000000000","message":"Basically, just in case :-)\n\nWhile the account and container servers will most likely never send this header, there may be third-party middlewares that already do. Eventually, even the proxy-server app may need to  -- the more I think about https://review.openstack.org/#/c/533028 and CORS, the more I think there should be a follow-up to https://review.openstack.org/#/c/274303/ to handle more than just OPTIONS...","commit_id":"904df7fefca4415c5f4e00baa579b3ef3fe1816e"},{"author":{"_account_id":14766,"name":"Kazuhiro MIYAHARA","email":"miyahara.kazuhiro@lab.ntt.co.jp","username":"miyahara"},"change_message_id":"cb12e212fa2df148a7ccec5e8ce79d0e90e4272f","unresolved":false,"context_lines":[{"line_number":155,"context_line":"            return resp_iter"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        if can_vary:"},{"line_number":158,"context_line":"            if \u0027vary\u0027 in header_to_index:"},{"line_number":159,"context_line":"                headers[header_to_index[\u0027vary\u0027]] \u003d ("},{"line_number":160,"context_line":"                    \u0027Vary\u0027, headers[header_to_index[\u0027vary\u0027]][1] + \u0027, Accept\u0027)"},{"line_number":161,"context_line":"            else:"},{"line_number":162,"context_line":"                headers.append((\u0027Vary\u0027, \u0027Accept\u0027))"},{"line_number":163,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3fa0c359_dd48a7cd","line":160,"range":{"start_line":158,"start_character":0,"end_line":160,"end_character":77},"updated":"2018-02-07 03:50:30.000000000","message":"Same as above.","commit_id":"904df7fefca4415c5f4e00baa579b3ef3fe1816e"}]}
