)]}'
{"swift/proxy/controllers/obj.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6bdd9ab03952a7f94d9c85d6b0821469fb869a92","unresolved":false,"context_lines":[{"line_number":2192,"context_line":"                    conditional_response\u003dTrue,"},{"line_number":2193,"context_line":"                    app_iter\u003dapp_iter)"},{"line_number":2194,"context_line":"                app_iter.kickoff(req, resp)"},{"line_number":2195,"context_line":"                self._fix_response(resp)"},{"line_number":2196,"context_line":"            else:"},{"line_number":2197,"context_line":"                statuses \u003d []"},{"line_number":2198,"context_line":"                reasons \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_fabf70cd","line":2195,"updated":"2015-07-23 18:08:51.000000000","message":"maybe instead of calling this in the two out three places we need it - we should try and neuter it in the one out of three places we don\u0027t?\n\nWhat exactly is it about the bad_gets case that means makes it so you can\u0027t fix_response - could fix_response detect that?  or should we just have a \"response_needs_fixing \u003d False\" state that makes the call conditional before we return?","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ba00b314b1008e4f3778701acb0f999853842f2","unresolved":false,"context_lines":[{"line_number":2192,"context_line":"                    conditional_response\u003dTrue,"},{"line_number":2193,"context_line":"                    app_iter\u003dapp_iter)"},{"line_number":2194,"context_line":"                app_iter.kickoff(req, resp)"},{"line_number":2195,"context_line":"                self._fix_response(resp)"},{"line_number":2196,"context_line":"            else:"},{"line_number":2197,"context_line":"                statuses \u003d []"},{"line_number":2198,"context_line":"                reasons \u003d []"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_35b86de5","line":2195,"in_reply_to":"3a50d1a3_fabf70cd","updated":"2015-07-24 08:48:28.000000000","message":"Agreed, will fix.","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6bdd9ab03952a7f94d9c85d6b0821469fb869a92","unresolved":false,"context_lines":[{"line_number":2206,"context_line":"                resp \u003d self.best_response("},{"line_number":2207,"context_line":"                    req, statuses, reasons, bodies, \u0027Object\u0027,"},{"line_number":2208,"context_line":"                    headers\u003dheaders)"},{"line_number":2209,"context_line":"                resp.body \u003d None"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"        return resp"},{"line_number":2212,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_faa690bf","line":2209,"updated":"2015-07-23 18:08:51.000000000","message":"What was your discovery of the impact of changing the ResumingGetter to just fill their bodies lists with None\u0027s instead of empty strings?","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ba00b314b1008e4f3778701acb0f999853842f2","unresolved":false,"context_lines":[{"line_number":2206,"context_line":"                resp \u003d self.best_response("},{"line_number":2207,"context_line":"                    req, statuses, reasons, bodies, \u0027Object\u0027,"},{"line_number":2208,"context_line":"                    headers\u003dheaders)"},{"line_number":2209,"context_line":"                resp.body \u003d None"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"        return resp"},{"line_number":2212,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_23303a07","line":2209,"in_reply_to":"3a50d1a3_faa690bf","updated":"2015-07-24 08:48:28.000000000","message":"Seems no impact so changing ResumingGetter to fill their boides by None, nice catch. Will fix.","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"33621910418dc90a1902bf473a67da86341f571d","unresolved":false,"context_lines":[{"line_number":2211,"context_line":"                # replicated case."},{"line_number":2212,"context_line":"                response_needs_fixing \u003d False"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"        if response_needs_fixing:"},{"line_number":2215,"context_line":"            self._fix_response(resp)"},{"line_number":2216,"context_line":""},{"line_number":2217,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_5d2097f7","line":2214,"updated":"2015-07-25 04:19:12.000000000","message":"can a HEAD response also be 4XX of some kind?","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"30acff7027bd9db5a76aaaab488db8df97a1dea1","unresolved":false,"context_lines":[{"line_number":2211,"context_line":"                # replicated case."},{"line_number":2212,"context_line":"                response_needs_fixing \u003d False"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"        if response_needs_fixing:"},{"line_number":2215,"context_line":"            self._fix_response(resp)"},{"line_number":2216,"context_line":""},{"line_number":2217,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_2f9bd567","line":2214,"in_reply_to":"3a50d1a3_2979cdfc","updated":"2015-07-27 19:00:48.000000000","message":"oh of course, swob error responses are canned - and we wouldn\u0027t normally mix in object metadata (aside from maybe an x-timestamp or something)","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"bbf62125a1ce2de50ae361d3e7f1a03f36b8cec2","unresolved":false,"context_lines":[{"line_number":2211,"context_line":"                # replicated case."},{"line_number":2212,"context_line":"                response_needs_fixing \u003d False"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"        if response_needs_fixing:"},{"line_number":2215,"context_line":"            self._fix_response(resp)"},{"line_number":2216,"context_line":""},{"line_number":2217,"context_line":"        return resp"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_2979cdfc","line":2214,"in_reply_to":"3a50d1a3_5d2097f7","updated":"2015-07-25 12:47:40.000000000","message":"An error HEAD response should not have any \u0027x-object-sysmeta-ec-xxx\u0027 headers so we may call this because it will fix nothing w/o them.\n\nHowever, for safety, perhaps we should check response status code to decide whether swift may call this or not.","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"}],"test/unit/proxy/controllers/test_obj.py":[{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"7b8ddd0817fc4adc67b577ec3b005b0452287df5","unresolved":false,"context_lines":[{"line_number":1447,"context_line":"        self.assertEquals(resp.headers[\u0027Etag\u0027], \u0027foo\u0027)"},{"line_number":1448,"context_line":""},{"line_number":1449,"context_line":"        # not found  HEAD"},{"line_number":1450,"context_line":"        responses \u003d [(404, \u0027\u0027, headers) ] * self.replicas() * 2"},{"line_number":1451,"context_line":"        status_codes, body_iter, headers \u003d zip(*responses)"},{"line_number":1452,"context_line":"        req \u003d swift.common.swob.Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027HEAD\u0027)"},{"line_number":1453,"context_line":"        with set_http_connect(*status_codes, body_iter\u003dbody_iter,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_9919c524","line":1450,"updated":"2015-07-23 06:09:43.000000000","message":"wait, 404 not found never return X-Object-Sysmeta-EC-***. That\u0027s wrong.","commit_id":"d376608d540416b0cc4000f7a7b7269a16f0afc2"},{"author":{"_account_id":15932,"name":"Bill Huber","email":"wbhuber@us.ibm.com","username":"wbhuber"},"change_message_id":"7d9c972e57c157690872acbf0121801e754631c2","unresolved":false,"context_lines":[{"line_number":1559,"context_line":"        headers \u003d {\u0027X-Object-Sysmeta-Ec-Content-Length\u0027: str(len(real_body))}"},{"line_number":1560,"context_line":"        start \u003d int(req_range.split(\u0027-\u0027)[0])"},{"line_number":1561,"context_line":"        self.assertTrue(start \u003e\u003d 0)  # sanity"},{"line_number":1562,"context_line":"        range_not_satisfiable_body \u003d \\"},{"line_number":1563,"context_line":"            \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\"},{"line_number":1564,"context_line":"            \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1565,"context_line":"        if start \u003e\u003d segment_size:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_01cd1730","line":1562,"updated":"2015-07-23 17:05:15.000000000","message":"Can this string be written once instead of twice?  There has to be a file with the list of error messages.","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6bdd9ab03952a7f94d9c85d6b0821469fb869a92","unresolved":false,"context_lines":[{"line_number":1559,"context_line":"        headers \u003d {\u0027X-Object-Sysmeta-Ec-Content-Length\u0027: str(len(real_body))}"},{"line_number":1560,"context_line":"        start \u003d int(req_range.split(\u0027-\u0027)[0])"},{"line_number":1561,"context_line":"        self.assertTrue(start \u003e\u003d 0)  # sanity"},{"line_number":1562,"context_line":"        range_not_satisfiable_body \u003d \\"},{"line_number":1563,"context_line":"            \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\"},{"line_number":1564,"context_line":"            \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1565,"context_line":"        if start \u003e\u003d segment_size:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_d74ccd9f","line":1562,"in_reply_to":"3a50d1a3_01cd1730","updated":"2015-07-23 18:08:51.000000000","message":"the strings are in common.swob.RESPONSE_REASONS[416] - it\u0027s a two tuple - you still have to do the html building like the bottom of _respose_iter (although you *could* extract that to a function).\n\nSo it *could* be done.  But I don\u0027t think it\u0027s of any particular noteworthy significance for anyone to make it a goal to not type it out in the test where it\u0027s plain to see and easy to maintain in context - the original text hasn\u0027t changed in something like ~3 years, and if it has to change again it won\u0027t be terribly burdensome to fix a few tests that are specifically working with that response code.","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ba00b314b1008e4f3778701acb0f999853842f2","unresolved":false,"context_lines":[{"line_number":1559,"context_line":"        headers \u003d {\u0027X-Object-Sysmeta-Ec-Content-Length\u0027: str(len(real_body))}"},{"line_number":1560,"context_line":"        start \u003d int(req_range.split(\u0027-\u0027)[0])"},{"line_number":1561,"context_line":"        self.assertTrue(start \u003e\u003d 0)  # sanity"},{"line_number":1562,"context_line":"        range_not_satisfiable_body \u003d \\"},{"line_number":1563,"context_line":"            \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\"},{"line_number":1564,"context_line":"            \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1565,"context_line":"        if start \u003e\u003d segment_size:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_95fb8147","line":1562,"in_reply_to":"3a50d1a3_d74ccd9f","updated":"2015-07-24 08:48:28.000000000","message":"Yeah, exactly. I don\u0027t want to do such a terrible work when the message would be changed so I\u0027ll will fix this to use swob.RESPONSE_REASONS :)","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"6bdd9ab03952a7f94d9c85d6b0821469fb869a92","unresolved":false,"context_lines":[{"line_number":1564,"context_line":"            \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1565,"context_line":"        if start \u003e\u003d segment_size:"},{"line_number":1566,"context_line":"            body \u003d \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\"},{"line_number":1567,"context_line":"                   \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1568,"context_line":"            responses \u003d [(416, body, headers)"},{"line_number":1569,"context_line":"                         for i in range(POLICIES.default.ec_ndata)]"},{"line_number":1570,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_17579526","line":1567,"updated":"2015-07-23 18:08:51.000000000","message":"here I think using range_not_satisfiable_body would actually be slightly more readable to indicate *these two things are exactly the same*\n\n    diff --git a/test/unit/proxy/controllers/test_obj.py b/test/unit/proxy/controllers/test_obj.py\n    index eb5dcc5..fcb4d57 100755\n    --- a/test/unit/proxy/controllers/test_obj.py\n    +++ b/test/unit/proxy/controllers/test_obj.py\n    @@ -1563,9 +1563,7 @@ class TestECObjController(BaseObjectControllerMixin, unittest.TestCase):\n                 \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\\n                 \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027\n             if start \u003e\u003d segment_size:\n    -            body \u003d \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\\n    -                   \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027\n    -            responses \u003d [(416, body, headers)\n    +            responses \u003d [(416, range_not_satisfiable_body, headers)\n                              for i in range(POLICIES.default.ec_ndata)]\n             else:\n                 responses \u003d [(200, \u0027\u0027.join(node_fragments[i]), headers)","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"1ba00b314b1008e4f3778701acb0f999853842f2","unresolved":false,"context_lines":[{"line_number":1564,"context_line":"            \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1565,"context_line":"        if start \u003e\u003d segment_size:"},{"line_number":1566,"context_line":"            body \u003d \u0027\u003chtml\u003e\u003ch1\u003eRequested Range Not Satisfiable\u003c/h1\u003e\u003cp\u003e\u0027 \\"},{"line_number":1567,"context_line":"                   \u0027The Range requested is not available.\u003c/p\u003e\u003c/html\u003e\u0027"},{"line_number":1568,"context_line":"            responses \u003d [(416, body, headers)"},{"line_number":1569,"context_line":"                         for i in range(POLICIES.default.ec_ndata)]"},{"line_number":1570,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_35862d14","line":1567,"in_reply_to":"3a50d1a3_17579526","updated":"2015-07-24 08:48:28.000000000","message":"Ah, yes. will fix.","commit_id":"61054cf9c637c86ef9f34d3bd3fb22393767837a"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"33621910418dc90a1902bf473a67da86341f571d","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1456,"context_line":"        self.assertEquals(resp.status_int, 404)"},{"line_number":1457,"context_line":"        # 404 shows actual response body size (i.e. 0 for HEAD)"},{"line_number":1458,"context_line":"        self.assertEquals(resp.headers[\u0027Content-Length\u0027], \u00270\u0027)"},{"line_number":1459,"context_line":""},{"line_number":1460,"context_line":"    def test_PUT_with_slow_commits(self):"},{"line_number":1461,"context_line":"        # It\u0027s important that this timeout be much less than the delay in"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_7d1b13cb","line":1458,"updated":"2015-07-25 04:19:12.000000000","message":"shouldn\u0027t a 404 say like \"\u003chtml\u003eobject not found\u003c/html\u003e\" or something?","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"30acff7027bd9db5a76aaaab488db8df97a1dea1","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1456,"context_line":"        self.assertEquals(resp.status_int, 404)"},{"line_number":1457,"context_line":"        # 404 shows actual response body size (i.e. 0 for HEAD)"},{"line_number":1458,"context_line":"        self.assertEquals(resp.headers[\u0027Content-Length\u0027], \u00270\u0027)"},{"line_number":1459,"context_line":""},{"line_number":1460,"context_line":"    def test_PUT_with_slow_commits(self):"},{"line_number":1461,"context_line":"        # It\u0027s important that this timeout be much less than the delay in"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_afc28551","line":1458,"in_reply_to":"3a50d1a3_69f2759c","updated":"2015-07-27 19:00:48.000000000","message":"oh interesting, for some reason I\u0027d convinced myself it might still have a content-length like any other HEAD.","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"bbf62125a1ce2de50ae361d3e7f1a03f36b8cec2","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1456,"context_line":"        self.assertEquals(resp.status_int, 404)"},{"line_number":1457,"context_line":"        # 404 shows actual response body size (i.e. 0 for HEAD)"},{"line_number":1458,"context_line":"        self.assertEquals(resp.headers[\u0027Content-Length\u0027], \u00270\u0027)"},{"line_number":1459,"context_line":""},{"line_number":1460,"context_line":"    def test_PUT_with_slow_commits(self):"},{"line_number":1461,"context_line":"        # It\u0027s important that this timeout be much less than the delay in"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a50d1a3_69f2759c","line":1458,"in_reply_to":"3a50d1a3_7d1b13cb","updated":"2015-07-25 12:47:40.000000000","message":"No, that is a GET case. According to RFC 7231, HEAD request must not retern response body.\n\n1: https://tools.ietf.org/html/rfc7231#section-4.3.2","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"1fc85c1c1e2938b94edebdae0ef9fb2eb525ab81","unresolved":false,"context_lines":[{"line_number":1455,"context_line":"            resp \u003d req.get_response(self.app)"},{"line_number":1456,"context_line":"        self.assertEquals(resp.status_int, 404)"},{"line_number":1457,"context_line":"        # 404 shows actual response body size (i.e. 0 for HEAD)"},{"line_number":1458,"context_line":"        self.assertEquals(resp.headers[\u0027Content-Length\u0027], \u00270\u0027)"},{"line_number":1459,"context_line":""},{"line_number":1460,"context_line":"    def test_PUT_with_slow_commits(self):"},{"line_number":1461,"context_line":"        # It\u0027s important that this timeout be much less than the delay in"}],"source_content_type":"text/x-python","patch_set":5,"id":"bae84128_c7e87013","line":1458,"in_reply_to":"3a50d1a3_afc28551","updated":"2016-02-20 22:26:41.000000000","message":"I have gotten questions about this behavior.  Please see https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html\n\nI read that the HEAD response is not to have a body (correct), BUT the content-length should match what *would* have been given if the request was a GET.  In this case, it would be the length of the 404 error message.\n\nNote that swift, at least in one case, does match this spec.  That case is a HEAD against healthcheck will return the same content-length as the GET (a 2 for \"OK\").\n\nAnd yes, curl will hang if you use curl -X HEAD.  But there are alternatives, like using curl -I or curl --head.\n\nI was wondering if I should write a bug on this inconsistency and non-compliance, but wanted to know your initial thoughts.","commit_id":"2da787d93b2fdb42ce7654a7477704f3756f5e09"}]}
