)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7973,"name":"Douglas Mendizábal","email":"dmendiza@redhat.com","username":"dougmendizabal"},"change_message_id":"890e3914b5cdb19f3f85a073a297e3a7c9dc4c3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"58ba96b6_15e07c0f","updated":"2021-12-08 16:34:36.000000000","message":"@Adam, it would be good to get some more context as to why this change is needed.  It\u0027s not clear what the benefit of rendering XHTML is?","commit_id":"d9b8ca0524f518e165c24377330d870cd2fdffaf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"cdc9cad13b59d63eef1a448f30e9b0a97539ef70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"76a17121_e299df66","in_reply_to":"58ba96b6_15e07c0f","updated":"2021-12-09 00:47:42.000000000","message":"When you view a URL with the web browser, and you only render it in JSON, you do not get the links.  With XHTM, we can identify the portions of the Keystone API that violate the principal of discoverability.  With XHTML, a user will be able to interact with a Keystone server in the absence of a third party App or Horizon.  This is a rewrite of a PoC I did a long time ago to show the point.\n\nOne of the rationales for moving to Flask was that we could then take advantage of Flasks supports for additional rendering formats beyond JSON","commit_id":"d9b8ca0524f518e165c24377330d870cd2fdffaf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c6d4141e1109994c3d7dab7b0acd17f825e9050f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"e20941b0_b4ee3380","in_reply_to":"76a17121_e299df66","updated":"2025-07-18 16:12:35.000000000","message":"Please update or remove the -1","commit_id":"d9b8ca0524f518e165c24377330d870cd2fdffaf"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"9dd13617d56f7e3cecbd80d8b07b69cc4dd0c676","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"809eca98_c35919fd","in_reply_to":"e20941b0_b4ee3380","updated":"2025-07-25 14:36:00.000000000","message":"but what is next? A version discovery returns xhtml, how should that help? How is the user supposed to use keystone api directly using the browser without Horizon or similar?","commit_id":"d9b8ca0524f518e165c24377330d870cd2fdffaf"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"c6d4141e1109994c3d7dab7b0acd17f825e9050f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"552e1b3e_985ffd67","updated":"2025-07-18 16:12:35.000000000","message":"But they are going to, and they do.  See my comments on the other review.\n\nKeystone is a stand alone service.  Rendering its output as browser visual is fairly simple and will be a great help in debugging, setup, and assigning user roles.","commit_id":"0bca43289fd0d0440ce4f8914d471c202c31fcd0"},{"author":{"_account_id":27900,"name":"Artem Goncharov","email":"artem.goncharov@gmail.com","username":"gtema"},"change_message_id":"2eef6ef03ca5bfe571b49f792380ff8a785e285b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d4cffd1f_72156c2e","updated":"2025-07-18 14:12:17.000000000","message":"I do not think anybody should be ever viewing the strictly REST api directly in the browser","commit_id":"0bca43289fd0d0440ce4f8914d471c202c31fcd0"}],"keystone/tests/unit/test_versions.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"240a8cad2f3ccaa9060c0737a9691c8a19281825","unresolved":false,"context_lines":[{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def test_xhttp_v3(self):"},{"line_number":842,"context_line":"        # If the request is /v3 and the Accept header is application/xhtml"},{"line_number":843,"context_line":"        # then the server responds with a JSON Home document."},{"line_number":844,"context_line":"        client \u003d TestClient(self.public_app)"},{"line_number":845,"context_line":"        resp \u003d client.get(\u0027/v3/\u0027, headers\u003d{\u0027Accept\u0027: \u0027application/xhtml+xml\u0027})"},{"line_number":846,"context_line":"        self.assertEqual(http_client.OK, resp.status_int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_aefec235","line":843,"range":{"start_line":843,"start_character":42,"end_line":843,"end_character":61},"updated":"2019-08-09 20:35:49.000000000","message":"that would be a strange behavior.","commit_id":"620dedc78d0bda9a5eca339f76bfd5d0dad7fb9b"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"632c1585c437ca0906512aec884401294c65cad2","unresolved":false,"context_lines":[{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def test_xhttp_v3(self):"},{"line_number":842,"context_line":"        # If the request is /v3 and the Accept header is application/xhtml"},{"line_number":843,"context_line":"        # then the server responds with a JSON Home document."},{"line_number":844,"context_line":"        client \u003d TestClient(self.public_app)"},{"line_number":845,"context_line":"        resp \u003d client.get(\u0027/v3/\u0027, headers\u003d{\u0027Accept\u0027: \u0027application/xhtml+xml\u0027})"},{"line_number":846,"context_line":"        self.assertEqual(http_client.OK, resp.status_int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f493fa4_8396944b","line":843,"range":{"start_line":843,"start_character":42,"end_line":843,"end_character":61},"in_reply_to":"7faddb67_24c191e5","updated":"2020-04-27 15:35:35.000000000","message":"It\u0027s just a copypaste error in the comment, the test itself is correct.","commit_id":"620dedc78d0bda9a5eca339f76bfd5d0dad7fb9b"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"f3e985b328563b8298ac6f253eeab580e4dc3ce5","unresolved":false,"context_lines":[{"line_number":840,"context_line":""},{"line_number":841,"context_line":"    def test_xhttp_v3(self):"},{"line_number":842,"context_line":"        # If the request is /v3 and the Accept header is application/xhtml"},{"line_number":843,"context_line":"        # then the server responds with a JSON Home document."},{"line_number":844,"context_line":"        client \u003d TestClient(self.public_app)"},{"line_number":845,"context_line":"        resp \u003d client.get(\u0027/v3/\u0027, headers\u003d{\u0027Accept\u0027: \u0027application/xhtml+xml\u0027})"},{"line_number":846,"context_line":"        self.assertEqual(http_client.OK, resp.status_int)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7faddb67_24c191e5","line":843,"range":{"start_line":843,"start_character":42,"end_line":843,"end_character":61},"in_reply_to":"7faddb67_aefec235","updated":"2019-08-10 01:05:17.000000000","message":"Oh that IS a strange behavior... i think this was intended to document current behavior... but... yeah lets fix that.","commit_id":"620dedc78d0bda9a5eca339f76bfd5d0dad7fb9b"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"07541e14d062163362ff2265d2093716cd0a7ae9","unresolved":false,"context_lines":[{"line_number":843,"context_line":"        # then the server responds with a JSON Home document."},{"line_number":844,"context_line":"        client \u003d TestClient(self.public_app)"},{"line_number":845,"context_line":"        resp \u003d client.get(\u0027/v3/\u0027, headers\u003d{\u0027Accept\u0027: \u0027application/xhtml+xml\u0027})"},{"line_number":846,"context_line":"        self.assertEqual(http_client.OK, resp.status_int)"},{"line_number":847,"context_line":"        self.assertEqual(resp.headers[\u0027Content-Type\u0027],"},{"line_number":848,"context_line":"                         \u0027application/xhtml+xml; charset\u003dutf-8\u0027)"},{"line_number":849,"context_line":"        test_parser \u003d TestHTMLParser()"}],"source_content_type":"text/x-python","patch_set":3,"id":"1f493fa4_b62ac828","line":846,"updated":"2020-04-28 21:40:40.000000000","message":"pep8: F821 undefined name \u0027http_client\u0027","commit_id":"620dedc78d0bda9a5eca339f76bfd5d0dad7fb9b"}]}
