)]}'
{"test/s3api/test_input_errors.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1e597af2cfc25ad405e75e8d99017084557d1e21","unresolved":true,"context_lines":[{"line_number":307,"context_line":"        # request, and also in the request url for query-string auth."},{"line_number":308,"context_line":"        # [1] https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"},{"line_number":309,"context_line":"        return {quote(k, safe\u003d\u0027-_.~\u0027): quote(v, safe\u003d\u0027-_.~\u0027)"},{"line_number":310,"context_line":"                for k, v in query_params.items()}"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def sign_v4(self, request):"},{"line_number":313,"context_line":"        canonical_request_lines \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"607c4c3a_3000fbec","line":310,"updated":"2025-07-21 09:25:31.000000000","message":"this change is required because on feature/mpu the MPU uploadId format changes and includes ``~`` and ``\u003d`` characters (base64). I *think* it\u0027s the ``\u003d`` that are problematic.","commit_id":"1523e7194e7c3cb84f8295d0a7072860149a0850"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6039a5f68851a56772df288122681d344e58affb","unresolved":true,"context_lines":[{"line_number":307,"context_line":"        # request, and also in the request url for query-string auth."},{"line_number":308,"context_line":"        # [1] https://datatracker.ietf.org/doc/html/rfc3986#section-3.4"},{"line_number":309,"context_line":"        return {quote(k, safe\u003d\u0027-_.~\u0027): quote(v, safe\u003d\u0027-_.~\u0027)"},{"line_number":310,"context_line":"                for k, v in query_params.items()}"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"    def sign_v4(self, request):"},{"line_number":313,"context_line":"        canonical_request_lines \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"5749af86_b4d0805e","line":310,"in_reply_to":"607c4c3a_3000fbec","updated":"2025-07-21 16:35:26.000000000","message":"Interesting -- from the [python docs](https://docs.python.org/3/library/urllib.parse.html):\n\n\u003e Letters, digits, and the characters `\u0027_.-~\u0027` are never quoted. ... The optional *safe* parameter specifies additional ASCII characters that should not be quoted — its default value is `\u0027/\u0027`.\n\nSo maybe it was the `/` that was throwing things off? And we could simplify to `safe\u003d\u0027\u0027` (even on master).","commit_id":"1523e7194e7c3cb84f8295d0a7072860149a0850"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6039a5f68851a56772df288122681d344e58affb","unresolved":true,"context_lines":[{"line_number":437,"context_line":"            or h.startswith(\u0027x-amz-\u0027)"},{"line_number":438,"context_line":"        )"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        request[\u0027query\u0027] \u003d self._quote_query_params(request[\u0027query\u0027])"},{"line_number":441,"context_line":"        return request"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    def date_to_sign(self, request):"}],"source_content_type":"text/x-python","patch_set":2,"id":"b65c5973_8dd83576","line":440,"updated":"2025-07-21 16:35:26.000000000","message":"So our v4 client will handle quoting `request[\u0027query\u0027]`, but our v2 wants you to do it yourself?\n\nIf you want to test invalid quoting (`%invalid`) ... I guess now you\u0027d need to break open `make_request` so you can get in between `build_request` and `send_request`?","commit_id":"1523e7194e7c3cb84f8295d0a7072860149a0850"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1feb79315fc02174d3bf65d8ee1637117a5be956","unresolved":true,"context_lines":[{"line_number":437,"context_line":"            or h.startswith(\u0027x-amz-\u0027)"},{"line_number":438,"context_line":"        )"},{"line_number":439,"context_line":""},{"line_number":440,"context_line":"        request[\u0027query\u0027] \u003d self._quote_query_params(request[\u0027query\u0027])"},{"line_number":441,"context_line":"        return request"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    def date_to_sign(self, request):"}],"source_content_type":"text/x-python","patch_set":2,"id":"b4735704_016deb1c","line":440,"in_reply_to":"b65c5973_8dd83576","updated":"2025-07-24 12:33:50.000000000","message":"agree, that\u0027s not a great asymmetry","commit_id":"1523e7194e7c3cb84f8295d0a7072860149a0850"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6039a5f68851a56772df288122681d344e58affb","unresolved":true,"context_lines":[{"line_number":1595,"context_line":"            \u0027\u003c/Part\u003e\u0027"},{"line_number":1596,"context_line":"            \u0027\u003c/CompleteMultipartUpload\u003e\u0027 % part_resp[\u0027ETag\u0027]"},{"line_number":1597,"context_line":"        ).encode(\u0027utf-8\u0027)"},{"line_number":1598,"context_line":"        return upload_id, complete_request_body"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    def test_good_md5_good_sha_good_crc_header_mpu(self):"},{"line_number":1601,"context_line":"        key \u003d \u0027mpu-name\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"253744a6_bc429bc8","line":1598,"range":{"start_line":1598,"start_character":15,"end_line":1598,"end_character":24},"updated":"2025-07-21 16:35:26.000000000","message":"If we\u0027re pretty sure it was the uploadId format change that did it, would it be better to `quote` here, as we return? Then pass around quoted uploadIds, ready to be used by this client that expects everything to already be quoted.","commit_id":"1523e7194e7c3cb84f8295d0a7072860149a0850"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"1feb79315fc02174d3bf65d8ee1637117a5be956","unresolved":true,"context_lines":[{"line_number":1595,"context_line":"            \u0027\u003c/Part\u003e\u0027"},{"line_number":1596,"context_line":"            \u0027\u003c/CompleteMultipartUpload\u003e\u0027 % part_resp[\u0027ETag\u0027]"},{"line_number":1597,"context_line":"        ).encode(\u0027utf-8\u0027)"},{"line_number":1598,"context_line":"        return upload_id, complete_request_body"},{"line_number":1599,"context_line":""},{"line_number":1600,"context_line":"    def test_good_md5_good_sha_good_crc_header_mpu(self):"},{"line_number":1601,"context_line":"        key \u003d \u0027mpu-name\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"cc8771ba_4e7ba2c2","line":1598,"range":{"start_line":1598,"start_character":15,"end_line":1598,"end_character":24},"in_reply_to":"253744a6_bc429bc8","updated":"2025-07-24 12:33:50.000000000","message":"that\u0027s a good idea.\n\nhmmm, except it breaks v2 :/\n\naha...Swift\u0027s v2 string to sign using the *unquoted* req.params to build the string to sign:\n```\nreq \u003d swob.Request.blank(\u0027/a/c%3Ed?x\u003dy%3Bb\u0027)\nreq.params\n{\u0027x\u0027: \u0027y;b\u0027}\n```\n\nso we should be doing the same in this client. And AWS says the same I think i.e. \"When signing, you do not encode these values\".\nhttps://docs.aws.amazon.com/AmazonS3/latest/API/RESTAuthentication.html#RESTAuthenticationRequestCanonicalization","commit_id":"1523e7194e7c3cb84f8295d0a7072860149a0850"}]}
