)]}'
{"swift/common/middleware/symlink.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    container, obj \u003d check_path_header("},{"line_number":208,"context_line":"        req, TGT_OBJ_SYMLINK_HDR, 2,"},{"line_number":209,"context_line":"        \u0027X-Symlink-Target header must be of the \u0027"},{"line_number":210,"context_line":"        \u0027form \u003ccontainer name\u003e/\u003cobject name\u003e\u0027)"},{"line_number":211,"context_line":"    req.headers[TGT_OBJ_SYMLINK_HDR] \u003d quote(\u0027%s/%s\u0027 % (container, obj))"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    # Check account format if it exists"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_d2138165","line":210,"updated":"2019-03-22 20:10:37.000000000","message":"ok, so check_path_header unqotes, which may be a noop if a client sent the header unquoted","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        req, TGT_OBJ_SYMLINK_HDR, 2,"},{"line_number":209,"context_line":"        \u0027X-Symlink-Target header must be of the \u0027"},{"line_number":210,"context_line":"        \u0027form \u003ccontainer name\u003e/\u003cobject name\u003e\u0027)"},{"line_number":211,"context_line":"    req.headers[TGT_OBJ_SYMLINK_HDR] \u003d quote(\u0027%s/%s\u0027 % (container, obj))"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    # Check account format if it exists"},{"line_number":214,"context_line":"    account \u003d check_account_format("}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_7202cd0d","line":211,"updated":"2019-03-22 20:10:37.000000000","message":"but we requote to prepare for transfer, of course that also means everyone is going to start to store it quoted too, which is a change...","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"917323693efc71f6fb4e95fe2d1d26911cfe050c","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        req, TGT_OBJ_SYMLINK_HDR, 2,"},{"line_number":209,"context_line":"        \u0027X-Symlink-Target header must be of the \u0027"},{"line_number":210,"context_line":"        \u0027form \u003ccontainer name\u003e/\u003cobject name\u003e\u0027)"},{"line_number":211,"context_line":"    req.headers[TGT_OBJ_SYMLINK_HDR] \u003d quote(\u0027%s/%s\u0027 % (container, obj))"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    # Check account format if it exists"},{"line_number":214,"context_line":"    account \u003d check_account_format("}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_f5b8e7e5","line":211,"in_reply_to":"5fc1f717_7202cd0d","updated":"2019-03-22 20:25:58.000000000","message":"Yeah, that part makes me a little nervous, too. I don\u0027t *think* it should break any existing already-written-down-unquoted objects, though? But it might be nice if we still had the ability to write such a thing down so we could verify that...","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":213,"context_line":"    # Check account format if it exists"},{"line_number":214,"context_line":"    account \u003d check_account_format("},{"line_number":215,"context_line":"        req, unquote(req.headers[TGT_ACCT_SYMLINK_HDR])) \\"},{"line_number":216,"context_line":"        if TGT_ACCT_SYMLINK_HDR in req.headers else None"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    # Extract request path"},{"line_number":219,"context_line":"    _junk, req_acc, req_cont, req_obj \u003d req.split_path(4, 4, True)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_9512c357","line":216,"updated":"2019-03-22 20:10:37.000000000","message":"afaict, unlike check_path_header, the check_account_format function does not do an unquote...","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":219,"context_line":"    _junk, req_acc, req_cont, req_obj \u003d req.split_path(4, 4, True)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    if account:"},{"line_number":222,"context_line":"        req.headers[TGT_ACCT_SYMLINK_HDR] \u003d quote(account)"},{"line_number":223,"context_line":"    else:"},{"line_number":224,"context_line":"        account \u003d req_acc"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_127909fb","line":222,"updated":"2019-03-22 20:10:37.000000000","message":"so we want the client to send it to us UN-quoted?","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"917323693efc71f6fb4e95fe2d1d26911cfe050c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"    _junk, req_acc, req_cont, req_obj \u003d req.split_path(4, 4, True)"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"    if account:"},{"line_number":222,"context_line":"        req.headers[TGT_ACCT_SYMLINK_HDR] \u003d quote(account)"},{"line_number":223,"context_line":"    else:"},{"line_number":224,"context_line":"        account \u003d req_acc"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_b5ca5f6b","line":222,"in_reply_to":"5fc1f717_127909fb","updated":"2019-03-22 20:25:58.000000000","message":"No, quoted; see L215","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    if account:"},{"line_number":222,"context_line":"        req.headers[TGT_ACCT_SYMLINK_HDR] \u003d quote(account)"},{"line_number":223,"context_line":"    else:"},{"line_number":224,"context_line":"        account \u003d req_acc"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    # Check if symlink targets the symlink itself or not"},{"line_number":227,"context_line":"    if (account, container, obj) \u003d\u003d (req_acc, req_cont, req_obj):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_129589e4","line":224,"updated":"2019-03-22 20:10:37.000000000","message":"So, is this already quoted?","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"917323693efc71f6fb4e95fe2d1d26911cfe050c","unresolved":false,"context_lines":[{"line_number":221,"context_line":"    if account:"},{"line_number":222,"context_line":"        req.headers[TGT_ACCT_SYMLINK_HDR] \u003d quote(account)"},{"line_number":223,"context_line":"    else:"},{"line_number":224,"context_line":"        account \u003d req_acc"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"    # Check if symlink targets the symlink itself or not"},{"line_number":227,"context_line":"    if (account, container, obj) \u003d\u003d (req_acc, req_cont, req_obj):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_358d0f31","line":224,"in_reply_to":"5fc1f717_129589e4","updated":"2019-03-22 20:25:58.000000000","message":"No, but it shouldn\u0027t be. This is for the sake of the comparison below.","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            \"\"\""},{"line_number":384,"context_line":"            version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":385,"context_line":"            account \u003d self._response_header_value("},{"line_number":386,"context_line":"                TGT_ACCT_SYSMETA_SYMLINK_HDR) or quote(account)"},{"line_number":387,"context_line":"            target_path \u003d os.path.join("},{"line_number":388,"context_line":"                \u0027/\u0027, version, account,"},{"line_number":389,"context_line":"                symlink_target.lstrip(\u0027/\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_9203b942","line":386,"updated":"2019-03-22 20:10:37.000000000","message":"the account from the path should already be quoted yeah?","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"917323693efc71f6fb4e95fe2d1d26911cfe050c","unresolved":false,"context_lines":[{"line_number":383,"context_line":"            \"\"\""},{"line_number":384,"context_line":"            version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":385,"context_line":"            account \u003d self._response_header_value("},{"line_number":386,"context_line":"                TGT_ACCT_SYSMETA_SYMLINK_HDR) or quote(account)"},{"line_number":387,"context_line":"            target_path \u003d os.path.join("},{"line_number":388,"context_line":"                \u0027/\u0027, version, account,"},{"line_number":389,"context_line":"                symlink_target.lstrip(\u0027/\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_d5b12be3","line":386,"in_reply_to":"5fc1f717_9203b942","updated":"2019-03-22 20:25:58.000000000","message":"Nope; WSGI demands that the server unquote PATH_INFO for us.","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":488,"context_line":"        if tgt_co:"},{"line_number":489,"context_line":"            version, account, _junk \u003d req.split_path(2, 3, True)"},{"line_number":490,"context_line":"            target_acc \u003d self._response_header_value("},{"line_number":491,"context_line":"                TGT_ACCT_SYSMETA_SYMLINK_HDR) or quote(account)"},{"line_number":492,"context_line":"            location_hdr \u003d os.path.join("},{"line_number":493,"context_line":"                \u0027/\u0027, version, target_acc, tgt_co)"},{"line_number":494,"context_line":"            req.environ[\u0027swift.leave_relative_location\u0027] \u003d True"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_d29e2106","line":491,"updated":"2019-03-22 20:10:37.000000000","message":"again, from the path already?","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"}],"test/functional/test_symlink.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":273,"context_line":"        # return object"},{"line_number":274,"context_line":"        resp \u003d retry("},{"line_number":275,"context_line":"            self._make_request, method\u003d\u0027PUT\u0027, container\u003dself.env.tgt_cont,"},{"line_number":276,"context_line":"            obj\u003dtarget_obj, body\u003dTARGET_BODY)"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_7545d742","line":276,"updated":"2019-03-22 20:10:37.000000000","message":"it\u0027s not clear to me what we expect the name of this object to actually be...\n\nIn the request logs I see:\n\nPUT /v1/AUTH_test/bcc67d5cbbc74d17a8b86f48acb816b2/dealde%2Fl04%20011e%204c8df/flash.png\n\nIn my container listing I see:\n\n  {\n    \"hash\": \"ab706c400731332bffa67ed4bc15dcac\",\n    \"last_modified\": \"2019-03-22T20:00:50.344590\",\n    \"bytes\": 11,\n    \"name\": \"dealde/l04 011e 4c8df/flash.png\",\n    \"content_type\": \"image/png\"\n  },","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d1c1f899e557fa07b29388ee791d1e4c83f95be2","unresolved":false,"context_lines":[{"line_number":285,"context_line":"        self._assertSymlink("},{"line_number":286,"context_line":"            self.env.link_cont, link_obj,"},{"line_number":287,"context_line":"            expected_content_location\u003durllib.parse.quote(urllib.parse.unquote("},{"line_number":288,"context_line":"                \"%s/%s\" % (self.env.tgt_cont, target_obj))))"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    def test_symlink_put_head_get(self):"},{"line_number":291,"context_line":"        link_obj \u003d uuid4().hex"}],"source_content_type":"text/x-python","patch_set":3,"id":"5fc1f717_b28355a9","line":288,"updated":"2019-03-22 20:10:37.000000000","message":"seems like one might hope this is the identity function - but it\u0027s definitely not (e.g. an already unquoted string)","commit_id":"398615e8b0e011d466f04d1bf5089ee0c29becbf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6727078573e01da15e1bb998d665f4f0ea9ff48c","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        resp \u003d retry("},{"line_number":291,"context_line":"            self._make_request, method\u003d\u0027PUT\u0027, container\u003dself.env.tgt_cont,"},{"line_number":292,"context_line":"            obj\u003dnormalized_quoted_obj, body\u003dTARGET_BODY)"},{"line_number":293,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        self._assertSymlink("},{"line_number":296,"context_line":"            self.env.link_cont, link_obj,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_9a223501","line":293,"updated":"2019-04-01 18:06:43.000000000","message":"How is this different from L275-279? Would it be better for us to do a GET on the normalized name and verify that it matches what we were expecting? Something like\n\ndiff --git a/test/functional/test_symlink.py b/test/functional/test_symlink.py\nindex d8d9553bc..eab7a14f5 100755\n--- a/test/functional/test_symlink.py\n+++ b/test/functional/test_symlink.py\n@@ -288,9 +288,10 @@ class TestSymlink(Base):\n         self.assertEqual(normalized_quoted_obj, urllib.parse.quote(\n             urllib.parse.unquote(target_obj)))\n         resp \u003d retry(\n-            self._make_request, method\u003d\u0027PUT\u0027, container\u003dself.env.tgt_cont,\n-            obj\u003dnormalized_quoted_obj, body\u003dTARGET_BODY)\n-        self.assertEqual(resp.status, 201)\n+            self._make_request, method\u003d\u0027GET\u0027, container\u003dself.env.tgt_cont,\n+            obj\u003dnormalized_quoted_obj)\n+        self.assertEqual(resp.status, 200)\n+        self.assertEqual(resp.content, TARGET_BODY)\n \n         self._assertSymlink(\n             self.env.link_cont, link_obj,","commit_id":"9e91b81a4ded171f648939d1f6075c894ea4532e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"cfe49a02989d3fed99afa700cb08e762e696b870","unresolved":false,"context_lines":[{"line_number":290,"context_line":"        resp \u003d retry("},{"line_number":291,"context_line":"            self._make_request, method\u003d\u0027PUT\u0027, container\u003dself.env.tgt_cont,"},{"line_number":292,"context_line":"            obj\u003dnormalized_quoted_obj, body\u003dTARGET_BODY)"},{"line_number":293,"context_line":"        self.assertEqual(resp.status, 201)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        self._assertSymlink("},{"line_number":296,"context_line":"            self.env.link_cont, link_obj,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5fc1f717_4b47d8bd","line":293,"in_reply_to":"5fc1f717_9a223501","updated":"2019-04-04 14:56:47.000000000","message":"I don\u0027t know, isn\u0027t that already covered under _assertSymlink in _test_get_as_target_object\n\nProbably the best way to phrase this test is to demonstrate no matter which name the client uses the created link objects are equivalent","commit_id":"9e91b81a4ded171f648939d1f6075c894ea4532e"}]}
