)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     indianwhocodes \u003cnairashwin952013@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-08-02 15:35:01 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Improve coverage for FakeSwift tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Idb4020fdeee87a9164312dc9647ab0820b098ff8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"6a56d119_cfd64069","line":7,"updated":"2023-08-04 15:50:31.000000000","message":"The commit message needs to state what the problem is that is being addressed. What is the intended behavioural change with this patch?","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     indianwhocodes \u003cnairashwin952013@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2023-08-02 15:35:01 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Improve coverage for FakeSwift tests"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: Idb4020fdeee87a9164312dc9647ab0820b098ff8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"4ec9e17c_05976e3e","line":7,"in_reply_to":"6a56d119_cfd64069","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"unit tests: improve FakeSwift handling of HEAD with query param"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We have to improve our unit-test coverage in swift since we detected that we couldn\u0027t issue a HEAD request with a partNum query param to our FakeSwift app without generating a KeyError since it wasn\u0027t included in the acceptable dict of responses."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Idb4020fdeee87a9164312dc9647ab0820b098ff8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"87eacaab_aabc136a","line":9,"range":{"start_line":9,"start_character":74,"end_line":9,"end_character":184},"updated":"2023-08-07 19:21:11.000000000","message":"If this is the main driver -- have we sought alternatives? Register an extra head with the query param? Pop off the query param so it doesn\u0027t make it to the backend (at least for HEADs)?","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"unit tests: improve FakeSwift handling of HEAD with query param"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"We have to improve our unit-test coverage in swift since we detected that we couldn\u0027t issue a HEAD request with a partNum query param to our FakeSwift app without generating a KeyError since it wasn\u0027t included in the acceptable dict of responses."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Change-Id: Idb4020fdeee87a9164312dc9647ab0820b098ff8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"64511a7c_578e8ccf","line":9,"range":{"start_line":9,"start_character":74,"end_line":9,"end_character":184},"in_reply_to":"87eacaab_aabc136a","updated":"2023-08-18 14:44:20.000000000","message":"Goodness yes, so many alternatives.  But IMHO, in context the \"just register a HEAD with query param\" option looked strange.  Lots of other tests didn\u0027t require registering the extra HEAD when they had a registered GET.  To me it begged the question as to \"why the inconsistency\" and we indeed found that FakeSwift\u0027s handling of \"select registered response\" was indeed quite inconsistent.  I think in the end this direction really does make the test infrasture better.\n\nMore-over I don\u0027t think this is the tail wagging the dog; the GET/HEAD \u0026 query param normalization is actually tightly related to the SLO behavior of fetching the manifest to calculate response headers for a HEAD to an SLO.  Orginal tests for SLO registered a GET manifest calls (return the json) but a client HEAD would return headers that SLO recognized as x-slo and slo would *refetch* with a GET (same registered response) so it could calculate the correct response headers for the HEAD (size, etag).\n\nEventually swift grew smarter and started caching these pre-calculated values as sysmeta on the large object - then a \"inherited test case\" pattern simply put the extra x-sysmeta on the registered GET response (which would still be returned in-response to a a client HEAD) but in these tests no additional refetch GET was needed.  It turns out that it makes a LOT of sense to simply register consistent SLO manifest responses with the correct metadata in setUp - and then leave it up to the middleware to decide if it needs to do a GET or a HEAD.\n\nWe\u0027re going to have to do the same thing for part-num, and while we can\u0027t cache every segments content-length, so HEAD slo?part-num\u003d4 will always have to refetch the json manifest and dig around - it still makes sense I think not to KeyError when the middleware shoots down the first HEAD slo?part-num\u003d4 when the tests already have a registered GET slo that\u0027s working for all the other HEADs (w/o query param)","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":22,"context_line":"test_slo with a bunch of tests that assert consistent response headers"},{"line_number":23,"context_line":"for both GET and HEAD requests w/ new query params."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Drive-By: normalize FakeSwift.uploaded on raw_path, for some small"},{"line_number":26,"context_line":"additional sanity when FakeSwift is making things up."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: Idb4020fdeee87a9164312dc9647ab0820b098ff8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"8a220401_7ff3734a","line":25,"updated":"2023-08-16 14:08:36.000000000","message":"this confused me for a while, because the uploaded key *was* previously normalized by normalize_path(), but now it isn\u0027t. Then I realised that you mean normalize on using env[\u0027PATH_INFO\u0027] rather than `path \u003d normalize_path(path)` var 😂","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[{"line_number":22,"context_line":"test_slo with a bunch of tests that assert consistent response headers"},{"line_number":23,"context_line":"for both GET and HEAD requests w/ new query params."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"Drive-By: normalize FakeSwift.uploaded on raw_path, for some small"},{"line_number":26,"context_line":"additional sanity when FakeSwift is making things up."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: Idb4020fdeee87a9164312dc9647ab0820b098ff8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"60c5cd77_077819a0","line":25,"in_reply_to":"8a220401_7ff3734a","updated":"2023-08-18 14:44:20.000000000","message":"Done","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"98131fcc_74dcd678","updated":"2023-07-27 15:59:13.000000000","message":"there seems to be a number of unrealted mw tests that use query params that have failed - it\u0027s possible that a different order of precendence on in the helper respone finding algo could fix this unexpected side-effects.","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fda0c0ba_cc7fa241","in_reply_to":"98131fcc_74dcd678","updated":"2023-08-17 15:33:25.000000000","message":"I have addressed them by changing the sequence of the if-elf-else clauses since i was handling them wrong before","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"fe540584_88ffafb2","updated":"2023-07-31 19:29:04.000000000","message":"i\u0027m not sure what\u0027s going on with the test failure exactly\n\nI think there\u0027s still some oppertunities for additional stronger tests and some more cleanup - I think either an elif-chain or keyerror in a loop; but not both","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"ebc0d57e_99778622","updated":"2023-08-02 21:53:53.000000000","message":"well, you managed to add support for HEAD path?query\u003dparam w/ GET path responses and keep all the tests passing - that\u0027s not nothing!\n\nBut I think this change is a little hard to grok and there\u0027s a couple of things that bug me - I took a stab at making some of the invarients more obvious:\n\nhttps://review.opendev.org/c/openstack/swift/+/890369\n\n... what do you think!?","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"e1bd806d_5d9bb920","updated":"2023-08-11 23:06:47.000000000","message":"well it\u0027s good that we have Tim and Al up to speed on this change, maybe if we get it working we can move on to using it in the part-number tests (where we\u0027ll have to do a lot of unitests that assert both HEAD and GET return the same headers for the same registered manifest responses)\n\nI have some follow-up for you to squash if any of that would be helpful:\n\nhttps://review.opendev.org/c/openstack/swift/+/891241","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"7c777166_e1730390","updated":"2023-08-16 14:08:36.000000000","message":"I think this is the right direction, but -1 because IIUC the PUT and POST paths seem to have diverged.\n\nI wonder if some of the new test cases are adding much more than demonstrating that FakeSwift is smart?","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"945f5a7ceffc5aff6ae31a71a11df35c3b5d4ce1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":23,"id":"6ee92fc0_d3fdea0c","updated":"2023-08-17 15:51:32.000000000","message":"resolving some of my own comments - the test changes are harmless and do serve to illustrate the new FakeSwift behaviour, so all ok","commit_id":"5f2426277149e191489e23bfb5f62b86ce67aa5d"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d5e6e2b5ea73e293398f5dc2095e09215a454f06","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"1899f2a2_77d22e18","updated":"2023-08-18 12:37:01.000000000","message":"I think this might take care of it https://review.opendev.org/c/openstack/swift/+/891977","commit_id":"7a3eed9c4b5d0efc5ac14be07ea85a10615f5ce7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7000b51a8605e7222c1aaa8c7a8820c43055b44b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"78846da4_86342fe5","updated":"2023-08-18 12:34:38.000000000","message":"ok, so if we\u0027re going to do the drive-by we need to hit all the ducks","commit_id":"7a3eed9c4b5d0efc5ac14be07ea85a10615f5ce7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"90b1fb1c26f56f482d5f5c1c7e573ff032c10028","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"d6436738_a5dcefe1","updated":"2023-08-18 13:52:12.000000000","message":"I reverted the drive-by, but harder than last time Ashwin did the revert - also reverting a change in _select_response","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"1cceffbf_8b5abb21","updated":"2023-08-18 14:44:20.000000000","message":"at patch set 30, given the follow-ups - I\u0027m not sure how strongly I feel about another respin to fix the comment about selecting from uploaded based on \"raw path\" - maybe raw in that context could just mean \"with out pulling off the query string\" 😄","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":125,"context_line":"            path_alias \u003d env[\u0027PATH_INFO\u0027]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":128,"context_line":"            method_alias \u003d \u0027GET\u0027"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            resp_class, raw_headers, body \u003d self._find_response(method, path)"}],"source_content_type":"text/x-python","patch_set":3,"id":"ffecc948_7446ea2b","line":128,"updated":"2023-07-27 15:59:13.000000000","message":"this looks good!","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            path_alias \u003d env[\u0027PATH_INFO\u0027]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":128,"context_line":"            method_alias \u003d \u0027GET\u0027"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            resp_class, raw_headers, body \u003d self._find_response(method, path)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7d6ae891_2f535ba3","line":128,"in_reply_to":"ffecc948_7446ea2b","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":false,"context_lines":[{"line_number":125,"context_line":"            path_alias \u003d env[\u0027PATH_INFO\u0027]"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":128,"context_line":"            method_alias \u003d \u0027GET\u0027"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            resp_class, raw_headers, body \u003d self._find_response(method, path)"}],"source_content_type":"text/x-python","patch_set":3,"id":"41a0d67e_18636d76","line":128,"in_reply_to":"ffecc948_7446ea2b","updated":"2023-07-31 19:29:04.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":136,"context_line":"                    method_alias, path_alias)"},{"line_number":137,"context_line":"                body \u003d None"},{"line_number":138,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":139,"context_line":"            elif (method, path) in self._responses:"},{"line_number":140,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":141,"context_line":"                    method, path)"},{"line_number":142,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"90a824ed_18501ee8","line":139,"updated":"2023-07-27 15:59:13.000000000","message":"it\u0027s not obvious to me how this is different form the try block","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    method_alias, path_alias)"},{"line_number":137,"context_line":"                body \u003d None"},{"line_number":138,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":139,"context_line":"            elif (method, path) in self._responses:"},{"line_number":140,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":141,"context_line":"                    method, path)"},{"line_number":142,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bac25d6c_a7826ff0","line":139,"in_reply_to":"90a824ed_18501ee8","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    method_alias, path_alias)"},{"line_number":137,"context_line":"                body \u003d None"},{"line_number":138,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":139,"context_line":"            elif (method, path) in self._responses:"},{"line_number":140,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":141,"context_line":"                    method, path)"},{"line_number":142,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a0051f2_44875ac1","line":139,"in_reply_to":"90a824ed_18501ee8","updated":"2023-08-17 15:33:25.000000000","message":"The problem we were facing was how a (method_alias, path_alias) weren\u0027t part of the acceptable responses within our dict, now this helper method provides coverage for when the path_alias will be the qualified path(env[\u0027PATH_INFO\u0027]) without the query string.","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":145,"context_line":"                    method, path_alias)"},{"line_number":146,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":147,"context_line":"            elif (method_alias, path) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path)"},{"line_number":150,"context_line":"                body \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"707b662f_cd109c36","line":147,"updated":"2023-07-27 15:59:13.000000000","message":"I think it might be wrong to do this after method_alias, path_alias\n\nIf i register `GET foo` and `GET foo?param\u003dtrue` I would expect `HEAD foo?param\u003dtrue` to return the response I prepared for `GET foo?param\u003dtrue` is that what happens with this code?","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":145,"context_line":"                    method, path_alias)"},{"line_number":146,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":147,"context_line":"            elif (method_alias, path) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path)"},{"line_number":150,"context_line":"                body \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"ae0bf826_ea62c9ac","line":147,"in_reply_to":"707b662f_cd109c36","updated":"2023-07-31 19:29:04.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":145,"context_line":"                    method, path_alias)"},{"line_number":146,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":147,"context_line":"            elif (method_alias, path) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path)"},{"line_number":150,"context_line":"                body \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"f5e4bb24_8628cbfe","line":147,"in_reply_to":"707b662f_cd109c36","updated":"2023-08-17 15:33:25.000000000","message":"Yes, that is correct.","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":149,"context_line":"                    method_alias, path)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":154,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":155,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"6363d7c7_efb21df3","line":152,"updated":"2023-07-27 15:59:13.000000000","message":"what about HEAD on a self.uploaded path?","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                    method_alias, path)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":154,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":155,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"50608fdd_c058fca7","line":152,"in_reply_to":"6363d7c7_efb21df3","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                    method_alias, path)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":154,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":155,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"532825e7_fda55957","line":152,"in_reply_to":"6363d7c7_efb21df3","updated":"2023-07-31 19:29:04.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":true,"context_lines":[{"line_number":187,"context_line":"        self.txn_ids.append(env.get(\u0027swift.trans_id\u0027))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        resp_class, headers, body \u003d self.\\"},{"line_number":190,"context_line":"            _generate_fake_swift_response(env, method, path)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        ignore_range_meta \u003d req.headers.get("},{"line_number":193,"context_line":"            \u0027x-backend-ignore-range-if-metadata-present\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3b719f07_ed5cd681","line":190,"updated":"2023-07-31 19:29:04.000000000","message":"slight preference to break the line at the parans so the continuation character isn\u0027ted needed:\n\n    a, b, c, \u003d self.my_long_func_name(\n        and, my, params)","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self.txn_ids.append(env.get(\u0027swift.trans_id\u0027))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        resp_class, headers, body \u003d self.\\"},{"line_number":190,"context_line":"            _generate_fake_swift_response(env, method, path)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        ignore_range_meta \u003d req.headers.get("},{"line_number":193,"context_line":"            \u0027x-backend-ignore-range-if-metadata-present\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"63c90f1d_42e13116","line":190,"in_reply_to":"3b719f07_ed5cd681","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        self.txn_ids.append(env.get(\u0027swift.trans_id\u0027))"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        resp_class, headers, body \u003d self.\\"},{"line_number":190,"context_line":"            _generate_fake_swift_response(env, method, path)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        ignore_range_meta \u003d req.headers.get("},{"line_number":193,"context_line":"            \u0027x-backend-ignore-range-if-metadata-present\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"8941a2d5_785a7cc0","line":190,"in_reply_to":"3b719f07_ed5cd681","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":116,"context_line":"        return resp"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _generate_fake_swift_response(self, env, method, path):"},{"line_number":119,"context_line":"        _, _, _, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 0, 4, rest_with_last\u003dTrue)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        query_string \u003d env.get(\u0027QUERY_STRING\u0027)"},{"line_number":122,"context_line":"        method_alias \u003d path_alias \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"b6c9aa11_92826f99","line":119,"updated":"2023-08-02 21:53:53.000000000","message":"we do this split in the caller, i don\u0027t think the obj is strictly needed","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return resp"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _generate_fake_swift_response(self, env, method, path):"},{"line_number":119,"context_line":"        _, _, _, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 0, 4, rest_with_last\u003dTrue)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        query_string \u003d env.get(\u0027QUERY_STRING\u0027)"},{"line_number":122,"context_line":"        method_alias \u003d path_alias \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"81f40f31_e6e64dce","line":119,"in_reply_to":"b6c9aa11_92826f99","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        return resp"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _generate_fake_swift_response(self, env, method, path):"},{"line_number":119,"context_line":"        _, _, _, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 0, 4, rest_with_last\u003dTrue)"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        query_string \u003d env.get(\u0027QUERY_STRING\u0027)"},{"line_number":122,"context_line":"        method_alias \u003d path_alias \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"c1be6ba7_b62527d5","line":119,"in_reply_to":"b6c9aa11_92826f99","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":133,"context_line":"        except KeyError:"},{"line_number":134,"context_line":"            if (method, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":136,"context_line":"                    method, path)"},{"line_number":137,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":138,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":139,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("}],"source_content_type":"text/x-python","patch_set":9,"id":"670889cd_98dbcf87","line":136,"updated":"2023-08-02 21:53:53.000000000","message":"it really bugs me that this is the same (method, path) we *just* hit a KeyError on, this branch can never be executed.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":133,"context_line":"        except KeyError:"},{"line_number":134,"context_line":"            if (method, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":136,"context_line":"                    method, path)"},{"line_number":137,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":138,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":139,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("}],"source_content_type":"text/x-python","patch_set":9,"id":"9ac81592_86b4fe8d","line":136,"in_reply_to":"670889cd_98dbcf87","updated":"2023-08-04 15:50:31.000000000","message":"+1","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        except KeyError:"},{"line_number":134,"context_line":"            if (method, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":136,"context_line":"                    method, path)"},{"line_number":137,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":138,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":139,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("}],"source_content_type":"text/x-python","patch_set":9,"id":"3f400649_240b31ee","line":136,"in_reply_to":"9ac81592_86b4fe8d","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        except KeyError:"},{"line_number":134,"context_line":"            if (method, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":136,"context_line":"                    method, path)"},{"line_number":137,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":138,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":139,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("}],"source_content_type":"text/x-python","patch_set":9,"id":"a7d76094_a8e901f9","line":136,"in_reply_to":"9ac81592_86b4fe8d","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":144,"context_line":"                    method_alias, path)"},{"line_number":145,"context_line":"                body \u003d None"},{"line_number":146,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":147,"context_line":"            elif (method_alias, path_alias) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"dc5da75a_7d4a3d76","line":147,"updated":"2023-08-02 21:53:53.000000000","message":"in a lot of cases method_alias and path_alias are None and we\u0027re still checking if they\u0027re in _responses - seems overly verbose and inefficient","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                    method_alias, path)"},{"line_number":145,"context_line":"                body \u003d None"},{"line_number":146,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":147,"context_line":"            elif (method_alias, path_alias) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"0bc76a65_554fe36b","line":147,"in_reply_to":"dc5da75a_7d4a3d76","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                    method_alias, path)"},{"line_number":145,"context_line":"                body \u003d None"},{"line_number":146,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":147,"context_line":"            elif (method_alias, path_alias) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"}],"source_content_type":"text/x-python","patch_set":9,"id":"c3711900_1d657dd0","line":147,"in_reply_to":"dc5da75a_7d4a3d76","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":147,"context_line":"            elif (method_alias, path_alias) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"}],"source_content_type":"text/x-python","patch_set":9,"id":"b5a8fcc4_1423a3d3","line":150,"updated":"2023-08-02 21:53:53.000000000","message":"let\u0027s just always set body \u003d None on HEAD requests so we don\u0027t have keep track of it in 3 different branches.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            elif (method_alias, path_alias) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"}],"source_content_type":"text/x-python","patch_set":9,"id":"c030281f_76569e21","line":150,"in_reply_to":"b5a8fcc4_1423a3d3","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            elif (method_alias, path_alias) in self._responses:"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"}],"source_content_type":"text/x-python","patch_set":9,"id":"9df79d3f_2c665795","line":150,"in_reply_to":"b5a8fcc4_1423a3d3","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":154,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":155,"context_line":"            elif method \u003d\u003d \u0027HEAD\u0027 and obj and path in self.uploaded:"}],"source_content_type":"text/x-python","patch_set":9,"id":"0ce3a5b1_0869c1f9","line":152,"updated":"2023-08-02 21:53:53.000000000","message":"I think the extracted code was overly defensive, we only add to uploaded when it\u0027s an object path","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":154,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":155,"context_line":"            elif method \u003d\u003d \u0027HEAD\u0027 and obj and path in self.uploaded:"}],"source_content_type":"text/x-python","patch_set":9,"id":"b95e46b7_42101181","line":152,"in_reply_to":"0ce3a5b1_0869c1f9","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                    method_alias, path_alias)"},{"line_number":150,"context_line":"                body \u003d None"},{"line_number":151,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":152,"context_line":"            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:"},{"line_number":153,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":154,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":155,"context_line":"            elif method \u003d\u003d \u0027HEAD\u0027 and obj and path in self.uploaded:"}],"source_content_type":"text/x-python","patch_set":9,"id":"1ee34d9a_d3dcaea2","line":152,"in_reply_to":"0ce3a5b1_0869c1f9","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":144,"context_line":"            headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":145,"context_line":"        except KeyError:"},{"line_number":146,"context_line":"            if (env.get(\u0027QUERY_STRING\u0027)"},{"line_number":147,"context_line":"                    and (method, env[\u0027PATH_INFO\u0027]) in self._responses):"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method, env[\u0027PATH_INFO\u0027])"},{"line_number":150,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":12,"id":"98ed032b_8dfde485","side":"PARENT","line":147,"updated":"2023-08-04 15:50:31.000000000","message":"is this the desired outcome of this patch:\n\n```\nif (env.get(\u0027QUERY_STRING\u0027):\n        and (\u0027GET\u0027 if method \u003d\u003d \u0027HEAD\u0027 else method, env[\u0027PATH_INFO\u0027]) in self._responses):\n    resp_class, raw_headers, body \u003d self._find_response(\n        \u0027GET\u0027 if method \u003d\u003d \u0027HEAD\u0027 else method, env[\u0027PATH_INFO\u0027])\n```","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":145,"context_line":"        except KeyError:"},{"line_number":146,"context_line":"            if (env.get(\u0027QUERY_STRING\u0027)"},{"line_number":147,"context_line":"                    and (method, env[\u0027PATH_INFO\u0027]) in self._responses):"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method, env[\u0027PATH_INFO\u0027])"},{"line_number":150,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":12,"id":"5b1052ca_108ff4b1","side":"PARENT","line":147,"in_reply_to":"56a85bab_38f78b6d","updated":"2023-08-16 14:08:36.000000000","message":"I wasn\u0027t suggesting this code, I was asking if this was the goal, prior to there being a useful commit message 😊","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":145,"context_line":"        except KeyError:"},{"line_number":146,"context_line":"            if (env.get(\u0027QUERY_STRING\u0027)"},{"line_number":147,"context_line":"                    and (method, env[\u0027PATH_INFO\u0027]) in self._responses):"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method, env[\u0027PATH_INFO\u0027])"},{"line_number":150,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":12,"id":"ae107114_c0690bd6","side":"PARENT","line":147,"in_reply_to":"98ed032b_8dfde485","updated":"2023-08-17 15:33:25.000000000","message":"It is, the new updated patch should address our objective succinctly","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":144,"context_line":"            headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":145,"context_line":"        except KeyError:"},{"line_number":146,"context_line":"            if (env.get(\u0027QUERY_STRING\u0027)"},{"line_number":147,"context_line":"                    and (method, env[\u0027PATH_INFO\u0027]) in self._responses):"},{"line_number":148,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":149,"context_line":"                    method, env[\u0027PATH_INFO\u0027])"},{"line_number":150,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"}],"source_content_type":"text/x-python","patch_set":12,"id":"56a85bab_38f78b6d","side":"PARENT","line":147,"in_reply_to":"98ed032b_8dfde485","updated":"2023-08-11 23:06:47.000000000","message":"honesly i was already have trouble parsing the existing booleans, I can\u0027t quite parse what your suggesting\n\nif query string, yeah that\u0027s part of it\nand (GET if req.method \u003d\u003d HEAD else HEAD/GET, raw_path) in response\n\nah, yeah that\u0027s probably the gist, but if we have an explict registered response for (HEAD, raw_path) and (GET, raw_path) we\u0027d probably still want to return the explicitly registered (HEAD, raw_path), even tho (HEAD, query_path) failed.\n\nit\u0027s also kind of annoying to have to spell the ternary twice: once to check and again to look up, I think that\u0027s where we came up with \"method_alias\" but couldn\u0027t quite get that looking obvious either.\n\nIf we could get the test updates nailed down we could iterate on the most maintainable way to spell the implementation; unfortunately this change is flailing around in multiple directions at once without any obvious progress towards convergence.","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":131,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":132,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":133,"context_line":"                    method, path_alias)"},{"line_number":134,"context_line":"            elif (method_alias, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":136,"context_line":"                    method_alias, path)"},{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"}],"source_content_type":"text/x-python","patch_set":12,"id":"85868046_7c59524e","line":136,"range":{"start_line":134,"start_character":12,"end_line":136,"end_character":39},"updated":"2023-08-04 15:50:31.000000000","message":"The original is much easier to read. I find the method_alias unhelpful.","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":131,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":132,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":133,"context_line":"                    method, path_alias)"},{"line_number":134,"context_line":"            elif (method_alias, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":136,"context_line":"                    method_alias, path)"},{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f58b4bb_7113817a","line":136,"range":{"start_line":134,"start_character":12,"end_line":136,"end_character":39},"in_reply_to":"85868046_7c59524e","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":131,"context_line":"            elif (method, path_alias) in self._responses:"},{"line_number":132,"context_line":"                resp_class, raw_headers, body \u003d self._find_response("},{"line_number":133,"context_line":"                    method, path_alias)"},{"line_number":134,"context_line":"            elif (method_alias, path) in self._responses:"},{"line_number":135,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":136,"context_line":"                    method_alias, path)"},{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"}],"source_content_type":"text/x-python","patch_set":12,"id":"8486cdfc_d09951dc","line":136,"range":{"start_line":134,"start_character":12,"end_line":136,"end_character":39},"in_reply_to":"85868046_7c59524e","updated":"2023-08-11 23:06:47.000000000","message":"i struggled to read the original and found this one also difficult - we should try some different ideas and see if we can agree on something that we think we can maintain.","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":136,"context_line":"                    method_alias, path)"},{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"},{"line_number":140,"context_line":"            elif path in self.uploaded:"},{"line_number":141,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":142,"context_line":"                raw_headers, body \u003d self.uploaded[path]"}],"source_content_type":"text/x-python","patch_set":12,"id":"cfbe982e_b57675f1","line":139,"updated":"2023-08-04 15:50:31.000000000","message":"ditto, can this be:\n\n```\nelif method \u003d\u003d \u0027HEAD\u0027 and query_string:\n    resp_class, raw_headers, _ \u003d self._find_response(\u0027GET\u0027, env[\u0027PATH\u0027])\n```","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":136,"context_line":"                    method_alias, path)"},{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"},{"line_number":140,"context_line":"            elif path in self.uploaded:"},{"line_number":141,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":142,"context_line":"                raw_headers, body \u003d self.uploaded[path]"}],"source_content_type":"text/x-python","patch_set":12,"id":"dda6a192_2c6886bc","line":139,"in_reply_to":"cfbe982e_b57675f1","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":136,"context_line":"                    method_alias, path)"},{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"},{"line_number":140,"context_line":"            elif path in self.uploaded:"},{"line_number":141,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":142,"context_line":"                raw_headers, body \u003d self.uploaded[path]"}],"source_content_type":"text/x-python","patch_set":12,"id":"b6705c23_bb1db42b","line":139,"in_reply_to":"cfbe982e_b57675f1","updated":"2023-08-11 23:06:47.000000000","message":"maybe, I think that could still KeyError?","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"},{"line_number":140,"context_line":"            elif path in self.uploaded:"},{"line_number":141,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":142,"context_line":"                raw_headers, body \u003d self.uploaded[path]"},{"line_number":143,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"10c51cef_900cea96","line":140,"range":{"start_line":140,"start_character":17,"end_line":140,"end_character":38},"updated":"2023-08-04 15:50:31.000000000","message":"why is it no longer a condition that it\u0027s an object GET?","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"},{"line_number":140,"context_line":"            elif path in self.uploaded:"},{"line_number":141,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":142,"context_line":"                raw_headers, body \u003d self.uploaded[path]"},{"line_number":143,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"46d1727d_6f5f1172","line":140,"range":{"start_line":140,"start_character":17,"end_line":140,"end_character":38},"in_reply_to":"10c51cef_900cea96","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":137,"context_line":"            elif is_aliased:"},{"line_number":138,"context_line":"                resp_class, raw_headers, _ \u003d self._find_response("},{"line_number":139,"context_line":"                    method_alias, path_alias)"},{"line_number":140,"context_line":"            elif path in self.uploaded:"},{"line_number":141,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":142,"context_line":"                raw_headers, body \u003d self.uploaded[path]"},{"line_number":143,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"28cd65db_c1152879","line":140,"range":{"start_line":140,"start_character":17,"end_line":140,"end_character":38},"in_reply_to":"10c51cef_900cea96","updated":"2023-08-11 23:06:47.000000000","message":"ostensibly because it\u0027s not needed - we check that when adding paths to self.uploaded\n\nbut really because it avoids double parsing the env (once outside of this extracted method and then again here for the purpose of being overly defensive)","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":145,"context_line":"                    (method, path),))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        headers \u003d HeaderKeyDict(raw_headers) if isinstance(raw_headers, dict) \\"},{"line_number":148,"context_line":"            else raw_headers"},{"line_number":149,"context_line":"        return resp_class, headers, body"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def __call__(self, env, start_response):"}],"source_content_type":"text/x-python","patch_set":12,"id":"49b76f7e_d387a486","line":148,"range":{"start_line":148,"start_character":17,"end_line":148,"end_character":28},"updated":"2023-08-04 15:50:31.000000000","message":"I couldn\u0027t figure out what raw_headers could be if it is not an instance of dict?","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":145,"context_line":"                    (method, path),))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        headers \u003d HeaderKeyDict(raw_headers) if isinstance(raw_headers, dict) \\"},{"line_number":148,"context_line":"            else raw_headers"},{"line_number":149,"context_line":"        return resp_class, headers, body"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def __call__(self, env, start_response):"}],"source_content_type":"text/x-python","patch_set":12,"id":"22c51636_e3ba8819","line":148,"range":{"start_line":148,"start_character":17,"end_line":148,"end_character":28},"in_reply_to":"49b76f7e_d387a486","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":145,"context_line":"                    (method, path),))"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"        headers \u003d HeaderKeyDict(raw_headers) if isinstance(raw_headers, dict) \\"},{"line_number":148,"context_line":"            else raw_headers"},{"line_number":149,"context_line":"        return resp_class, headers, body"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def __call__(self, env, start_response):"}],"source_content_type":"text/x-python","patch_set":12,"id":"5f0b34cb_3e49d97e","line":148,"range":{"start_line":148,"start_character":17,"end_line":148,"end_character":28},"in_reply_to":"49b76f7e_d387a486","updated":"2023-08-11 23:06:47.000000000","message":"yeah idk\n\n    \u003e\u003e\u003e isinstance(HeaderKeyDict({}), dict)\n    True","commit_id":"9eac2ab6530de3c6679287f8b85c6e97665a7e8e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":124,"context_line":"            preferences.append((method, env[\u0027PATH_INFO\u0027]))"},{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            for p in [p for m, p in preferences]:"},{"line_number":128,"context_line":"                preferences.append((\u0027GET\u0027, p))"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"105136eb_4df8f933","line":127,"updated":"2023-08-07 19:21:11.000000000","message":"nit: Alternatively, `for _, p in preferences:` or even `preferences.extend((\u0027GET\u0027, p) for _, p in preferences)`","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":124,"context_line":"            preferences.append((method, env[\u0027PATH_INFO\u0027]))"},{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            for p in [p for m, p in preferences]:"},{"line_number":128,"context_line":"                preferences.append((\u0027GET\u0027, p))"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"f61d9ef8_c5b3b83c","line":127,"in_reply_to":"105136eb_4df8f933","updated":"2023-08-11 23:06:47.000000000","message":"I think the original was trying to explicityly avoid modifying a list while iterating it, perhaps a comment would help or there\u0027s something more idiomatic I didn\u0027t think of.","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"ee4dff462e4f1cd176ea0502171b5663d1e20fa1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"            preferences.append((method, env[\u0027PATH_INFO\u0027]))"},{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            for p in [p for m, p in preferences]:"},{"line_number":128,"context_line":"                preferences.append((\u0027GET\u0027, p))"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"eb177735_81659ce8","line":127,"in_reply_to":"82322f0b_32c40cae","updated":"2023-08-17 15:40:16.000000000","message":"Ack","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4d920da95bcdee604e34ec1fece1f887dfe03148","unresolved":true,"context_lines":[{"line_number":124,"context_line":"            preferences.append((method, env[\u0027PATH_INFO\u0027]))"},{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            for p in [p for m, p in preferences]:"},{"line_number":128,"context_line":"                preferences.append((\u0027GET\u0027, p))"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"}],"source_content_type":"text/x-python","patch_set":16,"id":"82322f0b_32c40cae","line":127,"in_reply_to":"f61d9ef8_c5b3b83c","updated":"2023-08-14 21:36:44.000000000","message":"Got it -- yeah, it was just reading funny to me, having an explicit loop over a list comprehension that fits _in the same line_. Comment would go a long way, even if we go with something like\n```\npreferences.extend([(\u0027GET\u0027, p) for _, p in preferences])\n```","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":135,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":136,"context_line":"                break"},{"line_number":137,"context_line":"        else:"},{"line_number":138,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and path in self.uploaded:"},{"line_number":139,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":140,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":141,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"4705652e_5f6d5de2","line":138,"range":{"start_line":138,"start_character":45,"end_line":138,"end_character":66},"updated":"2023-08-07 19:21:11.000000000","message":"This check is _with_ the query string, yeah? So maybe the comment above ought to be\n```\n# we can always reuse registered response w/o query string\n```","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":136,"context_line":"                break"},{"line_number":137,"context_line":"        else:"},{"line_number":138,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and path in self.uploaded:"},{"line_number":139,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":140,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":141,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"60d50309_91eef57f","line":138,"range":{"start_line":138,"start_character":45,"end_line":138,"end_character":66},"in_reply_to":"4705652e_5f6d5de2","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":135,"context_line":"                headers \u003d HeaderKeyDict(raw_headers)"},{"line_number":136,"context_line":"                break"},{"line_number":137,"context_line":"        else:"},{"line_number":138,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and path in self.uploaded:"},{"line_number":139,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":140,"context_line":"                headers, body \u003d self.uploaded[path]"},{"line_number":141,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":16,"id":"b51baf77_006c8eb1","line":138,"range":{"start_line":138,"start_character":45,"end_line":138,"end_character":66},"in_reply_to":"4705652e_5f6d5de2","updated":"2023-08-11 23:06:47.000000000","message":"correct, this special case for uploaded files is only after all the preferences didn\u0027t find a valid registered response.\n\nthe comment on line 138 looks entirely incorrect (copy/paste error from L123?), there\u0027s no registered response here we\u0027re just cooking up something from the metadata we saved off for during PUTs\n\ni don\u0027t think we\u0027ve found a use-case for cooking up a query param response from an uploaded object so I don\u0027t think we should attempt to support it.","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":263,"context_line":"                if count \u003e 0}"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    @property"},{"line_number":266,"context_line":"    def unread_requests(self):"},{"line_number":267,"context_line":"        return {path: count"},{"line_number":268,"context_line":"                for path, count in self._unread_req_paths.items()"},{"line_number":269,"context_line":"                if count \u003e 0}"}],"source_content_type":"text/x-python","patch_set":16,"id":"459db1ab_35ff0cf3","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":23},"updated":"2023-08-07 19:21:11.000000000","message":"Off-topic, I guess? And I\u0027m pretty sure this is my fault (though I might appeal to precedent with `unclosed_requests`) -- but this should really be `unread_responses`.","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                if count \u003e 0}"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    @property"},{"line_number":266,"context_line":"    def unread_requests(self):"},{"line_number":267,"context_line":"        return {path: count"},{"line_number":268,"context_line":"                for path, count in self._unread_req_paths.items()"},{"line_number":269,"context_line":"                if count \u003e 0}"}],"source_content_type":"text/x-python","patch_set":16,"id":"ad23edfa_e5dc0c08","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":23},"in_reply_to":"459db1ab_35ff0cf3","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":263,"context_line":"                if count \u003e 0}"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    @property"},{"line_number":266,"context_line":"    def unread_requests(self):"},{"line_number":267,"context_line":"        return {path: count"},{"line_number":268,"context_line":"                for path, count in self._unread_req_paths.items()"},{"line_number":269,"context_line":"                if count \u003e 0}"}],"source_content_type":"text/x-python","patch_set":16,"id":"9c63987e_296c86ec","line":266,"range":{"start_line":266,"start_character":8,"end_line":266,"end_character":23},"in_reply_to":"459db1ab_35ff0cf3","updated":"2023-08-11 23:06:47.000000000","message":"it would be great to clean that up in a follow-up!\n\nshouldn\u0027t be too bad tho:\n\n(vagrant-swift-all-in-one) clayg@banana:~/Workspace/vagrant-swift-all-in-one/swift$ grep -R unread_requests test/unit/ 2\u003e/dev/null | wc -l\n32","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            for _, p in preferences:"},{"line_number":128,"context_line":"                preferences.extend((\u0027GET\u0027, p) for _, p in preferences)"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                resp_class, raw_headers, body \u003d self._find_response(m, p)"}],"source_content_type":"text/x-python","patch_set":20,"id":"20252ee9_fb1d3328","line":128,"updated":"2023-08-11 23:06:47.000000000","message":"I doubt Tim expected you do both; it was an either or suggestion. This is infinite recursion - you\u0027re extending a list as your iterating on it.  This will get you sigkilled.","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            for _, p in preferences:"},{"line_number":128,"context_line":"                preferences.extend((\u0027GET\u0027, p) for _, p in preferences)"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                resp_class, raw_headers, body \u003d self._find_response(m, p)"}],"source_content_type":"text/x-python","patch_set":20,"id":"c87dd1c3_aedfb660","line":128,"in_reply_to":"20252ee9_fb1d3328","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":197,"context_line":"            headers.setdefault(\u0027Content-Length\u0027, len(req_body))"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"            # keep it for subsequent GET requests later"},{"line_number":200,"context_line":"            self.uploaded[path] \u003d (dict(req.headers), req_body)"},{"line_number":201,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":202,"context_line":"                self.uploaded[path][0][\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"836a7de8_fd74206f","line":200,"updated":"2023-08-11 23:06:47.000000000","message":"it looks like uploaded always has a raw dict, so we should probably just always convert to HeaderKeyDict on the way out of select response","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"ee4dff462e4f1cd176ea0502171b5663d1e20fa1","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            headers.setdefault(\u0027Content-Length\u0027, len(req_body))"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"            # keep it for subsequent GET requests later"},{"line_number":200,"context_line":"            self.uploaded[path] \u003d (dict(req.headers), req_body)"},{"line_number":201,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":202,"context_line":"                self.uploaded[path][0][\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"86e4f0ca_f03ecaed","line":200,"in_reply_to":"836a7de8_fd74206f","updated":"2023-08-17 15:40:16.000000000","message":"Ack","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class FakeSwift(object):"},{"line_number":74,"context_line":"    \"\"\""},{"line_number":75,"context_line":"    A good-enough fake Swift proxy server to use in testing middleware."},{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    ALLOWED_METHODS \u003d ["},{"line_number":78,"context_line":"        \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027, \u0027GET\u0027, \u0027HEAD\u0027, \u0027OPTIONS\u0027, \u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"a7d89084_b3f35297","line":75,"updated":"2023-08-16 14:08:36.000000000","message":"nit: might be time for us to start documenting some of the nuances - either here or under the `register` method","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"2910257755168db4d4eb59b2e75bba445761d57a","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class FakeSwift(object):"},{"line_number":74,"context_line":"    \"\"\""},{"line_number":75,"context_line":"    A good-enough fake Swift proxy server to use in testing middleware."},{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":"    ALLOWED_METHODS \u003d ["},{"line_number":78,"context_line":"        \u0027PUT\u0027, \u0027POST\u0027, \u0027DELETE\u0027, \u0027GET\u0027, \u0027HEAD\u0027, \u0027OPTIONS\u0027, \u0027REPLICATE\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"226c35f0_6283953d","line":75,"in_reply_to":"a7d89084_b3f35297","updated":"2023-08-17 15:54:45.000000000","message":"We could move documenting the method to the follow-on patch we write up","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":115,"context_line":"                                     (method, path),))"},{"line_number":116,"context_line":"        return resp"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _select_response(self, env, method, path):"},{"line_number":119,"context_line":"        # in some cases we can borrow different registered response"},{"line_number":120,"context_line":"        # ... the order is brittle and significant"},{"line_number":121,"context_line":"        preferences \u003d [(method, path)]"}],"source_content_type":"text/x-python","patch_set":21,"id":"192dd01e_24aff129","line":118,"updated":"2023-08-16 14:08:36.000000000","message":"+ this is easier to grok than on master","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a1e736453c6ce5efd682c1f63239fd9b35f84d06","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                                     (method, path),))"},{"line_number":116,"context_line":"        return resp"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _select_response(self, env, method, path):"},{"line_number":119,"context_line":"        # in some cases we can borrow different registered response"},{"line_number":120,"context_line":"        # ... the order is brittle and significant"},{"line_number":121,"context_line":"        preferences \u003d [(method, path)]"}],"source_content_type":"text/x-python","patch_set":21,"id":"0252cb37_1e96ac75","line":118,"in_reply_to":"192dd01e_24aff129","updated":"2023-08-17 15:50:26.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8d387f71f40a3cb38fd552584158cb9a3d10249e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                                     (method, path),))"},{"line_number":116,"context_line":"        return resp"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _select_response(self, env, method, path):"},{"line_number":119,"context_line":"        # in some cases we can borrow different registered response"},{"line_number":120,"context_line":"        # ... the order is brittle and significant"},{"line_number":121,"context_line":"        preferences \u003d [(method, path)]"}],"source_content_type":"text/x-python","patch_set":21,"id":"4cb517ad_9994863b","line":118,"in_reply_to":"192dd01e_24aff129","updated":"2023-08-17 15:46:15.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            # N.B. list(preferences) to avoid iter+modify/sigkill"},{"line_number":128,"context_line":"            preferences.extend((\u0027GET\u0027, p) for _, p in list(preferences))"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                resp_class, headers, body \u003d self._find_response(m, p)"}],"source_content_type":"text/x-python","patch_set":21,"id":"2c15c30d_da07afd1","line":128,"updated":"2023-08-16 14:08:36.000000000","message":"should the opposite also be true - if a HEAD succeeds to a path, should a GET? I guess it depends on whether we think we\u0027re registering expected calls or registering resource existence.","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8d387f71f40a3cb38fd552584158cb9a3d10249e","unresolved":false,"context_lines":[{"line_number":125,"context_line":"        if method \u003d\u003d \u0027HEAD\u0027:"},{"line_number":126,"context_line":"            # any path suitable for GET always works for HEAD"},{"line_number":127,"context_line":"            # N.B. list(preferences) to avoid iter+modify/sigkill"},{"line_number":128,"context_line":"            preferences.extend((\u0027GET\u0027, p) for _, p in list(preferences))"},{"line_number":129,"context_line":"        for m, p in preferences:"},{"line_number":130,"context_line":"            try:"},{"line_number":131,"context_line":"                resp_class, headers, body \u003d self._find_response(m, p)"}],"source_content_type":"text/x-python","patch_set":21,"id":"3ca6d90a_21e381f5","line":128,"in_reply_to":"2c15c30d_da07afd1","updated":"2023-08-17 15:46:15.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"526943e9_38f74e92","line":139,"updated":"2023-08-16 14:08:36.000000000","message":"but POST fails even if PUT has been called","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6d3666d20ce6b2dfad292ee9fec6f264a0a70e0a","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"3db6da56_70176ba4","line":139,"in_reply_to":"1aae5d61_8ca25182","updated":"2023-08-17 23:34:59.000000000","message":"We will have to include the drive-by change in this patchset since we are seeing failures here ref:https://zuul.opendev.org/t/openstack/build/fe914e5a64434a00904e1d2e65f2eddb","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7000b51a8605e7222c1aaa8c7a8820c43055b44b","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"6504d960_47439233","line":139,"in_reply_to":"3db6da56_70176ba4","updated":"2023-08-18 12:34:38.000000000","message":"yup, on master we look for `path in self.uploaded` but now we look for `env[\u0027PATH_INFO\u0027] in self.uploaded` so either this line reverts to master of the PUT drive-by is needed.","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8d387f71f40a3cb38fd552584158cb9a3d10249e","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"93a5e152_2301bb8b","line":139,"in_reply_to":"526943e9_38f74e92","updated":"2023-08-17 15:46:15.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a1e736453c6ce5efd682c1f63239fd9b35f84d06","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"1aae5d61_8ca25182","line":139,"in_reply_to":"526943e9_38f74e92","updated":"2023-08-17 15:50:26.000000000","message":"This can be taken care of in another patchset as discussed","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"90b1fb1c26f56f482d5f5c1c7e573ff032c10028","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"5ad9bd22_0f4ca6f0","line":139,"in_reply_to":"6504d960_47439233","updated":"2023-08-18 13:52:12.000000000","message":"Done","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":147,"context_line":"            # HEAD resp never has body"},{"line_number":148,"context_line":"            body \u003d None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        return resp_class, HeaderKeyDict(headers), body"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def __call__(self, env, start_response):"},{"line_number":153,"context_line":"        if self.can_ignore_range:"}],"source_content_type":"text/x-python","patch_set":21,"id":"ee797f7a_ec6d953d","line":150,"updated":"2023-08-16 14:08:36.000000000","message":"for GET/HEAD served from self.uploaded, on master we\u0027d just return the headers pulled out of self.uploaded, but I prefer that they are now copied into a fresh dict - avoids any mutation \"corrupting\" the stored object.","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"8d387f71f40a3cb38fd552584158cb9a3d10249e","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            # HEAD resp never has body"},{"line_number":148,"context_line":"            body \u003d None"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"        return resp_class, HeaderKeyDict(headers), body"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def __call__(self, env, start_response):"},{"line_number":153,"context_line":"        if self.can_ignore_range:"}],"source_content_type":"text/x-python","patch_set":21,"id":"bc6766e6_7e7d1802","line":150,"in_reply_to":"ee797f7a_ec6d953d","updated":"2023-08-17 15:46:15.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":200,"context_line":"            resp_headers \u003d dict(req.headers)"},{"line_number":201,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":202,"context_line":"                resp_headers[\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":203,"context_line":"            self.uploaded[env[\u0027PATH_INFO\u0027]] \u003d (resp_headers, req_body)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"}],"source_content_type":"text/x-python","patch_set":21,"id":"121415e1_12bffe30","line":203,"updated":"2023-08-16 14:08:36.000000000","message":"much easier to read","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"ee4dff462e4f1cd176ea0502171b5663d1e20fa1","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            resp_headers \u003d dict(req.headers)"},{"line_number":201,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":202,"context_line":"                resp_headers[\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":203,"context_line":"            self.uploaded[env[\u0027PATH_INFO\u0027]] \u003d (resp_headers, req_body)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"}],"source_content_type":"text/x-python","patch_set":21,"id":"54e78a25_02277c5a","line":203,"in_reply_to":"121415e1_12bffe30","updated":"2023-08-17 15:40:16.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"},{"line_number":207,"context_line":"            metadata, data \u003d self.uploaded.get(path, ({}, None))"},{"line_number":208,"context_line":"            # select items to keep from existing..."},{"line_number":209,"context_line":"            new_metadata \u003d dict("},{"line_number":210,"context_line":"                (k, v) for k, v in metadata.items()"}],"source_content_type":"text/x-python","patch_set":21,"id":"e2b7f362_2ac9a50a","line":207,"range":{"start_line":207,"start_character":47,"end_line":207,"end_character":50},"updated":"2023-08-16 14:08:36.000000000","message":"hmmm, we just changed the key that a PUT is stored under - might we now get a miss when looking up a POST?\n\n```\nfrom test.unit.common.middleware.helpers import FakeSwift\nimport swift.common.swob as swob\nf\u003dFakeSwift()\nf.register(\u0027PUT\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk, {})\nf.register(\u0027POST\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk, {})\nbody \u003d io.BytesIO(b\u0027body\u0027)\nput_env\u003d{\u0027PATH_INFO\u0027: \u0027/v1/a/c/o\u0027, \u0027QUERY_STRING\u0027: \u0027x\u003dy\u0027, \u0027REQUEST_METHOD\u0027: \u0027PUT\u0027, \u0027wsgi.input\u0027: body}\nf(put_env, lambda *a, **k: None)\n\u003ctest.unit.common.middleware.helpers.LeakTrackingIter object at 0x103fc9670\u003e\nf.uploaded\n{\u0027/v1/a/c/o\u0027: ({}, b\u0027body\u0027)}\nf(post_env, lambda *a, **k: None)\n\u003ctest.unit.common.middleware.helpers.LeakTrackingIter object at 0x103fdf640\u003e\nf.uploaded\n{\u0027/v1/a/c/o\u0027: ({}, b\u0027body\u0027), \u0027/v1/a/c/o?x\u003dy\u0027: ({}, None)}\n\n```\n\nthat\u0027s not what we want is it? ^^^","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a1e736453c6ce5efd682c1f63239fd9b35f84d06","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"},{"line_number":207,"context_line":"            metadata, data \u003d self.uploaded.get(path, ({}, None))"},{"line_number":208,"context_line":"            # select items to keep from existing..."},{"line_number":209,"context_line":"            new_metadata \u003d dict("},{"line_number":210,"context_line":"                (k, v) for k, v in metadata.items()"}],"source_content_type":"text/x-python","patch_set":21,"id":"2cb86951_946fe7ad","line":207,"range":{"start_line":207,"start_character":47,"end_line":207,"end_character":50},"in_reply_to":"e2b7f362_2ac9a50a","updated":"2023-08-17 15:50:26.000000000","message":"I am gonna revert these drive-by changes and make another patchset.","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":216,"context_line":"                     if (is_user_meta(\u0027object\u0027, k) or"},{"line_number":217,"context_line":"                         is_object_transient_sysmeta(k) or"},{"line_number":218,"context_line":"                         k.lower \u003d\u003d \u0027content-type\u0027)))"},{"line_number":219,"context_line":"            self.uploaded[path] \u003d new_metadata, data"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        # simulate object GET/HEAD"},{"line_number":222,"context_line":"        elif method in (\u0027GET\u0027, \u0027HEAD\u0027) and obj:"}],"source_content_type":"text/x-python","patch_set":21,"id":"2e485348_3dafa7af","line":219,"range":{"start_line":219,"start_character":12,"end_line":219,"end_character":31},"updated":"2023-08-16 14:08:36.000000000","message":"should this get the same drive-by treatment?","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"945f5a7ceffc5aff6ae31a71a11df35c3b5d4ce1","unresolved":false,"context_lines":[{"line_number":216,"context_line":"                     if (is_user_meta(\u0027object\u0027, k) or"},{"line_number":217,"context_line":"                         is_object_transient_sysmeta(k) or"},{"line_number":218,"context_line":"                         k.lower \u003d\u003d \u0027content-type\u0027)))"},{"line_number":219,"context_line":"            self.uploaded[path] \u003d new_metadata, data"},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        # simulate object GET/HEAD"},{"line_number":222,"context_line":"        elif method in (\u0027GET\u0027, \u0027HEAD\u0027) and obj:"}],"source_content_type":"text/x-python","patch_set":21,"id":"4295d728_a610b95d","line":219,"range":{"start_line":219,"start_character":12,"end_line":219,"end_character":31},"in_reply_to":"2e485348_3dafa7af","updated":"2023-08-17 15:51:32.000000000","message":"we decided to revert the drive by","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cade6eeac02896758e9368280da7b07992fbed0c","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"26fac7a2_a27b2a16","line":139,"range":{"start_line":139,"start_character":45,"end_line":139,"end_character":62},"updated":"2023-08-18 13:13:35.000000000","message":"this is a change from master, and requires the \"drive-by at line 203\"","commit_id":"7a3eed9c4b5d0efc5ac14be07ea85a10615f5ce7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"90b1fb1c26f56f482d5f5c1c7e573ff032c10028","unresolved":false,"context_lines":[{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and env[\u0027PATH_INFO\u0027] in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[env[\u0027PATH_INFO\u0027]]"},{"line_number":142,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":29,"id":"cccb3c74_45abd6fa","line":139,"range":{"start_line":139,"start_character":45,"end_line":139,"end_character":62},"in_reply_to":"26fac7a2_a27b2a16","updated":"2023-08-18 13:52:12.000000000","message":"or, revert this","commit_id":"7a3eed9c4b5d0efc5ac14be07ea85a10615f5ce7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7000b51a8605e7222c1aaa8c7a8820c43055b44b","unresolved":true,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"},{"line_number":207,"context_line":"            metadata, data \u003d self.uploaded.get(path, ({}, None))"},{"line_number":208,"context_line":"            # select items to keep from existing..."},{"line_number":209,"context_line":"            new_metadata \u003d dict("},{"line_number":210,"context_line":"                (k, v) for k, v in metadata.items()"}],"source_content_type":"text/x-python","patch_set":29,"id":"84ef91d0_171b8147","line":207,"range":{"start_line":207,"start_character":47,"end_line":207,"end_character":51},"updated":"2023-08-18 12:34:38.000000000","message":"this should also change to env[\u0027PATH_INFO\u0027]","commit_id":"7a3eed9c4b5d0efc5ac14be07ea85a10615f5ce7"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"90b1fb1c26f56f482d5f5c1c7e573ff032c10028","unresolved":false,"context_lines":[{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"},{"line_number":207,"context_line":"            metadata, data \u003d self.uploaded.get(path, ({}, None))"},{"line_number":208,"context_line":"            # select items to keep from existing..."},{"line_number":209,"context_line":"            new_metadata \u003d dict("},{"line_number":210,"context_line":"                (k, v) for k, v in metadata.items()"}],"source_content_type":"text/x-python","patch_set":29,"id":"50301f60_75eb1c77","line":207,"range":{"start_line":207,"start_character":47,"end_line":207,"end_character":51},"in_reply_to":"84ef91d0_171b8147","updated":"2023-08-18 13:52:12.000000000","message":"or not, if the change in _select_response has been reverted","commit_id":"7a3eed9c4b5d0efc5ac14be07ea85a10615f5ce7"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":true,"context_lines":[{"line_number":135,"context_line":"                break"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and path in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[path]"}],"source_content_type":"text/x-python","patch_set":30,"id":"9a55dec0_95bd8788","line":138,"updated":"2023-08-18 14:44:20.000000000","message":"always \"raw path\" 😄\n\ndrive-bys are the worst 😢","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"d80919990f3a62c1686c949fde260a40d57a1b79","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                break"},{"line_number":136,"context_line":"        else:"},{"line_number":137,"context_line":"            # special case for re-reading an uploaded file"},{"line_number":138,"context_line":"            # ... uploaded is only objects and always raw path"},{"line_number":139,"context_line":"            if method in (\u0027GET\u0027, \u0027HEAD\u0027) and path in self.uploaded:"},{"line_number":140,"context_line":"                resp_class \u003d swob.HTTPOk"},{"line_number":141,"context_line":"                headers, body \u003d self.uploaded[path]"}],"source_content_type":"text/x-python","patch_set":30,"id":"ffc10347_aa54b91c","line":138,"in_reply_to":"9a55dec0_95bd8788","updated":"2023-08-18 18:56:41.000000000","message":"Ack","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f410a94043e6ba6f09117890c5c8b86d39bf2556","unresolved":true,"context_lines":[{"line_number":200,"context_line":"            resp_headers \u003d dict(req.headers)"},{"line_number":201,"context_line":"            if \"CONTENT_TYPE\" in env:"},{"line_number":202,"context_line":"                resp_headers[\u0027Content-Type\u0027] \u003d env[\"CONTENT_TYPE\"]"},{"line_number":203,"context_line":"            self.uploaded[path] \u003d (resp_headers, req_body)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        # simulate object POST"},{"line_number":206,"context_line":"        elif method \u003d\u003d \u0027POST\u0027 and obj:"}],"source_content_type":"text/x-python","patch_set":30,"id":"a6ddfa10_0cd86e22","line":203,"updated":"2023-08-18 13:57:07.000000000","message":"Note: there\u0027s no behavioural change here, but I liked the way Clay re-wrote it so kept that much of the drive-by","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"}],"test/unit/common/middleware/test_dlo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":340,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":341,"context_line":"        self.assertEqual(headers[\"Etag\"], \"manifest-etag\")"},{"line_number":342,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":343,"context_line":"        self.assertFalse(self.app.unread_requests)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def test_error_passthrough(self):"},{"line_number":346,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":9,"id":"509d447f_f9766d6f","line":343,"updated":"2023-08-02 21:53:53.000000000","message":"I think it\u0027d be better if you added the new request/asserts to the end of the test rather than insert them the middle.  Written this way it\u0027s less obvious after the fact that the HEAD request isn\u0027t *required* for unread_requests to be False","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":341,"context_line":"        self.assertEqual(headers[\"Etag\"], \"manifest-etag\")"},{"line_number":342,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":343,"context_line":"        self.assertFalse(self.app.unread_requests)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def test_error_passthrough(self):"},{"line_number":346,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":9,"id":"18546c94_fb3342b4","line":343,"in_reply_to":"0ad639c2_5c8765bb","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a1e736453c6ce5efd682c1f63239fd9b35f84d06","unresolved":false,"context_lines":[{"line_number":340,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":341,"context_line":"        self.assertEqual(headers[\"Etag\"], \"manifest-etag\")"},{"line_number":342,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":343,"context_line":"        self.assertFalse(self.app.unread_requests)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def test_error_passthrough(self):"},{"line_number":346,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":9,"id":"8f7b683b_155ff83b","line":343,"in_reply_to":"4a31e0b0_dac44a8b","updated":"2023-08-17 15:50:26.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":true,"context_lines":[{"line_number":340,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":341,"context_line":"        self.assertEqual(headers[\"Etag\"], \"manifest-etag\")"},{"line_number":342,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":343,"context_line":"        self.assertFalse(self.app.unread_requests)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def test_error_passthrough(self):"},{"line_number":346,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":9,"id":"4a31e0b0_dac44a8b","line":343,"in_reply_to":"509d447f_f9766d6f","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":340,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":341,"context_line":"        self.assertEqual(headers[\"Etag\"], \"manifest-etag\")"},{"line_number":342,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":343,"context_line":"        self.assertFalse(self.app.unread_requests)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def test_error_passthrough(self):"},{"line_number":346,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":9,"id":"0ad639c2_5c8765bb","line":343,"in_reply_to":"509d447f_f9766d6f","updated":"2023-08-07 19:21:11.000000000","message":"\\*shrug\\* Either way -- there\u0027s another `self.assertFalse(self.app.unread_requests)` on L334 before we make the HEAD, so my read would be\n\n- all responses have been read as part of the GET,\n- then we make a new HEAD request, and\n- all responses have been read by the time we finish processing that one, too (i.e., any new responses have also been read).","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":363,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/AUTH_test/gone/404ed\u0027,"},{"line_number":364,"context_line":"                                 method\u003d\u0027HEAD\u0027,"},{"line_number":365,"context_line":"                                 params\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":366,"context_line":"        status, headers, body \u003d self.call_dlo(req)"},{"line_number":367,"context_line":"        self.assertEqual(status, \u0027404 Not Found\u0027)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def test_get_range(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"af2efe09_0f6c807b","line":366,"updated":"2023-08-16 14:08:36.000000000","message":"this fails when FakeSwift is reverted","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"945f5a7ceffc5aff6ae31a71a11df35c3b5d4ce1","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/AUTH_test/gone/404ed\u0027,"},{"line_number":364,"context_line":"                                 method\u003d\u0027HEAD\u0027,"},{"line_number":365,"context_line":"                                 params\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":366,"context_line":"        status, headers, body \u003d self.call_dlo(req)"},{"line_number":367,"context_line":"        self.assertEqual(status, \u0027404 Not Found\u0027)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def test_get_range(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"4d151905_32884213","line":366,"in_reply_to":"af2efe09_0f6c807b","updated":"2023-08-17 15:51:32.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"a1e736453c6ce5efd682c1f63239fd9b35f84d06","unresolved":false,"context_lines":[{"line_number":363,"context_line":"        req \u003d swob.Request.blank(\u0027/v1/AUTH_test/gone/404ed\u0027,"},{"line_number":364,"context_line":"                                 method\u003d\u0027HEAD\u0027,"},{"line_number":365,"context_line":"                                 params\u003d{\u0027multipart-manifest\u0027: \u0027get\u0027})"},{"line_number":366,"context_line":"        status, headers, body \u003d self.call_dlo(req)"},{"line_number":367,"context_line":"        self.assertEqual(status, \u0027404 Not Found\u0027)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    def test_get_range(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"eec89a58_c448e7ce","line":366,"in_reply_to":"af2efe09_0f6c807b","updated":"2023-08-17 15:50:26.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"}],"test/unit/common/middleware/test_object_versioning.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":1927,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1928,"context_line":"        self.assertIn((\u0027X-Object-Version-Id\u0027, \u00270000000060.00000\u0027),"},{"line_number":1929,"context_line":"                      headers)"},{"line_number":1930,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":1931,"context_line":""},{"line_number":1932,"context_line":"    def test_GET_404(self):"},{"line_number":1933,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"76716502_1bb4824b","line":1930,"updated":"2023-08-16 14:08:36.000000000","message":"`KeyError: (\u0027HEAD\u0027, \u0027/v1/a/\\x00versions\\x00c/\\x00o\\x009999999939.99999?version-id\u003d0000000060.00000\u0027)`\n\nok, but could the test be renamed test_GET_and_HEAD, or...just add a new test (which I realise would not illustrate the FakeSwift change?)","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"945f5a7ceffc5aff6ae31a71a11df35c3b5d4ce1","unresolved":false,"context_lines":[{"line_number":1927,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1928,"context_line":"        self.assertIn((\u0027X-Object-Version-Id\u0027, \u00270000000060.00000\u0027),"},{"line_number":1929,"context_line":"                      headers)"},{"line_number":1930,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":1931,"context_line":""},{"line_number":1932,"context_line":"    def test_GET_404(self):"},{"line_number":1933,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"45c199a9_5d8884ee","line":1930,"in_reply_to":"76716502_1bb4824b","updated":"2023-08-17 15:51:32.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"27eb180f2de11012dc7d26a71820c1fafef2a8ee","unresolved":false,"context_lines":[{"line_number":1927,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1928,"context_line":"        self.assertIn((\u0027X-Object-Version-Id\u0027, \u00270000000060.00000\u0027),"},{"line_number":1929,"context_line":"                      headers)"},{"line_number":1930,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":1931,"context_line":""},{"line_number":1932,"context_line":"    def test_GET_404(self):"},{"line_number":1933,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"24c22b83_539e9381","line":1930,"in_reply_to":"76716502_1bb4824b","updated":"2023-08-17 15:53:17.000000000","message":"Done","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":1986,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":1987,"context_line":"        self.assertEqual(2, len(self.app.calls))"},{"line_number":1988,"context_line":"        self.assertIn((\u0027X-Object-Version-Id\u0027, \u0027null\u0027), headers)"},{"line_number":1989,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":1990,"context_line":""},{"line_number":1991,"context_line":"    def test_GET_null_id_versioned_obj(self):"},{"line_number":1992,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"8486f378_6ab1ed36","line":1989,"updated":"2023-08-16 14:08:36.000000000","message":"we already have test_HEAD_null_id","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"945f5a7ceffc5aff6ae31a71a11df35c3b5d4ce1","unresolved":false,"context_lines":[{"line_number":1986,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":1987,"context_line":"        self.assertEqual(2, len(self.app.calls))"},{"line_number":1988,"context_line":"        self.assertIn((\u0027X-Object-Version-Id\u0027, \u0027null\u0027), headers)"},{"line_number":1989,"context_line":"        self.assertEqual(b\u0027\u0027, body)"},{"line_number":1990,"context_line":""},{"line_number":1991,"context_line":"    def test_GET_null_id_versioned_obj(self):"},{"line_number":1992,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"591dec9a_d0abcdef","line":1989,"in_reply_to":"8486f378_6ab1ed36","updated":"2023-08-17 15:51:32.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":2051,"context_line":"            environ\u003d{\u0027swift.cache\u0027: self.cache_version_on},"},{"line_number":2052,"context_line":"            params\u003d{\u0027version-id\u0027: \u0027null\u0027})"},{"line_number":2053,"context_line":"        with self.assertRaises(KeyError):"},{"line_number":2054,"context_line":"            status, headers, body \u003d self.call_ov(req)"},{"line_number":2055,"context_line":""},{"line_number":2056,"context_line":"    def test_HEAD_delete_marker(self):"},{"line_number":2057,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"bcef4148_2b24c315","line":2054,"updated":"2023-08-16 14:08:36.000000000","message":"this feels like it is just testing FakeSwift","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"945f5a7ceffc5aff6ae31a71a11df35c3b5d4ce1","unresolved":false,"context_lines":[{"line_number":2051,"context_line":"            environ\u003d{\u0027swift.cache\u0027: self.cache_version_on},"},{"line_number":2052,"context_line":"            params\u003d{\u0027version-id\u0027: \u0027null\u0027})"},{"line_number":2053,"context_line":"        with self.assertRaises(KeyError):"},{"line_number":2054,"context_line":"            status, headers, body \u003d self.call_ov(req)"},{"line_number":2055,"context_line":""},{"line_number":2056,"context_line":"    def test_HEAD_delete_marker(self):"},{"line_number":2057,"context_line":"        self.app.register("}],"source_content_type":"text/x-python","patch_set":21,"id":"527e5e44_478be14f","line":2054,"in_reply_to":"bcef4148_2b24c315","updated":"2023-08-17 15:51:32.000000000","message":"Ack","commit_id":"53978bc573b31d35153d04466e087e0872b3cb18"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":1891,"context_line":"        self.manifest_has_sysmeta \u003d all(h in manifest_headers for h in ("},{"line_number":1892,"context_line":"            \u0027X-Object-Sysmeta-Slo-Etag\u0027, \u0027X-Object-Sysmeta-Slo-Size\u0027))"},{"line_number":1893,"context_line":"        self.app.register("},{"line_number":1894,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"52d2dde1_6a581279","line":1894,"updated":"2023-07-27 15:59:13.000000000","message":"this TestCase registers a GET, but all the requests are HEADs (is there a TestSloGETOldManifest?) - maybe we just call this TestSloOldManifest and repeat these tests for both GETs and HEADs now that FakeSwift supports it.","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":1891,"context_line":"        self.manifest_has_sysmeta \u003d all(h in manifest_headers for h in ("},{"line_number":1892,"context_line":"            \u0027X-Object-Sysmeta-Slo-Etag\u0027, \u0027X-Object-Sysmeta-Slo-Size\u0027))"},{"line_number":1893,"context_line":"        self.app.register("},{"line_number":1894,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"d89017a5_63bb03e9","line":1894,"in_reply_to":"52d2dde1_6a581279","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":1891,"context_line":"        self.manifest_has_sysmeta \u003d all(h in manifest_headers for h in ("},{"line_number":1892,"context_line":"            \u0027X-Object-Sysmeta-Slo-Etag\u0027, \u0027X-Object-Sysmeta-Slo-Size\u0027))"},{"line_number":1893,"context_line":"        self.app.register("},{"line_number":1894,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fac6149b_c1f3794f","line":1894,"in_reply_to":"52d2dde1_6a581279","updated":"2023-08-02 21:53:53.000000000","message":"There is not TestSloGETOldManifest, and it\u0027s not strictly needed to validate the new test infra changes; which support `HEAD path?query\u003dparam` from registered `GET path` response","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"65b3b7e14d83de81ae0b09ede8fe7733f08f1e30","unresolved":true,"context_lines":[{"line_number":1891,"context_line":"        self.manifest_has_sysmeta \u003d all(h in manifest_headers for h in ("},{"line_number":1892,"context_line":"            \u0027X-Object-Sysmeta-Slo-Etag\u0027, \u0027X-Object-Sysmeta-Slo-Size\u0027))"},{"line_number":1893,"context_line":"        self.app.register("},{"line_number":1894,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf41e2e8_72c57434","line":1894,"in_reply_to":"fac6149b_c1f3794f","updated":"2023-08-16 14:08:36.000000000","message":"I changed this to register HEAD and the tests failed - I think there may be GET subrequest from slo\n\n```\nFAILED [ 16%]\ntest/unit/common/middleware/test_slo.py:1903 (TestSloHeadOldManifest.test_etag_is_hash_of_segment_etags)\nself \u003d \u003ctest.unit.common.middleware.helpers.FakeSwift object at 0x110d81fd0\u003e\nenv \u003d {\u0027HTTP_HOST\u0027: \u0027localhost:80\u0027, \u0027HTTP_USER_AGENT\u0027: \u0027Mozzarella Foxfire SLO MultipartGET\u0027, \u0027PATH_INFO\u0027: \u0027/v1/AUTH_test/headtest/man\u0027, \u0027QUERY_STRING\u0027: \u0027\u0027, ...}\nstart_response \u003d \u003cbound method WSGIContext._start_response of \u003cswift.common.middleware.slo.SloGetContext object at 0x110dac520\u003e\u003e\n\n    def __call__(self, env, start_response):\n        if self.can_ignore_range:\n            # we might pop off the Range header\n            env \u003d dict(env)\n        method \u003d env[\u0027REQUEST_METHOD\u0027]\n        if method not in self.ALLOWED_METHODS:\n            raise HTTPNotImplemented()\n    \n        path \u003d env[\u0027PATH_INFO\u0027]\n        _, acc, cont, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 0, 4,\n                                       rest_with_last\u003dTrue)\n        if env.get(\u0027QUERY_STRING\u0027):\n            path +\u003d \u0027?\u0027 + env[\u0027QUERY_STRING\u0027]\n        path \u003d normalize_path(path)\n    \n        if \u0027swift.authorize\u0027 in env:\n            resp \u003d env[\u0027swift.authorize\u0027](swob.Request(env))\n            if resp:\n                return resp(env, start_response)\n    \n        req \u003d swob.Request(env)\n        self.swift_sources.append(env.get(\u0027swift.source\u0027))\n        self.txn_ids.append(env.get(\u0027swift.trans_id\u0027))\n    \n        try:\n\u003e           resp_class, raw_headers, body \u003d self._find_response(method, path)\n\nhelpers.py:143: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003ctest.unit.common.middleware.helpers.FakeSwift object at 0x110d81fd0\u003e\nmethod \u003d \u0027GET\u0027, path \u003d \u0027/v1/AUTH_test/headtest/man\u0027\n\n    def _find_response(self, method, path):\n        path \u003d normalize_path(path)\n\u003e       resp \u003d self._responses[(method, path)]\nE       KeyError: (\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)\n\nhelpers.py:108: KeyError\n\nDuring handling of the above exception, another exception occurred:\n\nself \u003d \u003ctest.unit.common.middleware.test_slo.TestSloHeadOldManifest testMethod\u003dtest_etag_is_hash_of_segment_etags\u003e\n\n    def test_etag_is_hash_of_segment_etags(self):\n        req \u003d Request.blank(\n            \u0027/v1/AUTH_test/headtest/man\u0027,\n            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})\n\u003e       status, headers, body \u003d self.call_slo(req)\n\ntest_slo.py:1908: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \ntest_slo.py:94: in call_slo\n    return self.call_app(req, app\u003dself.slo, **kwargs)\ntest_slo.py:85: in call_app\n    body_iter \u003d app(req.environ, start_response)\n../../../../swift/common/middleware/slo.py:1711: in __call__\n    return self.handle_multipart_get_or_head(req, start_response)\n../../../../swift/common/middleware/slo.py:1154: in handle_multipart_get_or_head\n    return SloGetContext(self).handle_slo_get_or_head(req, start_response)\n../../../../swift/common/middleware/slo.py:861: in handle_slo_get_or_head\n    resp_iter \u003d self._app_call(get_req.environ)\n../../../../swift/common/wsgi.py:1126: in _app_call\n    resp \u003d self.app(env, self._start_response)\n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nself \u003d \u003ctest.unit.common.middleware.helpers.FakeSwift object at 0x110d81fd0\u003e\nenv \u003d {\u0027HTTP_HOST\u0027: \u0027localhost:80\u0027, \u0027HTTP_USER_AGENT\u0027: \u0027Mozzarella Foxfire SLO MultipartGET\u0027, \u0027PATH_INFO\u0027: \u0027/v1/AUTH_test/headtest/man\u0027, \u0027QUERY_STRING\u0027: \u0027\u0027, ...}\nstart_response \u003d \u003cbound method WSGIContext._start_response of \u003cswift.common.middleware.slo.SloGetContext object at 0x110dac520\u003e\u003e\n\n    def __call__(self, env, start_response):\n        if self.can_ignore_range:\n            # we might pop off the Range header\n            env \u003d dict(env)\n        method \u003d env[\u0027REQUEST_METHOD\u0027]\n        if method not in self.ALLOWED_METHODS:\n            raise HTTPNotImplemented()\n    \n        path \u003d env[\u0027PATH_INFO\u0027]\n        _, acc, cont, obj \u003d split_path(env[\u0027PATH_INFO\u0027], 0, 4,\n                                       rest_with_last\u003dTrue)\n        if env.get(\u0027QUERY_STRING\u0027):\n            path +\u003d \u0027?\u0027 + env[\u0027QUERY_STRING\u0027]\n        path \u003d normalize_path(path)\n    \n        if \u0027swift.authorize\u0027 in env:\n            resp \u003d env[\u0027swift.authorize\u0027](swob.Request(env))\n            if resp:\n                return resp(env, start_response)\n    \n        req \u003d swob.Request(env)\n        self.swift_sources.append(env.get(\u0027swift.source\u0027))\n        self.txn_ids.append(env.get(\u0027swift.trans_id\u0027))\n    \n        try:\n            resp_class, raw_headers, body \u003d self._find_response(method, path)\n            headers \u003d HeaderKeyDict(raw_headers)\n        except KeyError:\n            if (env.get(\u0027QUERY_STRING\u0027)\n                    and (method, env[\u0027PATH_INFO\u0027]) in self._responses):\n                resp_class, raw_headers, body \u003d self._find_response(\n                    method, env[\u0027PATH_INFO\u0027])\n                headers \u003d HeaderKeyDict(raw_headers)\n            elif method \u003d\u003d \u0027HEAD\u0027 and (\u0027GET\u0027, path) in self._responses:\n                resp_class, raw_headers, body \u003d self._find_response(\n                    \u0027GET\u0027, path)\n                body \u003d None\n                headers \u003d HeaderKeyDict(raw_headers)\n            elif method \u003d\u003d \u0027GET\u0027 and obj and path in self.uploaded:\n                resp_class \u003d swob.HTTPOk\n                headers, body \u003d self.uploaded[path]\n            else:\n\u003e               raise KeyError(\"Didn\u0027t find %r in allowed responses\" % (\n                    (method, path),))\nE               KeyError: \"Didn\u0027t find (\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027) in allowed responses\"\n\nhelpers.py:160: KeyError\n```","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":1912,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":1913,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"    def test_head_manifest_with_multipart_manifest_param(self):"},{"line_number":1916,"context_line":"        req \u003d Request.blank("},{"line_number":1917,"context_line":"            \u0027/v1/AUTH_test/headtest/man?mulitpart-manifest\u003dget\u0027,"},{"line_number":1918,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":3,"id":"4845c910_20367243","line":1915,"updated":"2023-07-27 15:59:13.000000000","message":"it would be helpful if this test was right next to a similar test that shows the same request/params works with method GET and has all the same assertions about headers and the only difference of course the body of the HEAD response would be empty - which is the definition of GET vs HEAD (same headers, no body)","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":1913,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"    def test_head_manifest_with_multipart_manifest_param(self):"},{"line_number":1916,"context_line":"        req \u003d Request.blank("},{"line_number":1917,"context_line":"            \u0027/v1/AUTH_test/headtest/man?mulitpart-manifest\u003dget\u0027,"},{"line_number":1918,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":3,"id":"0d20e873_48ebe4bd","line":1915,"in_reply_to":"4845c910_20367243","updated":"2023-08-17 15:33:25.000000000","message":"This method is under class TestSloHeadOldManifest","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":false,"context_lines":[{"line_number":1912,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":1913,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"    def test_head_manifest_with_multipart_manifest_param(self):"},{"line_number":1916,"context_line":"        req \u003d Request.blank("},{"line_number":1917,"context_line":"            \u0027/v1/AUTH_test/headtest/man?mulitpart-manifest\u003dget\u0027,"},{"line_number":1918,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":3,"id":"3b086230_28ca9c2d","line":1915,"in_reply_to":"4845c910_20367243","updated":"2023-08-02 21:53:53.000000000","message":"nvm","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":2084,"context_line":""},{"line_number":2085,"context_line":"        request_head \u003d Request.blank("},{"line_number":2086,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc\u0027"},{"line_number":2087,"context_line":"            \u0027?multipart-manifest\u003dget\u0026format\u003draw\u0027,"},{"line_number":2088,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027,"},{"line_number":2089,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2090,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"c1a7f7ed_9c3390fe","line":2087,"updated":"2023-07-27 15:59:13.000000000","message":"this is useful and a distinct query param from the other tests - good thinking to add it; I think it\u0027s perfectly reasonable to extend this request/resp test to include same params for HEAD - any test that does a GET with params should be able to do a HEAD with the same params.","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":2084,"context_line":""},{"line_number":2085,"context_line":"        request_head \u003d Request.blank("},{"line_number":2086,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc\u0027"},{"line_number":2087,"context_line":"            \u0027?multipart-manifest\u003dget\u0026format\u003draw\u0027,"},{"line_number":2088,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027,"},{"line_number":2089,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2090,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3167b02a_46d21d18","line":2087,"in_reply_to":"c1a7f7ed_9c3390fe","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":2084,"context_line":""},{"line_number":2085,"context_line":"        request_head \u003d Request.blank("},{"line_number":2086,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc\u0027"},{"line_number":2087,"context_line":"            \u0027?multipart-manifest\u003dget\u0026format\u003draw\u0027,"},{"line_number":2088,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027,"},{"line_number":2089,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2090,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"babaa6e0_967cbd17","line":2087,"in_reply_to":"c1a7f7ed_9c3390fe","updated":"2023-08-11 23:06:47.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"9e005fc15a1922737eb0a63f1ad4aee3b89c5076","unresolved":true,"context_lines":[{"line_number":2088,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027,"},{"line_number":2089,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2090,"context_line":""},{"line_number":2091,"context_line":"        status, headers, body \u003d self.call_slo(request_head)"},{"line_number":2092,"context_line":""},{"line_number":2093,"context_line":"    def test_get_raw_manifest_passthrough_with_ranges(self):"},{"line_number":2094,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"27433da4_a4a6f7bd","line":2091,"updated":"2023-07-27 15:59:13.000000000","message":"we\u0027re probably missing some assertions on these results.  They should be the same headers we assert on the GET response.","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":2088,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027,"},{"line_number":2089,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2090,"context_line":""},{"line_number":2091,"context_line":"        status, headers, body \u003d self.call_slo(request_head)"},{"line_number":2092,"context_line":""},{"line_number":2093,"context_line":"    def test_get_raw_manifest_passthrough_with_ranges(self):"},{"line_number":2094,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"57c90f47_892fd68a","line":2091,"in_reply_to":"27433da4_a4a6f7bd","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":false,"context_lines":[{"line_number":2088,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027,"},{"line_number":2089,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2090,"context_line":""},{"line_number":2091,"context_line":"        status, headers, body \u003d self.call_slo(request_head)"},{"line_number":2092,"context_line":""},{"line_number":2093,"context_line":"    def test_get_raw_manifest_passthrough_with_ranges(self):"},{"line_number":2094,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"358dabb4_f739ff67","line":2091,"in_reply_to":"27433da4_a4a6f7bd","updated":"2023-07-31 19:29:04.000000000","message":"Done","commit_id":"b2fb5c90303d8376c3b2b36fe4d53aa3d76b6677"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":true,"context_lines":[{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":"        self.app.register("},{"line_number":1897,"context_line":"            \u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1898,"context_line":"            swob.HTTPOk, manifest_headers, body\u003dNone)"},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"},{"line_number":1901,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":5,"id":"dbb98c38_0c43a208","line":1898,"updated":"2023-07-31 19:29:04.000000000","message":"i think this looks strange, given the context of the change I\u0027d expect the same registered response to be uesd for HEAD requests as you setup for GET requests even w/o this new register call.","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":"        self.app.register("},{"line_number":1897,"context_line":"            \u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1898,"context_line":"            swob.HTTPOk, manifest_headers, body\u003dNone)"},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"},{"line_number":1901,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":5,"id":"8163008f_32714d7c","line":1898,"in_reply_to":"dbb98c38_0c43a208","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":1895,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1896,"context_line":"        self.app.register("},{"line_number":1897,"context_line":"            \u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":1898,"context_line":"            swob.HTTPOk, manifest_headers, body\u003dNone)"},{"line_number":1899,"context_line":""},{"line_number":1900,"context_line":"    def test_etag_is_hash_of_segment_etags(self):"},{"line_number":1901,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":5,"id":"3d219ac8_f620229c","line":1898,"in_reply_to":"dbb98c38_0c43a208","updated":"2023-08-11 23:06:47.000000000","message":"this extra registerd HEAD got pulled out","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bf1291e34b0b85390bdd27f08ecb5906a01f73f","unresolved":true,"context_lines":[{"line_number":2094,"context_line":"        status, headers, body \u003d self.call_slo(request_head)"},{"line_number":2095,"context_line":""},{"line_number":2096,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":2097,"context_line":"        self.assertTrue((\u0027Etag\u0027, expected_etag) in headers, headers)"},{"line_number":2098,"context_line":"        self.assertTrue((\u0027X-Static-Large-Object\u0027, \u0027true\u0027) in headers, headers)"},{"line_number":2099,"context_line":"        self.assertEqual(body, b\u0027\u0027)  # it\u0027s a HEAD request, after all"},{"line_number":2100,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"0ec73c0a_742c1582","line":2097,"updated":"2023-07-31 19:29:04.000000000","message":"it\u0027s curious that this is failing:\n\n\u003e       self.assertTrue((\u0027Etag\u0027, expected_etag) in headers, headers)\nE       AssertionError: False is not true : [(\u0027Content-Type\u0027, \u0027text/plain\u0027), (\u0027X-Static-Large-Object\u0027, \u0027true\u0027), (\u0027X-Object-Meta-Plant\u0027, \u0027Ficus\u0027), (\u0027Etag\u0027, \u0027d751713988987e9331980363e24189ce\u0027)]","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":2094,"context_line":"        status, headers, body \u003d self.call_slo(request_head)"},{"line_number":2095,"context_line":""},{"line_number":2096,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":2097,"context_line":"        self.assertTrue((\u0027Etag\u0027, expected_etag) in headers, headers)"},{"line_number":2098,"context_line":"        self.assertTrue((\u0027X-Static-Large-Object\u0027, \u0027true\u0027) in headers, headers)"},{"line_number":2099,"context_line":"        self.assertEqual(body, b\u0027\u0027)  # it\u0027s a HEAD request, after all"},{"line_number":2100,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"20e2d9ab_087bc5eb","line":2097,"in_reply_to":"0ec73c0a_742c1582","updated":"2023-08-11 23:06:47.000000000","message":"it was because of the lp bug https://bugs.launchpad.net/swift/+bug/2029174","commit_id":"22ea7ccefba330d38b0dfde8b81e8adcc8b5bf52"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"    def test_head_manifest_with_multipart_manifest_param(self):"},{"line_number":1916,"context_line":"        req \u003d Request.blank("},{"line_number":1917,"context_line":"            \u0027/v1/AUTH_test/headtest/man?mulitpart-manifest\u003dget\u0027,"},{"line_number":1918,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"},{"line_number":1919,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":1920,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"915d0ff7_903dc441","line":1917,"range":{"start_line":1917,"start_character":43,"end_line":1917,"end_character":45},"updated":"2023-08-07 19:21:11.000000000","message":"`multipart`, surely?","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"    def test_head_manifest_with_multipart_manifest_param(self):"},{"line_number":1916,"context_line":"        req \u003d Request.blank("},{"line_number":1917,"context_line":"            \u0027/v1/AUTH_test/headtest/man?mulitpart-manifest\u003dget\u0027,"},{"line_number":1918,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"},{"line_number":1919,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":1920,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"034a5479_ff3978f9","line":1917,"range":{"start_line":1917,"start_character":43,"end_line":1917,"end_character":45},"in_reply_to":"915d0ff7_903dc441","updated":"2023-08-17 15:33:25.000000000","message":"Ah good catch, no wonder it still gave us a 200 since we are tryin to pop query params off and since i never updated the response headers the tests still passed since it was making a HEAD request on the object","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"    def test_head_manifest_with_multipart_manifest_param(self):"},{"line_number":1916,"context_line":"        req \u003d Request.blank("},{"line_number":1917,"context_line":"            \u0027/v1/AUTH_test/headtest/man?mulitpart-manifest\u003dget\u0027,"},{"line_number":1918,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"},{"line_number":1919,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":1920,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"c159a11f_5bd90749","line":1917,"range":{"start_line":1917,"start_character":43,"end_line":1917,"end_character":45},"in_reply_to":"915d0ff7_903dc441","updated":"2023-08-11 23:06:47.000000000","message":"well spotted.  #fixed","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":1919,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1922,"context_line":"        self.assertIn((\u0027Etag\u0027, \u0027\"%s\"\u0027 % self.slo_etag), headers)"},{"line_number":1923,"context_line":"        self.assertIn((\u0027X-Manifest-Etag\u0027, self.manifest_json_etag), headers)"},{"line_number":1924,"context_line":"        self.assertIn((\u0027Content-Length\u0027, \u0027300\u0027), headers)"},{"line_number":1925,"context_line":"        self.assertIn((\u0027Content-Type\u0027, \u0027test/data\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3a8bd350_fa4173b0","line":1922,"updated":"2023-08-07 19:21:11.000000000","message":"This seems wrong to me -- I was expecting\n```\nself.assertIn((\u0027Etag\u0027, self.manifest_json_etag), headers)\n```\nAh! See above...","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":1919,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1922,"context_line":"        self.assertIn((\u0027Etag\u0027, \u0027\"%s\"\u0027 % self.slo_etag), headers)"},{"line_number":1923,"context_line":"        self.assertIn((\u0027X-Manifest-Etag\u0027, self.manifest_json_etag), headers)"},{"line_number":1924,"context_line":"        self.assertIn((\u0027Content-Length\u0027, \u0027300\u0027), headers)"},{"line_number":1925,"context_line":"        self.assertIn((\u0027Content-Type\u0027, \u0027test/data\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":16,"id":"262097bd_880ce9cd","line":1922,"in_reply_to":"3a8bd350_fa4173b0","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":false,"context_lines":[{"line_number":1919,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":1920,"context_line":""},{"line_number":1921,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":1922,"context_line":"        self.assertIn((\u0027Etag\u0027, \u0027\"%s\"\u0027 % self.slo_etag), headers)"},{"line_number":1923,"context_line":"        self.assertIn((\u0027X-Manifest-Etag\u0027, self.manifest_json_etag), headers)"},{"line_number":1924,"context_line":"        self.assertIn((\u0027Content-Length\u0027, \u0027300\u0027), headers)"},{"line_number":1925,"context_line":"        self.assertIn((\u0027Content-Type\u0027, \u0027test/data\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":16,"id":"b0e7e74e_87fa3529","line":1922,"in_reply_to":"3a8bd350_fa4173b0","updated":"2023-08-11 23:06:47.000000000","message":"not sure why gerrit didn\u0027t point out this was fixed:\n\nhttps://review.opendev.org/c/openstack/swift/+/889785/20/test/unit/common/middleware/test_slo.py#1922","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":2056,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc\u0027"},{"line_number":2057,"context_line":"            \u0027?multipart-manifest\u003dget\u0026format\u003draw\u0027,"},{"line_number":2058,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":2059,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2060,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":2061,"context_line":""},{"line_number":2062,"context_line":"        expected_body \u003d json.dumps(["}],"source_content_type":"text/x-python","patch_set":20,"id":"9a1ced07_aa317222","line":2059,"updated":"2023-08-11 23:06:47.000000000","message":"a previous version of this change added a HEAD request with these same query params, I think this is the case that causes a real 500 on Swift master?\n\nYou could add the request here and assert the body which triggers the 500 and reference to the lp bug, prove that this test infra would have some real utility catching bugs.","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[{"line_number":2056,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc\u0027"},{"line_number":2057,"context_line":"            \u0027?multipart-manifest\u003dget\u0026format\u003draw\u0027,"},{"line_number":2058,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":2059,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"},{"line_number":2060,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":2061,"context_line":""},{"line_number":2062,"context_line":"        expected_body \u003d json.dumps(["}],"source_content_type":"text/x-python","patch_set":20,"id":"0500a36a_2cd11c80","line":2059,"in_reply_to":"9a1ced07_aa317222","updated":"2023-08-18 14:44:20.000000000","message":"unrelated: https://bugs.launchpad.net/bugs/2029174","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[{"line_number":1934,"context_line":"        self.assertEqual(body, b\u0027\u0027)  # it\u0027s a HEAD request, after all"},{"line_number":1935,"context_line":""},{"line_number":1936,"context_line":"        expected_app_calls \u003d [("},{"line_number":1937,"context_line":"            \u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man?multipart-manifest\u003dget\u0027)]"},{"line_number":1938,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":1939,"context_line":""},{"line_number":1940,"context_line":"    def test_if_none_match_etag_matching(self):"}],"source_content_type":"text/x-python","patch_set":30,"id":"dc1f323f_2dfd5d5e","line":1937,"updated":"2023-08-18 14:44:20.000000000","message":"oh, this test is neat!\n\nSince it was a HEAD w/ multipart-manifest\u003dget even legacy manifest doesn\u0027t have to be refetched (we just return the manifest ETag)\n\nI think this test actually fails w/o this change and having to register a custom HEAD response leaves room for test bugs if we only update metadata in setUp","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[{"line_number":1950,"context_line":""},{"line_number":1951,"context_line":"        expected_app_calls \u003d [(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)]"},{"line_number":1952,"context_line":"        if not self.manifest_has_sysmeta:"},{"line_number":1953,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":1954,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":1955,"context_line":""},{"line_number":1956,"context_line":"    def test_if_match_etag_not_matching(self):"}],"source_content_type":"text/x-python","patch_set":30,"id":"b8061c77_3e573e57","line":1953,"updated":"2023-08-18 14:44:20.000000000","message":"boom, extra GET request to parse manifest for registered response w/ only legacy headers","commit_id":"dab7192e1ed13ee8cf62970762cbb78edbd4ed17"}],"test/unit/common/middleware/test_symlink.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":423,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":424,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":425,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":426,"context_line":"        self.assertIn((\u0027X-Symlink-Target-Account\u0027, \u0027a2\u0027), headers)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    def test_get_symlink_not_found(self):"},{"line_number":429,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPNotFound, {})"}],"source_content_type":"text/x-python","patch_set":9,"id":"5cbe5a87_2e6694dd","line":426,"updated":"2023-08-02 21:53:53.000000000","message":"this is perfect, FWIW the body of the GET response is also empty","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":423,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":424,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":425,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":426,"context_line":"        self.assertIn((\u0027X-Symlink-Target-Account\u0027, \u0027a2\u0027), headers)"},{"line_number":427,"context_line":""},{"line_number":428,"context_line":"    def test_get_symlink_not_found(self):"},{"line_number":429,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPNotFound, {})"}],"source_content_type":"text/x-python","patch_set":9,"id":"1c418467_15ea5ba8","line":426,"in_reply_to":"5cbe5a87_2e6694dd","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":581,"context_line":"                         self.app._calls[-1].headers[\u0027Content-Type\u0027])"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    def test_head_symlink(self):"},{"line_number":584,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"},{"line_number":585,"context_line":"                          {\u0027X-Object-Sysmeta-Symlink-Target\u0027: \u0027c1/o\u0027,"},{"line_number":586,"context_line":"                           \u0027X-Object-Meta-Color\u0027: \u0027Red\u0027})"},{"line_number":587,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"476beb7c_537da711","line":584,"updated":"2023-08-02 21:53:53.000000000","message":"maybe it\u0027s good practice to register GETs even if application code is going to send HEADs since FakeSwift will find it, but I\u0027m not sure changing this test is worth it - there\u0027s better examples of registered GETs that do GETs with query params and should be able to do HEADs w/ query-param after this change.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":581,"context_line":"                         self.app._calls[-1].headers[\u0027Content-Type\u0027])"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    def test_head_symlink(self):"},{"line_number":584,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"},{"line_number":585,"context_line":"                          {\u0027X-Object-Sysmeta-Symlink-Target\u0027: \u0027c1/o\u0027,"},{"line_number":586,"context_line":"                           \u0027X-Object-Meta-Color\u0027: \u0027Red\u0027})"},{"line_number":587,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"98e91052_d5ce5653","line":584,"in_reply_to":"184aaf04_0f650dbd","updated":"2023-08-11 23:06:47.000000000","message":"clay \u003e I\u0027m not sure changing this test is worth it\n\nal \u003e no reason not to register HEADs when that is what we expect\n\ntim \u003e looks like there is some consensus\n\nash, please pull out this part of the diff.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":581,"context_line":"                         self.app._calls[-1].headers[\u0027Content-Type\u0027])"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    def test_head_symlink(self):"},{"line_number":584,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"},{"line_number":585,"context_line":"                          {\u0027X-Object-Sysmeta-Symlink-Target\u0027: \u0027c1/o\u0027,"},{"line_number":586,"context_line":"                           \u0027X-Object-Meta-Color\u0027: \u0027Red\u0027})"},{"line_number":587,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"4a999bd3_2a31ea56","line":584,"in_reply_to":"476beb7c_537da711","updated":"2023-08-04 15:50:31.000000000","message":"I\u0027m of the opinion that it would be better practice to register the expected method and (a) not assume anything magical about FakeSwift nor (b) make future me double-take when I read the test.\n\nIt\u0027s great that FakeSwift will fallback to looking for a GET in order to handle a HEAD, but there\u0027s no reason not to register HEADs when that is what we expect.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":581,"context_line":"                         self.app._calls[-1].headers[\u0027Content-Type\u0027])"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    def test_head_symlink(self):"},{"line_number":584,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"},{"line_number":585,"context_line":"                          {\u0027X-Object-Sysmeta-Symlink-Target\u0027: \u0027c1/o\u0027,"},{"line_number":586,"context_line":"                           \u0027X-Object-Meta-Color\u0027: \u0027Red\u0027})"},{"line_number":587,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"2aaa2be8_50bb0913","line":584,"in_reply_to":"4a999bd3_2a31ea56","updated":"2023-08-17 15:33:25.000000000","message":"Ack","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":581,"context_line":"                         self.app._calls[-1].headers[\u0027Content-Type\u0027])"},{"line_number":582,"context_line":""},{"line_number":583,"context_line":"    def test_head_symlink(self):"},{"line_number":584,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"},{"line_number":585,"context_line":"                          {\u0027X-Object-Sysmeta-Symlink-Target\u0027: \u0027c1/o\u0027,"},{"line_number":586,"context_line":"                           \u0027X-Object-Meta-Color\u0027: \u0027Red\u0027})"},{"line_number":587,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"184aaf04_0f650dbd","line":584,"in_reply_to":"4a999bd3_2a31ea56","updated":"2023-08-07 19:21:11.000000000","message":"Agreed -- looks like there **is** some consensus around this, at least.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"5bef8fed663e8b04f603e89f1db0c5f0323e96b6","unresolved":true,"context_lines":[{"line_number":592,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":593,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027GET\u0027)"},{"line_number":596,"context_line":"        status, headers, body \u003d self.call_sym(req)"},{"line_number":597,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":598,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"08c7e055_c0016009","line":595,"updated":"2023-08-02 21:53:53.000000000","message":"N.B. a GET request won\u0027t select a registered HEAD response","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":592,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":593,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027GET\u0027)"},{"line_number":596,"context_line":"        status, headers, body \u003d self.call_sym(req)"},{"line_number":597,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":598,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"f599f463_056cf83a","line":595,"in_reply_to":"08c7e055_c0016009","updated":"2023-08-04 15:50:31.000000000","message":"should this be a new test_get_symlink_with_query_string? I may be missing some context but how does this GET relate to HEADs?","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6d126173b059488f74e9a4c1af7f3160e9379a6b","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":593,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027GET\u0027)"},{"line_number":596,"context_line":"        status, headers, body \u003d self.call_sym(req)"},{"line_number":597,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":598,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"837673d6_b9b2ce8c","line":595,"in_reply_to":"65691889_151aa0f1","updated":"2023-08-17 15:51:19.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":593,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027GET\u0027)"},{"line_number":596,"context_line":"        status, headers, body \u003d self.call_sym(req)"},{"line_number":597,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":598,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"211128a9_9345ee0d","line":595,"in_reply_to":"f599f463_056cf83a","updated":"2023-08-17 15:33:25.000000000","message":"Done","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":true,"context_lines":[{"line_number":592,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":593,"context_line":"        self.assertEqual(body, b\u0027\u0027)"},{"line_number":594,"context_line":""},{"line_number":595,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/symlink?symlink\u003dget\u0027, method\u003d\u0027GET\u0027)"},{"line_number":596,"context_line":"        status, headers, body \u003d self.call_sym(req)"},{"line_number":597,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":598,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"}],"source_content_type":"text/x-python","patch_set":9,"id":"65691889_151aa0f1","line":595,"in_reply_to":"f599f463_056cf83a","updated":"2023-08-17 15:33:25.000000000","message":"It was an attempt to demonstrate how registering the method without the query string is sufficient for issuing a request to Swift with a query param for the same method, but your suggestion of moving it under a new unit-test is apt.","commit_id":"8f80a8471ba648b3dad716b7377c43d2440f9f13"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"2a25d8a41d8d48b1376d4dfa1402f36ee902778e","unresolved":true,"context_lines":[{"line_number":427,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":428,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":429,"context_line":"        self.assertNotIn(\u0027X-Symlink-Target-Account\u0027, dict(headers))"},{"line_number":430,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_get_symlink_not_found(self):"},{"line_number":433,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPNotFound, {})"}],"source_content_type":"text/x-python","patch_set":16,"id":"714a605b_ccd1f63b","line":430,"updated":"2023-08-07 19:21:11.000000000","message":"This new metadata is the only difference from `test_get_symlink`, yeah? Was the ability to get that passed through really in question?","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":427,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":428,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":429,"context_line":"        self.assertNotIn(\u0027X-Symlink-Target-Account\u0027, dict(headers))"},{"line_number":430,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_get_symlink_not_found(self):"},{"line_number":433,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPNotFound, {})"}],"source_content_type":"text/x-python","patch_set":16,"id":"1e5069fd_f43ced98","line":430,"in_reply_to":"714a605b_ccd1f63b","updated":"2023-08-11 23:06:47.000000000","message":"\u003e This new metadata is the only difference from test_get_symlink, yeah? \n\nwell,  test_get_symlink only does a `?symlink\u003dget`, but I don\u0027t actually know if we pass through the symlink metadata with the target response - we could update test_get_target_object\n\nhttps://review.opendev.org/c/openstack/swift/+/891242\n\nAdding this test looks weird regardless tho because we register a GET and do a GET with a query param - that alreayd worked on master.","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":428,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":429,"context_line":"        self.assertNotIn(\u0027X-Symlink-Target-Account\u0027, dict(headers))"},{"line_number":430,"context_line":"        self.assertIn((\u0027X-Object-Meta-Color\u0027, \u0027Red\u0027), headers)"},{"line_number":431,"context_line":""},{"line_number":432,"context_line":"    def test_get_symlink_not_found(self):"},{"line_number":433,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPNotFound, {})"}],"source_content_type":"text/x-python","patch_set":16,"id":"6c29a03d_b1014713","line":430,"in_reply_to":"714a605b_ccd1f63b","updated":"2023-08-17 15:33:25.000000000","message":"I followed Alistair\u0027s feedback on trying to separate it into a new test since patchset 9 had it included in the test_head_symlink","commit_id":"48e331bb16e0e0db801aaa830cc72b83890eda55"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":406,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":407,"context_line":"        self.assertIsInstance(headers, list)"},{"line_number":408,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":409,"context_line":"        self.assertNotIn(\u0027X-Symlink-Target-Account\u0027, dict(headers))"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_get_symlink_with_account(self):"},{"line_number":412,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"}],"source_content_type":"text/x-python","patch_set":20,"id":"e2bd97bc_a874ed54","line":409,"updated":"2023-08-11 23:06:47.000000000","message":"is there some reason we can\u0027t just repeat these asserts on a `Request.blank(method\u003d\u0027HEAD\u0027)`","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"11e1253a5eacc780d9b70180b1be9ed96b83b250","unresolved":false,"context_lines":[{"line_number":406,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":407,"context_line":"        self.assertIsInstance(headers, list)"},{"line_number":408,"context_line":"        self.assertIn((\u0027X-Symlink-Target\u0027, \u0027c1/o\u0027), headers)"},{"line_number":409,"context_line":"        self.assertNotIn(\u0027X-Symlink-Target-Account\u0027, dict(headers))"},{"line_number":410,"context_line":""},{"line_number":411,"context_line":"    def test_get_symlink_with_account(self):"},{"line_number":412,"context_line":"        self.app.register(\u0027GET\u0027, \u0027/v1/a/c/symlink\u0027, swob.HTTPOk,"}],"source_content_type":"text/x-python","patch_set":20,"id":"53dc3a75_ab01ab51","line":409,"in_reply_to":"e2bd97bc_a874ed54","updated":"2023-08-18 14:44:20.000000000","message":"Done","commit_id":"84784d19c19c187231ad3e6ef37ef5a512507aec"}],"test/unit/common/middleware/test_versioned_writes.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"e6640278ca2ac8efcbd9192fecaee927bdc87bc3","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        self.assertEqual(len(self.authorized), 1)"},{"line_number":310,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        self.app.register(\u0027HEAD\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk, {}, None)"},{"line_number":313,"context_line":"        req \u003d Request.blank("},{"line_number":314,"context_line":"            \u0027/v1/a/c/o\u0027,"},{"line_number":315,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":12,"id":"5b67cb21_ff38b7af","side":"PARENT","line":312,"updated":"2023-08-04 15:50:31.000000000","message":"ok, this was never absolutely necessary, but wasn\u0027t unhelpful, and possibly spared future me going to read the FakeSwift implementation to understand that it maps HEADs to GETs.","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"4b65e3cfa85efd30d966dbc2cd3979aa83437bcc","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        self.assertEqual(len(self.authorized), 1)"},{"line_number":310,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        self.app.register(\u0027HEAD\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk, {}, None)"},{"line_number":313,"context_line":"        req \u003d Request.blank("},{"line_number":314,"context_line":"            \u0027/v1/a/c/o\u0027,"},{"line_number":315,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":12,"id":"85fd5845_c9943160","side":"PARENT","line":312,"in_reply_to":"5b67cb21_ff38b7af","updated":"2023-08-17 15:33:25.000000000","message":"Ack, yes it was my way of suggesting how registering a HEAD request isn\u0027t necessary if GETS already are for FakeSwift tests since now we have a fallback mechanism for all kinds of HEAD requests (more importantly the one with query params)","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"8496fd3653ddee61411ffe8216bd7048a3302c56","unresolved":true,"context_lines":[{"line_number":309,"context_line":"        self.assertEqual(len(self.authorized), 1)"},{"line_number":310,"context_line":"        self.assertRequestEqual(req, self.authorized[0])"},{"line_number":311,"context_line":""},{"line_number":312,"context_line":"        self.app.register(\u0027HEAD\u0027, \u0027/v1/a/c/o\u0027, swob.HTTPOk, {}, None)"},{"line_number":313,"context_line":"        req \u003d Request.blank("},{"line_number":314,"context_line":"            \u0027/v1/a/c/o\u0027,"},{"line_number":315,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":12,"id":"b69fc0aa_c8419ecc","side":"PARENT","line":312,"in_reply_to":"5b67cb21_ff38b7af","updated":"2023-08-11 23:06:47.000000000","message":"I agree, seems unrelated to demonstrating the new test infra change, we could have already removed this on master if we wanted to do that.  Having a diff that\u0027s unrelated to change at hand is just confusing to reviewers and slows things down.","commit_id":"8a5baf8e1316f39b169b3cb60cd243994f335a3b"}]}
