)]}'
{"swift/proxy/controllers/base.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0788e407e5c7fb5606c1db8dc5c3bdeffb74cada","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        if name \u003d\u003d \u0027etag\u0027:"},{"line_number":81,"context_line":"            response.headers[name] \u003d value.replace(\u0027\"\u0027, \u0027\u0027)"},{"line_number":82,"context_line":"        elif name.lower() not in ("},{"line_number":83,"context_line":"                \u0027date\u0027, \u0027content-length\u0027, \u0027content-type\u0027,"},{"line_number":84,"context_line":"                \u0027connection\u0027, \u0027x-put-timestamp\u0027, \u0027x-delete-after\u0027):"},{"line_number":85,"context_line":"            response.headers[name] \u003d value"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_7c8b27c2","line":83,"range":{"start_line":83,"start_character":24,"end_line":83,"end_character":56},"updated":"2017-04-28 23:40:05.000000000","message":"How did these still come through? But there they are in the test... they must\u0027ve.","commit_id":"2df99074eabd9f5a0cbca13d2143ba8febc37d25"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77a93fe656a2f55b9d28acd583bc27e42d66d33b","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            response.headers[name] \u003d value.replace(\u0027\"\u0027, \u0027\u0027)"},{"line_number":82,"context_line":"        elif name.lower() not in ("},{"line_number":83,"context_line":"                \u0027date\u0027, \u0027content-length\u0027, \u0027content-type\u0027,"},{"line_number":84,"context_line":"                \u0027connection\u0027, \u0027x-put-timestamp\u0027, \u0027x-delete-after\u0027):"},{"line_number":85,"context_line":"            response.headers[name] \u003d value"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"3f044301_fb30e8ea","line":84,"updated":"2017-05-05 20:41:50.000000000","message":"Why isn\u0027t the backend response content-type valid - it gets in the response *somehow*?  Does a backend response *ever* include x-delete-*after*?\n\nthis function is weird.","commit_id":"6c320b2908e5821e2f398e0dae8a67774e110603"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77a93fe656a2f55b9d28acd583bc27e42d66d33b","unresolved":false,"context_lines":[{"line_number":65,"context_line":"from swift.common.storage_policy import (POLICIES, REPL_POLICY, EC_POLICY,"},{"line_number":66,"context_line":"                                         ECDriverError, PolicyError)"},{"line_number":67,"context_line":"from swift.proxy.controllers.base import Controller, delay_denial, \\"},{"line_number":68,"context_line":"    cors_validation, ResumingGetter, update_headers"},{"line_number":69,"context_line":"from swift.common.swob import HTTPAccepted, HTTPBadRequest, HTTPNotFound, \\"},{"line_number":70,"context_line":"    HTTPPreconditionFailed, HTTPRequestEntityTooLarge, HTTPRequestTimeout, \\"},{"line_number":71,"context_line":"    HTTPServerError, HTTPServiceUnavailable, HTTPClientDisconnect, \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f044301_7b5a982a","line":68,"updated":"2017-05-05 20:41:50.000000000","message":"replicated object responses don\u0027t have this problem - i guess this use this function in GetOrHeadHandler (which is where they set content-type)","commit_id":"6c320b2908e5821e2f398e0dae8a67774e110603"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"77a93fe656a2f55b9d28acd583bc27e42d66d33b","unresolved":false,"context_lines":[{"line_number":958,"context_line":"        self.stashed_iter \u003d reiterate(self._real_iter(req, resp.headers))"},{"line_number":959,"context_line":""},{"line_number":960,"context_line":"        if self.learned_content_type is not None:"},{"line_number":961,"context_line":"            resp.content_type \u003d self.learned_content_type"},{"line_number":962,"context_line":"        resp.content_length \u003d self.obj_length"},{"line_number":963,"context_line":""},{"line_number":964,"context_line":"    def _next_range(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3f044301_be87ee61","line":961,"updated":"2017-05-05 20:41:50.000000000","message":"I guess EC response get\u0027s the content_type set here","commit_id":"6c320b2908e5821e2f398e0dae8a67774e110603"}],"test/functional/tests.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0788e407e5c7fb5606c1db8dc5c3bdeffb74cada","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                            \u0027accept-ranges\u0027: \u0027bytes\u0027,"},{"line_number":1274,"context_line":"                            \u0027content-type\u0027: \u0027application/test\u0027,"},{"line_number":1275,"context_line":"                            \u0027etag\u0027: hashlib.md5(obj_data).hexdigest(),"},{"line_number":1276,"context_line":"                            \u0027last-modified\u0027: do_not_care,"},{"line_number":1277,"context_line":"                            \u0027date\u0027: do_not_care,"},{"line_number":1278,"context_line":"                            \u0027x-delete-at\u0027: do_not_care,"},{"line_number":1279,"context_line":"                            \u0027x-trans-id\u0027: do_not_care,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_3cfc7f3c","line":1276,"updated":"2017-04-28 23:40:05.000000000","message":"Maybe use mock.ANY instead of inventing our own?\n\nI think at that point we could just use assertEqual.","commit_id":"2df99074eabd9f5a0cbca13d2143ba8febc37d25"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"03e6478ec274498e55bae6d642f97bd869fd62fa","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                            \u0027accept-ranges\u0027: \u0027bytes\u0027,"},{"line_number":1274,"context_line":"                            \u0027content-type\u0027: \u0027application/test\u0027,"},{"line_number":1275,"context_line":"                            \u0027etag\u0027: hashlib.md5(obj_data).hexdigest(),"},{"line_number":1276,"context_line":"                            \u0027last-modified\u0027: do_not_care,"},{"line_number":1277,"context_line":"                            \u0027date\u0027: do_not_care,"},{"line_number":1278,"context_line":"                            \u0027x-delete-at\u0027: do_not_care,"},{"line_number":1279,"context_line":"                            \u0027x-trans-id\u0027: do_not_care,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5ff73747_883336ab","line":1276,"in_reply_to":"5ff73747_3cfc7f3c","updated":"2017-05-01 17:22:35.000000000","message":"Done but I\u0027d prefer to keep the long hand check of each tuple in the resp_header list rather than constructing a dict and riking losing sight of multiple headers of same name.","commit_id":"2df99074eabd9f5a0cbca13d2143ba8febc37d25"}]}
