)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a83f05e01093a83d00a42e5fd6a03203b445f1d8","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Trying to copy an object with non-ASCII characters in its name results"},{"line_number":10,"context_line":"in, depending on the pipeline:"},{"line_number":11,"context_line":"- an error code 412 because of a badly urlencoded path"},{"line_number":12,"context_line":"- an error code 500 \"TypeError: Expected a WSGI string\""},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This commit fixes the problem by calling str_to_wsgi on the object name"},{"line_number":15,"context_line":"after it has been urldecoded. We do not need to call this on the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"34fc253c_5291ed15","line":12,"updated":"2021-09-30 04:53:05.000000000","message":"That\u0027s how it popped for me:\n\n/var/log/syslog:4733:Sep 30 02:05:57 saio proxy-server: Expected a WSGI string; got \u0027/v1/AUTH_test/bucket/object name with %-sign 🙂\u0027: \nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/common/middleware/crypto/keymaster.py\", line 306, in __call__\n    parts \u003d [wsgi_to_str(part) for part in req.split_path(2, 4, True)]\n  File \"/vagrant/swift/swift/common/middleware/crypto/keymaster.py\", line 306, in \u003clistcomp\u003e\n    parts \u003d [wsgi_to_str(part) for part in req.split_path(2, 4, True)]\n  File \"/vagrant/swift/swift/common/swob.py\", line 286, in wsgi_to_str\n    return wsgi_to_bytes(wsgi_str).decode(\u0027utf8\u0027, errors\u003d\u0027surrogateescape\u0027)\n  File \"/vagrant/swift/swift/common/swob.py\", line 278, in wsgi_to_bytes\n    return wsgi_str.encode(\u0027latin1\u0027)\nUnicodeEncodeError: \u0027latin-1\u0027 codec can\u0027t encode character \u0027\\U0001f642\u0027 in position 24: ordinal not in range(256)\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3api.py\", line 340, in __call__\n    resp \u003d self.handle_request(req)\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3api.py\", line 378, in handle_request\n    res \u003d handler(req)\n  File \"/vagrant/swift/swift/common/middleware/s3api/controllers/obj.py\", line 152, in PUT\n    req.check_copy_source(self.app)\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 913, in check_copy_source\n    src_resp \u003d self.get_response(app, \u0027HEAD\u0027, src_bucket, src_obj,\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 1427, in get_response\n    return self._get_response(app, method, container, obj,\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3request.py\", line 1345, in _get_response\n    sw_resp \u003d sw_req.get_response(app)\n  File \"/vagrant/swift/swift/common/swob.py\", line 1159, in get_response\n    status, headers, app_iter \u003d self.call_application(application)\n  File \"/vagrant/swift/swift/common/swob.py\", line 1143, in call_application\n    app_iter \u003d application(self.environ, start_response)\n  File \"/vagrant/swift/swift/common/middleware/s3api/s3api.py\", line 174, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/tempauth.py\", line 346, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/swob.py\", line 1570, in _wsgify\n    return func(*new_args)(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/staticweb.py\", line 546, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/copy.py\", line 253, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/ratelimit.py\", line 321, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/slo.py\", line 1698, in __call__\n    return self.handle_multipart_get_or_head(req, start_response)\n  File \"/vagrant/swift/swift/common/middleware/slo.py\", line 1153, in handle_multipart_get_or_head\n    return SloGetContext(self).handle_slo_get_or_head(req, start_response)\n  File \"/vagrant/swift/swift/common/middleware/slo.py\", line 786, in handle_slo_get_or_head\n    resp_iter \u003d self._app_call(req.environ)\n  File \"/vagrant/swift/swift/common/wsgi.py\", line 1336, in _app_call\n    resp \u003d self.app(env, self._start_response)\n  File \"/vagrant/swift/swift/common/middleware/dlo.py\", line 441, in __call__\n    return GetContext(self, self.logger).\\\n  File \"/vagrant/swift/swift/common/middleware/dlo.py\", line 376, in handle_request\n    resp_iter \u003d self._app_call(req.environ)\n  File \"/vagrant/swift/swift/common/wsgi.py\", line 1336, in _app_call\n    resp \u003d self.app(env, self._start_response)\n  File \"/vagrant/swift/swift/common/middleware/versioned_writes/legacy.py\", line 872, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/versioned_writes/object_versioning.py\", line 1463, in __call__\n    return self.object_request(\n  File \"/vagrant/swift/swift/common/middleware/symlink.py\", line 752, in __call__\n    return context.handle_object(req, start_response)\n  File \"/vagrant/swift/swift/common/middleware/symlink.py\", line 704, in handle_object\n    resp \u003d self.handle_get_head(req)\n  File \"/vagrant/swift/swift/common/middleware/symlink.py\", line 438, in handle_get_head\n    return self._recursive_get_head(req)\n  File \"/vagrant/swift/swift/common/middleware/symlink.py\", line 449, in _recursive_get_head\n    resp \u003d self._app_call(req.environ)\n  File \"/vagrant/swift/swift/common/wsgi.py\", line 1336, in _app_call\n    resp \u003d self.app(env, self._start_response)\n  File \"/vagrant/swift/swift/common/middleware/crypto/keymaster.py\", line 308, in __call__\n    return self.app(env, start_response)\n  File \"/vagrant/swift/swift/common/middleware/crypto/decrypter.py\", line 452, in __call__\n    return handler(req, start_response)\n  File \"/vagrant/swift/swift/common/middleware/crypto/decrypter.py\", line 306, in handle\n    app_resp \u003d self._app_call(req.environ)\n  File \"/vagrant/swift/swift/common/wsgi.py\", line 1336, in _app_call\n    resp \u003d self.app(env, self._start_response)\n  File \"/vagrant/swift/swift/common/middleware/crypto/encrypter.py\", line 389, in __call__\n    return handler(req, start_response)\n  File \"/vagrant/swift/swift/common/middleware/crypto/encrypter.py\", line 338, in handle_get_or_head\n    resp \u003d self._app_call(req.environ)\n  File \"/vagrant/swift/swift/common/wsgi.py\", line 1340, in _app_call\n    resp \u003d reiterate(resp)\n  File \"/vagrant/swift/swift/common/utils.py\", line 4153, in reiterate\n    chunk \u003d next(iterator)\n  File \"/vagrant/swift/swift/common/middleware/proxy_logging.py\", line 425, in iter_response\n    self.log_request(\n  File \"/vagrant/swift/swift/common/middleware/proxy_logging.py\", line 234, in log_request\n    swift_path \u003d req.environ.get(\u0027swift.backend_path\u0027, req.path)\n  File \"/vagrant/swift/swift/common/swob.py\", line 1068, in path\n    return wsgi_quote(self.environ.get(\u0027SCRIPT_NAME\u0027, \u0027\u0027) +\n  File \"/vagrant/swift/swift/common/swob.py\", line 308, in wsgi_quote\n    raise TypeError(\u0027Expected a WSGI string; got %r\u0027 % wsgi_str)\nTypeError: Expected a WSGI string; got \u0027/v1/AUTH_test/bucket/object name with %-sign 🙂\u0027","commit_id":"c15818f1e6f77119b57d2646c291d694cebd2698"}]}
