)]}'
{"swift/common/constraints.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":302,"context_line":""},{"line_number":303,"context_line":"def check_delete_headers(request):"},{"line_number":304,"context_line":"    \"\"\""},{"line_number":305,"context_line":"    Validate if \u0027x-delete\u0027 headers are have correct values"},{"line_number":306,"context_line":"    values should be positive integers and correspond to"},{"line_number":307,"context_line":"    a time in the future."},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"    :param request: the swob request object"},{"line_number":310,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_e16d9904","line":307,"range":{"start_line":305,"start_character":0,"end_line":307,"end_character":25},"updated":"2018-01-05 16:05:44.000000000","message":"There\u0027s a typo in first line, but the second statement also needs updating. Perhaps:\n\n      Check that \u0027x-delete-after\u0027 and \u0027x-delete-at\u0027 headers have valid values.\n    Values should be positive integers and correspond to a time greater than or equal to the request timestamp.\n\n(see my follow up patch)","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"19a871b143fd133d2cccff87af19d127c8fe973d","unresolved":false,"context_lines":[{"line_number":309,"context_line":"    :param request: the swob request object"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    :returns: HTTPBadRequest in case of invalid values"},{"line_number":312,"context_line":"              or None if values are ok"},{"line_number":313,"context_line":"    \"\"\""},{"line_number":314,"context_line":"    now \u003d float(valid_timestamp(request))"},{"line_number":315,"context_line":"    if \u0027x-delete-after\u0027 in request.headers:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_bf57a102","line":312,"updated":"2018-01-05 18:07:16.000000000","message":"Off-topic: This really ought to be updated...","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":320,"context_line":"                                 content_type\u003d\u0027text/plain\u0027,"},{"line_number":321,"context_line":"                                 body\u003d\u0027Non-integer X-Delete-After\u0027)"},{"line_number":322,"context_line":"        actual_del_time \u003d now + x_delete_after"},{"line_number":323,"context_line":"        if actual_del_time \u003c now:"},{"line_number":324,"context_line":"            raise HTTPBadRequest(request\u003drequest,"},{"line_number":325,"context_line":"                                 content_type\u003d\u0027text/plain\u0027,"},{"line_number":326,"context_line":"                                 body\u003d\u0027X-Delete-After in past\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_08bf7d61","line":323,"range":{"start_line":323,"start_character":11,"end_line":323,"end_character":32},"updated":"2018-01-05 16:05:44.000000000","message":"nit: actual_del_time is still a float here, so may be \u003e\u003d now but when rounded down could be \u003c now if X-Delete-After \u003d\u003d 0\n\nThis leads to a BadRequest reporting that X-Delete-At is in the past when in the fact the root cause in an X-Delete-After \u003d\u003d 0\n\n(see my follow up)","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":319,"context_line":"            raise HTTPBadRequest(request\u003drequest,"},{"line_number":320,"context_line":"                                 content_type\u003d\u0027text/plain\u0027,"},{"line_number":321,"context_line":"                                 body\u003d\u0027Non-integer X-Delete-After\u0027)"},{"line_number":322,"context_line":"        actual_del_time \u003d now + x_delete_after"},{"line_number":323,"context_line":"        if actual_del_time \u003c now:"},{"line_number":324,"context_line":"            raise HTTPBadRequest(request\u003drequest,"},{"line_number":325,"context_line":"                                 content_type\u003d\u0027text/plain\u0027,"},{"line_number":326,"context_line":"                                 body\u003d\u0027X-Delete-After in past\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_4e558dc5","line":323,"range":{"start_line":322,"start_character":0,"end_line":323,"end_character":33},"updated":"2018-01-05 16:05:44.000000000","message":"test_constraints all pass when I revert these two lines :/\n\n(see my follow up)","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"19a871b143fd133d2cccff87af19d127c8fe973d","unresolved":false,"context_lines":[{"line_number":326,"context_line":"                                 body\u003d\u0027X-Delete-After in past\u0027)"},{"line_number":327,"context_line":"        request.headers[\u0027x-delete-at\u0027] \u003d utils.normalize_delete_at_timestamp("},{"line_number":328,"context_line":"            actual_del_time)"},{"line_number":329,"context_line":"        del request.headers[\u0027x-delete-after\u0027]"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    if \u0027x-delete-at\u0027 in request.headers:"},{"line_number":332,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_94ade432","line":329,"updated":"2018-01-05 18:07:16.000000000","message":"nit: Could just pop() when we first get x_delete_after","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            raise HTTPBadRequest(request\u003drequest, content_type\u003d\u0027text/plain\u0027,"},{"line_number":337,"context_line":"                                 body\u003d\u0027Non-integer X-Delete-At\u0027)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        if x_delete_at \u003c now and not utils.config_true_value("},{"line_number":340,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"},{"line_number":341,"context_line":"            raise HTTPBadRequest(request\u003drequest, content_type\u003d\u0027text/plain\u0027,"},{"line_number":342,"context_line":"                                 body\u003d\u0027X-Delete-At in past\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_ce843d0f","line":339,"range":{"start_line":339,"start_character":11,"end_line":339,"end_character":28},"updated":"2018-01-05 16:05:44.000000000","message":"test_constraints do not fail reliably when I revert these two lines :/","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":336,"context_line":"            raise HTTPBadRequest(request\u003drequest, content_type\u003d\u0027text/plain\u0027,"},{"line_number":337,"context_line":"                                 body\u003d\u0027Non-integer X-Delete-At\u0027)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"        if x_delete_at \u003c now and not utils.config_true_value("},{"line_number":340,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"},{"line_number":341,"context_line":"            raise HTTPBadRequest(request\u003drequest, content_type\u003d\u0027text/plain\u0027,"},{"line_number":342,"context_line":"                                 body\u003d\u0027X-Delete-At in past\u0027)"},{"line_number":343,"context_line":"    return request"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_e89c995e","line":340,"range":{"start_line":339,"start_character":29,"end_line":340,"end_character":66},"updated":"2018-01-05 16:05:44.000000000","message":"this may no longer be necessary because we are now comparing x-delete-at with the request timestamp.","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"19a871b143fd133d2cccff87af19d127c8fe973d","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"},{"line_number":341,"context_line":"            raise HTTPBadRequest(request\u003drequest, content_type\u003d\u0027text/plain\u0027,"},{"line_number":342,"context_line":"                                 body\u003d\u0027X-Delete-At in past\u0027)"},{"line_number":343,"context_line":"    return request"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"def check_utf8(string):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_bfa56106","line":343,"updated":"2018-01-05 18:07:16.000000000","message":"Come to think of it, why *are* we returning request? We\u0027re already making in-place changes to it, yeah?","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"7825dfe3ba30c261634ba9a2c06c9e01e8f7ff8f","unresolved":false,"context_lines":[{"line_number":340,"context_line":"                request.headers.get(\u0027x-backend-replication\u0027, \u0027f\u0027)):"},{"line_number":341,"context_line":"            raise HTTPBadRequest(request\u003drequest, content_type\u003d\u0027text/plain\u0027,"},{"line_number":342,"context_line":"                                 body\u003d\u0027X-Delete-At in past\u0027)"},{"line_number":343,"context_line":"    return request"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"def check_utf8(string):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_4ea7c850","line":343,"in_reply_to":"9f91af0f_bfa56106","updated":"2018-01-05 19:14:29.000000000","message":"Seems like each of our checker functions has its own unique take on things.\n\ncheck_object_creation(req, object_name) returns an error response or None. Also, it takes the object name as a parameter even though req.path has it.\n\ncheck_delete_headers(req) returns req or raises an error response.\n\nvalid_timestamp(req) returns a timestamp or raises an error response.\n\ncheck_utf8(string) returns True/False\n\nIt\u0027s probably worth cleaning up, but perhaps not in this commit.","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"90316764fd5693d6c02ea2ae8cfd29a4ab5c4804","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        if error_response:"},{"line_number":247,"context_line":"            return error_response"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        req.headers[\u0027X-Timestamp\u0027] \u003d Timestamp.now().internal"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        req, delete_at_container, delete_at_part, \\"},{"line_number":252,"context_line":"            delete_at_nodes \u003d self._config_obj_expiration(req)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_3c8e4c2e","line":249,"updated":"2018-01-05 04:52:34.000000000","message":"I know this is just simply a move so X-Timestamp is set. But is there a reason why we don\u0027t use self._update_x_timestamp(req) here?\n\nI mean do we allow someone to pass in an X-Timestamp on a post","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":246,"context_line":"        if error_response:"},{"line_number":247,"context_line":"            return error_response"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        req.headers[\u0027X-Timestamp\u0027] \u003d Timestamp.now().internal"},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"        req, delete_at_container, delete_at_part, \\"},{"line_number":252,"context_line":"            delete_at_nodes \u003d self._config_obj_expiration(req)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_0829bd88","line":249,"in_reply_to":"9f91af0f_3c8e4c2e","updated":"2018-01-05 16:05:44.000000000","message":"Only container sync requests are allowed to pass in X-Timestamp (unless some config option allows it). IIRC container sync does not send POST requests.\n\nThat said, it wouldn\u0027t hurt to use _update_x_timestamp and might prevent a future bug.","commit_id":"8da949176f35832e95c9f1789f0e3c6d6dc4e21a"}],"test/unit/common/test_constraints.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66c1a84dd66458eea17e5537cb4d2c0d0a2c1103","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    def test_check_object_creation_content_length(self):"},{"line_number":138,"context_line":"        headers \u003d {\u0027Content-Length\u0027: str(constraints.MAX_FILE_SIZE),"},{"line_number":139,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":140,"context_line":"                   \u0027X-Timestamp\u0027: str(time.time())}"},{"line_number":141,"context_line":"        self.assertIsNone(constraints.check_object_creation(Request.blank("},{"line_number":142,"context_line":"            \u0027/\u0027, headers\u003dheaders), \u0027object_name\u0027))"},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_5398c9be","line":140,"updated":"2018-01-06 01:23:11.000000000","message":"The fact that we had to touch these smells a little funny, but I don\u0027t care enough to actually recommend some convoluted thing like\n\n now \u003d None\n if \u0027x-delete-after\u0027 in request.headers:\n     now \u003d float(valid_timestamp(request))\n     ...\n if \u0027x-delete-at\u0027 in request.headers:\n     if now is None:\n         now \u003d float(valid_timestamp(request))\n     ...\n\nover in check_delete_headers.","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66c1a84dd66458eea17e5537cb4d2c0d0a2c1103","unresolved":false,"context_lines":[{"line_number":259,"context_line":"        self.assertEqual(req.headers.get(\u0027X-Delete-At\u0027), expected_delete_at)"},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"        headers \u003d {\u0027X-Delete-After\u0027: \u0027abc\u0027,"},{"line_number":262,"context_line":"                   \u0027X-Timestamp\u0027: str(time.time())}"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"        with self.assertRaises(HTTPException) as cm:"},{"line_number":265,"context_line":"            constraints.check_delete_headers("}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_f350fd0c","line":262,"updated":"2018-01-06 01:23:11.000000000","message":"Do we even need this header? Oh, yeah... because of the unconditional float(valid_timestamp(request))...\n\nSo really, check_delete_headers\u0027s docstring might need some updating. But that\u0027s nothing new.","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66c1a84dd66458eea17e5537cb4d2c0d0a2c1103","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                   \u0027X-Timestamp\u0027: str(t)}"},{"line_number":329,"context_line":"        req \u003d Request.blank(\u0027/\u0027, headers\u003dheaders)"},{"line_number":330,"context_line":"        constraints.check_delete_headers(req)"},{"line_number":331,"context_line":"        self.assertNotIn(\u0027X-Delete-After\u0027, req.headers)"},{"line_number":332,"context_line":"        self.assertEqual(req.headers[\u0027X-Delete-At\u0027], str(int(t) + 42))"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    def test_check_delete_headers_sets_delete_at(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_fabe9763","line":331,"range":{"start_line":331,"start_character":8,"end_line":331,"end_character":55},"updated":"2018-01-06 01:23:11.000000000","message":"Isn\u0027t this covered by line 257 now? Is there anything else significant that we\u0027re testing here?","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66c1a84dd66458eea17e5537cb4d2c0d0a2c1103","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        self.assertNotIn(\u0027X-Delete-After\u0027, req.headers)"},{"line_number":332,"context_line":"        self.assertEqual(req.headers[\u0027X-Delete-At\u0027], str(int(t) + 42))"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    def test_check_delete_headers_sets_delete_at(self):"},{"line_number":335,"context_line":"        t \u003d time.time()"},{"line_number":336,"context_line":"        expected \u003d str(int(t) + 1000)"},{"line_number":337,"context_line":"        # check delete-at is passed through"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_53af69e2","line":334,"updated":"2018-01-06 01:23:11.000000000","message":"Off-topic: What does this test cover that test_check_delete_headers doesn\u0027t?","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"2d3e6b229430164065a5136b412f7f733d43c33d","unresolved":false,"context_lines":[{"line_number":331,"context_line":"        self.assertNotIn(\u0027X-Delete-After\u0027, req.headers)"},{"line_number":332,"context_line":"        self.assertEqual(req.headers[\u0027X-Delete-At\u0027], str(int(t) + 42))"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"    def test_check_delete_headers_sets_delete_at(self):"},{"line_number":335,"context_line":"        t \u003d time.time()"},{"line_number":336,"context_line":"        expected \u003d str(int(t) + 1000)"},{"line_number":337,"context_line":"        # check delete-at is passed through"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_93abb187","line":334,"in_reply_to":"9f91af0f_53af69e2","updated":"2018-01-06 01:36:45.000000000","message":"I\u0027m not sure. I think it might be redundant now; I was mostly doing required updates and cleanups to this test case and not really thinking about redundant coverage.","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"}],"test/unit/obj/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e98cc966dd249be2f4264a8c79c7650f4bfa1d0d","unresolved":false,"context_lines":[{"line_number":5793,"context_line":""},{"line_number":5794,"context_line":"        req \u003d Request.blank("},{"line_number":5795,"context_line":"            \u0027/sda1/p/a/c/o\u0027, environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":5796,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp(test_time)})"},{"line_number":5797,"context_line":"        resp \u003d req.get_response(self.object_controller)"},{"line_number":5798,"context_line":"        self.assertEqual(resp.status_int, 200)"},{"line_number":5799,"context_line":""},{"line_number":5800,"context_line":"        delete_at_timestamp \u003d int(now + 1)"},{"line_number":5801,"context_line":"        delete_at_container \u003d str("},{"line_number":5802,"context_line":"            delete_at_timestamp /"},{"line_number":5803,"context_line":"            self.object_controller.expiring_objects_container_divisor *"},{"line_number":5804,"context_line":"            self.object_controller.expiring_objects_container_divisor)"},{"line_number":5805,"context_line":"        put_timestamp \u003d normalize_timestamp(test_time - 1000)"},{"line_number":5806,"context_line":"        req \u003d Request.blank("},{"line_number":5807,"context_line":"            \u0027/sda1/p/a/c/o\u0027,"},{"line_number":5808,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027PUT\u0027},"},{"line_number":5809,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: put_timestamp,"},{"line_number":5810,"context_line":"                     \u0027X-Delete-At\u0027: str(delete_at_timestamp),"},{"line_number":5811,"context_line":"                     \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":5812,"context_line":"                     \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":5813,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":5814,"context_line":"        req.body \u003d \u0027TEST\u0027"},{"line_number":5815,"context_line":""},{"line_number":5816,"context_line":"        # fix server time to now: delete-at is in future, verify GET is ok"},{"line_number":5817,"context_line":"        with mock.patch(\u0027swift.obj.server.time.time\u0027, return_value\u003dnow):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f91af0f_cbb2efe6","side":"PARENT","line":5814,"range":{"start_line":5796,"start_character":0,"end_line":5814,"end_character":25},"updated":"2018-01-05 16:05:44.000000000","message":"this does seem redundant","commit_id":"3aa17e6dc831e7a3d78dfbafc5f924fe3ce15b16"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66c1a84dd66458eea17e5537cb4d2c0d0a2c1103","unresolved":false,"context_lines":[{"line_number":5811,"context_line":"                     \u0027X-Delete-At-Container\u0027: delete_at_container,"},{"line_number":5812,"context_line":"                     \u0027Content-Length\u0027: \u00274\u0027,"},{"line_number":5813,"context_line":"                     \u0027Content-Type\u0027: \u0027application/octet-stream\u0027})"},{"line_number":5814,"context_line":"        req.body \u003d \u0027TEST\u0027"},{"line_number":5815,"context_line":""},{"line_number":5816,"context_line":"        # fix server time to now: delete-at is in future, verify GET is ok"},{"line_number":5817,"context_line":"        with mock.patch(\u0027swift.obj.server.time.time\u0027, return_value\u003dnow):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_f3631db0","side":"PARENT","line":5814,"updated":"2018-01-06 01:23:11.000000000","message":"OK, I\u0027m reasonably content that\n\n- the diff alignment is kinda terrible, and\n- nothing of value was lost.","commit_id":"3aa17e6dc831e7a3d78dfbafc5f924fe3ce15b16"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66c1a84dd66458eea17e5537cb4d2c0d0a2c1103","unresolved":false,"context_lines":[{"line_number":5805,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":5806,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":5807,"context_line":"                delete_at_timestamp + 1)})"},{"line_number":5808,"context_line":"        with mock.patch(\u0027swift.obj.server.time.time\u0027,"},{"line_number":5809,"context_line":"                        return_value\u003ddelete_at_timestamp + 1):"},{"line_number":5810,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":5811,"context_line":"        self.assertEqual(resp.status_int, 404)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_3369858a","line":5808,"updated":"2018-01-06 01:23:11.000000000","message":"This patch is still necessary? So which one is important on GET/HEAD/POST: X-Timestamp or time.time()?","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"2d3e6b229430164065a5136b412f7f733d43c33d","unresolved":false,"context_lines":[{"line_number":5805,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"},{"line_number":5806,"context_line":"            headers\u003d{\u0027X-Timestamp\u0027: normalize_timestamp("},{"line_number":5807,"context_line":"                delete_at_timestamp + 1)})"},{"line_number":5808,"context_line":"        with mock.patch(\u0027swift.obj.server.time.time\u0027,"},{"line_number":5809,"context_line":"                        return_value\u003ddelete_at_timestamp + 1):"},{"line_number":5810,"context_line":"            resp \u003d req.get_response(self.object_controller)"},{"line_number":5811,"context_line":"        self.assertEqual(resp.status_int, 404)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9f91af0f_f3d6bd27","line":5808,"in_reply_to":"9f91af0f_3369858a","updated":"2018-01-06 01:36:45.000000000","message":"Both? I\u0027m working on a follow-up patch to make all the expired-object stuff in the object server use X-Timestamp, but there\u0027s still some spots using time.time().\n\n(Ideally, the object server would only call time.time() when computing durations and never to compute timestamps.)","commit_id":"31c294de797be30f499750ccbed3ec18a717f9b1"}]}
