)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"401d66f07ed6a584d8ad4c00925ede8e3365598c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"7aea62cd_4fe1ca1d","updated":"2024-06-13 04:00:39.000000000","message":"Great work everyone, This is looking really awesome!\n\nRemember -1 is not a bad thing. Just means a bit more work. In this case it\u0027s basically for a new \"api\" for account-qoutas but it isn\u0027t reflected in the documentation 😊","commit_id":"96010b6ffc2f7c29c6ed415d9501444adcef359e"},{"author":{"_account_id":37027,"name":"Mohammed Al-Jawaheri","email":"mjawaheri02@gmail.com","username":"mjawaheri"},"change_message_id":"d3f689ab76c52af2667d797aad45b4ed9b18acb9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"8d68806c_b1712091","updated":"2024-06-12 11:56:24.000000000","message":"recheck","commit_id":"96010b6ffc2f7c29c6ed415d9501444adcef359e"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ff982c462d4f992f46277fdd69df2bfda72c286","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e1898675_ff7e517e","updated":"2024-06-28 16:34:55.000000000","message":"I\u0027ll give Matt a chance to take another look, but this is looking pretty good to me. Thanks!","commit_id":"8ea892a41e2bc5615da9ff7df6a2ad85341484b3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"52fa1a9b74cf87e014d6e3f242740606094e19da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"fec3e00f_0f00cda3","updated":"2024-07-11 07:27:23.000000000","message":"Looking really great, just a test related problem, otherwise this is ready to land.","commit_id":"8ea892a41e2bc5615da9ff7df6a2ad85341484b3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"fdd48abf2a427c4f8f308c2768d56c741d0388b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"ed77dada_93c1ad67","updated":"2024-07-16 03:52:53.000000000","message":"Yup perfect! Thanks Daanish for fixing that up!\n\nAdding the +A based on Tim\u0027s earlier +2 and the minor change between this and the last patchset.","commit_id":"6105b38e65b00c23d373e17ad9f89e4243395165"}],"swift/common/middleware/account_quotas.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9710f6c16a3023ce088d44832cd6759c174851c","unresolved":true,"context_lines":[{"line_number":91,"context_line":"            for policy in POLICIES:"},{"line_number":92,"context_line":"                tail \u003d \u0027Account-Quota-Bytes-Policy-%s\u0027 % policy.name"},{"line_number":93,"context_line":"                if request.headers.get(\u0027X-Remove-\u0027 + tail):"},{"line_number":94,"context_line":"                    new_quotas[policy.idx] \u003d 0"},{"line_number":95,"context_line":"                else:"},{"line_number":96,"context_line":"                    quota \u003d request.headers.pop(\u0027X-\u0027 + tail, None)"},{"line_number":97,"context_line":"                    new_quotas[policy.idx] \u003d quota"}],"source_content_type":"text/x-python","patch_set":1,"id":"64440f51_3a25eb1a","side":"PARENT","line":94,"updated":"2024-06-10 21:46:23.000000000","message":"This is pre-existing, but I\u0027m surprised this doesn\u0027t get set to `-1` here...","commit_id":"1d5b1d746e027bb9509ad0e45cc0f2f50d28511f"},{"author":{"_account_id":37027,"name":"Mohammed Al-Jawaheri","email":"mjawaheri02@gmail.com","username":"mjawaheri"},"change_message_id":"d9b6085a411e5d6ecfa946312f89129b6c7606de","unresolved":true,"context_lines":[{"line_number":91,"context_line":"            for policy in POLICIES:"},{"line_number":92,"context_line":"                tail \u003d \u0027Account-Quota-Bytes-Policy-%s\u0027 % policy.name"},{"line_number":93,"context_line":"                if request.headers.get(\u0027X-Remove-\u0027 + tail):"},{"line_number":94,"context_line":"                    new_quotas[policy.idx] \u003d 0"},{"line_number":95,"context_line":"                else:"},{"line_number":96,"context_line":"                    quota \u003d request.headers.pop(\u0027X-\u0027 + tail, None)"},{"line_number":97,"context_line":"                    new_quotas[policy.idx] \u003d quota"}],"source_content_type":"text/x-python","patch_set":1,"id":"c4a37437_bf6f6b56","side":"PARENT","line":94,"in_reply_to":"64440f51_3a25eb1a","updated":"2024-06-11 14:42:21.000000000","message":"It is a bit unconventional. I tried checking out to master and changing it, testing seems to fail because apparently L100 expects that behavior because we\u0027re filtering against negatives, -1 would not pass ```quota and not quota.isdigit()```","commit_id":"1d5b1d746e027bb9509ad0e45cc0f2f50d28511f"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9710f6c16a3023ce088d44832cd6759c174851c","unresolved":true,"context_lines":[{"line_number":81,"context_line":"    def set_quota(self, request, quota_type):"},{"line_number":82,"context_line":"        new_quotas \u003d {}"},{"line_number":83,"context_line":"        new_quotas[None] \u003d request.headers.get("},{"line_number":84,"context_line":"            \u0027X-Account-Meta-%s\u0027 % quota_type)"},{"line_number":85,"context_line":"        if request.headers.get("},{"line_number":86,"context_line":"                \u0027X-Remove-Account-Meta-%s\u0027 % quota_type):"},{"line_number":87,"context_line":"            new_quotas[None] \u003d 0  # X-Remove dominates if both are present"}],"source_content_type":"text/x-python","patch_set":1,"id":"b6838777_491d1180","line":84,"range":{"start_line":84,"start_character":13,"end_line":84,"end_character":27},"updated":"2024-06-10 21:46:23.000000000","message":"I\u0027m torn about this, and I have to apologize in advance for the bit of a mess when dealing with a legacy code base.\n\nOn the one hand, this nicely mirrors the existing byte-quota mechanism, giving users some amount of consistency:\n\n| bytes header | object count header |\n| --- | --- |\n| `x-account-meta-quota-bytes` | `x-account-meta-quota-count` |\n| `x-account-quota-bytes-policy-\u003cname\u003e` | `x-account-quota-count-policy-\u003cname\u003e` |\n| `x-container-meta-quota-bytes` | `x-container-meta-quota-count` |\n\nOn the other hand, trying to claim a user-meta header for a new feature that should only be settable by resellers is risky: what if an ordinary user sets it prior to the operator upgrading? I suppose it ought to be reasonable to say that they\u0027re mainly harming *themselves* by doing that, though...\n\nFWIW, there was a bit of discussion/history about it when I added per-policy quotas over at https://review.opendev.org/c/openstack/swift/+/861282/4..6/swift/common/middleware/account_quotas.py#b103\n\nI think I\u0027m OK with this as is, but I might try to get some buy-in from other developers. If/when we transition to using `x-account-quota-bytes`, it\u0027ll be simple enough to handle `x-account-quota-count` at the same time.","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ff982c462d4f992f46277fdd69df2bfda72c286","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    def set_quota(self, request, quota_type):"},{"line_number":82,"context_line":"        new_quotas \u003d {}"},{"line_number":83,"context_line":"        new_quotas[None] \u003d request.headers.get("},{"line_number":84,"context_line":"            \u0027X-Account-Meta-%s\u0027 % quota_type)"},{"line_number":85,"context_line":"        if request.headers.get("},{"line_number":86,"context_line":"                \u0027X-Remove-Account-Meta-%s\u0027 % quota_type):"},{"line_number":87,"context_line":"            new_quotas[None] \u003d 0  # X-Remove dominates if both are present"}],"source_content_type":"text/x-python","patch_set":1,"id":"1850a17d_1ba17c54","line":84,"range":{"start_line":84,"start_character":13,"end_line":84,"end_character":27},"in_reply_to":"83082452_8a67b272","updated":"2024-06-28 16:34:55.000000000","message":"Sounds like a reasonable plan -- and if we don\u0027t land the follow-up before the next release, the extra set of headers wouldn\u0027t be *so* terrible.","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"401d66f07ed6a584d8ad4c00925ede8e3365598c","unresolved":true,"context_lines":[{"line_number":81,"context_line":"    def set_quota(self, request, quota_type):"},{"line_number":82,"context_line":"        new_quotas \u003d {}"},{"line_number":83,"context_line":"        new_quotas[None] \u003d request.headers.get("},{"line_number":84,"context_line":"            \u0027X-Account-Meta-%s\u0027 % quota_type)"},{"line_number":85,"context_line":"        if request.headers.get("},{"line_number":86,"context_line":"                \u0027X-Remove-Account-Meta-%s\u0027 % quota_type):"},{"line_number":87,"context_line":"            new_quotas[None] \u003d 0  # X-Remove dominates if both are present"}],"source_content_type":"text/x-python","patch_set":1,"id":"83082452_8a67b272","line":84,"range":{"start_line":84,"start_character":13,"end_line":84,"end_character":27},"in_reply_to":"b6838777_491d1180","updated":"2024-06-13 04:00:39.000000000","message":"Ha, oh yeah I forgot all about that discussion. Good thing you have a good memeory Tim.\n\nYeah it might be nice to extend the `x-account-qouta*` header namespace to start using sysmeta for quota-bytes and quota-count. That\u0027ll be kinda cool. Maybe start making use of `x-account-quota-{bytes,count}` and sysmeta for actual storage. Keep the old x-account-meta-quota-bytes but new location always trumps it.\n\nI\u0027m on the fence, this patch is looking pretty good. And as Tim said we could just move them both to x-account-quota-* later.. BUT then we have to support the legecy \"x-account-meta-quota-count\" for the forseeable future.\n\nHow about we finish off this patch (ie add some doc and add what quota type was exceeded in response). But before we cut a new release of swift, we have a follow up patch (could just chain it from this one now) that moves to the new namespace. And remove reference to x-account-meta-quota-count. That way it doesn\u0027t live long enough to be a supported api.\nWe \"could\" change it here, but might be a great learning experence! (2 patches for the cost of 1) 😊\n\nSo in the follow up patch make it so the supporting api is:\n\n        bytes header\t                    count header\n    x-account-meta-quota-bytes\n    x-account-quota-bytes                  x-account-quota-count \n    x-account-quota-bytes-policy-\u003cname\u003e    x-account-quota-count-policy-\u003cname\u003e\n\nWhere `x-account-quota-bytes` always trumps what\u0027s in `x-account-meta-quota-bytes`.\n\nWhat do you thing @timburke?","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9710f6c16a3023ce088d44832cd6759c174851c","unresolved":true,"context_lines":[{"line_number":105,"context_line":"                request.headers[hdr] \u003d quota"},{"line_number":106,"context_line":"        elif any(quota is not None for quota in new_quotas.values()):"},{"line_number":107,"context_line":"            # deny quota set for non-reseller"},{"line_number":108,"context_line":"            return HTTPForbidden()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def handle_account(self, request):"},{"line_number":111,"context_line":"        if request.method in (\"POST\", \"PUT\"):"}],"source_content_type":"text/x-python","patch_set":1,"id":"083180b1_9070c37e","line":108,"updated":"2024-06-10 21:46:23.000000000","message":"Looks like a solid refactor! 👍\n\nMight be better named something like `validate_and_translate_quotas`? *shrug*","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":37027,"name":"Mohammed Al-Jawaheri","email":"mjawaheri02@gmail.com","username":"mjawaheri"},"change_message_id":"d9b6085a411e5d6ecfa946312f89129b6c7606de","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                request.headers[hdr] \u003d quota"},{"line_number":106,"context_line":"        elif any(quota is not None for quota in new_quotas.values()):"},{"line_number":107,"context_line":"            # deny quota set for non-reseller"},{"line_number":108,"context_line":"            return HTTPForbidden()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def handle_account(self, request):"},{"line_number":111,"context_line":"        if request.method in (\"POST\", \"PUT\"):"}],"source_content_type":"text/x-python","patch_set":1,"id":"06988f03_ec9affa1","line":108,"in_reply_to":"083180b1_9070c37e","updated":"2024-06-11 14:42:21.000000000","message":"Done","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9710f6c16a3023ce088d44832cd6759c174851c","unresolved":true,"context_lines":[{"line_number":115,"context_line":"                return err"},{"line_number":116,"context_line":"            err \u003d self.set_quota(request, \"Quota-Count\")"},{"line_number":117,"context_line":"            if err:"},{"line_number":118,"context_line":"                return err"},{"line_number":119,"context_line":"        resp \u003d request.get_response(self.app)"},{"line_number":120,"context_line":"        # Non-resellers can\u0027t update quotas, but they *can* see them"},{"line_number":121,"context_line":"        for policy in POLICIES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"915f9556_c99a6287","line":118,"updated":"2024-06-10 21:46:23.000000000","message":"I wonder if it\u0027d be better to just `raise` the errors in `set_quota`; they [inherit from `Exception`](https://github.com/openstack/swift/blob/2.33.0/swift/common/swob.py#L1562) and will get caught and translated to a proper response in [the `wsgify` decorator](https://github.com/openstack/swift/blob/2.33.0/swift/common/swob.py#L1569-L1583).","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":37027,"name":"Mohammed Al-Jawaheri","email":"mjawaheri02@gmail.com","username":"mjawaheri"},"change_message_id":"d9b6085a411e5d6ecfa946312f89129b6c7606de","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                return err"},{"line_number":116,"context_line":"            err \u003d self.set_quota(request, \"Quota-Count\")"},{"line_number":117,"context_line":"            if err:"},{"line_number":118,"context_line":"                return err"},{"line_number":119,"context_line":"        resp \u003d request.get_response(self.app)"},{"line_number":120,"context_line":"        # Non-resellers can\u0027t update quotas, but they *can* see them"},{"line_number":121,"context_line":"        for policy in POLICIES:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3d90b6fa_d2d6f804","line":118,"in_reply_to":"915f9556_c99a6287","updated":"2024-06-11 14:42:21.000000000","message":"Done","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"a9710f6c16a3023ce088d44832cd6759c174851c","unresolved":true,"context_lines":[{"line_number":187,"context_line":"        if quota \u003e\u003d 0:"},{"line_number":188,"context_line":"            new_count \u003d int(account_info[\u0027total_object_count\u0027]) + 1"},{"line_number":189,"context_line":"            if quota \u003c new_count:"},{"line_number":190,"context_line":"                resp \u003d HTTPRequestEntityTooLarge(body\u003d\u0027Upload exceeds quota.\u0027)"},{"line_number":191,"context_line":"                if \u0027swift.authorize\u0027 in request.environ:"},{"line_number":192,"context_line":"                    orig_authorize \u003d request.environ[\u0027swift.authorize\u0027]"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"a8d0b024_9a491c31","line":190,"range":{"start_line":190,"start_character":55,"end_line":190,"end_character":76},"updated":"2024-06-10 21:46:23.000000000","message":"I had a thought that we might want to indicate which quota would be exceeded (bytes or object count) in the error message, but I see that we don\u0027t currently do that for container quotas. We can weigh that in some separate change that affects both account and container quotas.","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"6ff982c462d4f992f46277fdd69df2bfda72c286","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        if quota \u003e\u003d 0:"},{"line_number":188,"context_line":"            new_count \u003d int(account_info[\u0027total_object_count\u0027]) + 1"},{"line_number":189,"context_line":"            if quota \u003c new_count:"},{"line_number":190,"context_line":"                resp \u003d HTTPRequestEntityTooLarge(body\u003d\u0027Upload exceeds quota.\u0027)"},{"line_number":191,"context_line":"                if \u0027swift.authorize\u0027 in request.environ:"},{"line_number":192,"context_line":"                    orig_authorize \u003d request.environ[\u0027swift.authorize\u0027]"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fb1dadbf_0400fca5","line":190,"range":{"start_line":190,"start_character":55,"end_line":190,"end_character":76},"in_reply_to":"1714a02a_3d501c5a","updated":"2024-06-28 16:34:55.000000000","message":"Acknowledged","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":37027,"name":"Mohammed Al-Jawaheri","email":"mjawaheri02@gmail.com","username":"mjawaheri"},"change_message_id":"d9b6085a411e5d6ecfa946312f89129b6c7606de","unresolved":true,"context_lines":[{"line_number":187,"context_line":"        if quota \u003e\u003d 0:"},{"line_number":188,"context_line":"            new_count \u003d int(account_info[\u0027total_object_count\u0027]) + 1"},{"line_number":189,"context_line":"            if quota \u003c new_count:"},{"line_number":190,"context_line":"                resp \u003d HTTPRequestEntityTooLarge(body\u003d\u0027Upload exceeds quota.\u0027)"},{"line_number":191,"context_line":"                if \u0027swift.authorize\u0027 in request.environ:"},{"line_number":192,"context_line":"                    orig_authorize \u003d request.environ[\u0027swift.authorize\u0027]"},{"line_number":193,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1714a02a_3d501c5a","line":190,"range":{"start_line":190,"start_character":55,"end_line":190,"end_character":76},"in_reply_to":"a8d0b024_9a491c31","updated":"2024-06-11 14:42:21.000000000","message":"Agreed! we thought of this as well but we looked at the container quotas and they were same there, as you noticed, so we wanted to make sure we\u0027re consistent. I can change it now but it might make more sense in a change that affects both account and container quotas","commit_id":"90c12f8dd0693fab99dbd8a635b0eb2fb3420a45"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"401d66f07ed6a584d8ad4c00925ede8e3365598c","unresolved":true,"context_lines":[{"line_number":59,"context_line":"server doesn\u0027t know the final size of the currently uploaded object and the"},{"line_number":60,"context_line":"upload will be allowed if the current account size is within the quota."},{"line_number":61,"context_line":"Due to the eventual consistency further uploads might be possible until the"},{"line_number":62,"context_line":"account size has been updated."},{"line_number":63,"context_line":"\"\"\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"from swift.common.swob import HTTPForbidden, HTTPBadRequest, \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"79cb0d2d_78e91c69","line":62,"updated":"2024-06-13 04:00:39.000000000","message":"The docstring for this file actaully becomes the documentation found in the online swift docs. So this docstring needs to be updated to include information on quite-count.","commit_id":"96010b6ffc2f7c29c6ed415d9501444adcef359e"},{"author":{"_account_id":37040,"name":"Md Azmain Adib Pahlowan","display_name":"Azmain Adib","email":"adib1905@gmail.com","username":"aadib"},"change_message_id":"9b40ae63c8a38b984b4590a474982871c44dcb73","unresolved":false,"context_lines":[{"line_number":59,"context_line":"server doesn\u0027t know the final size of the currently uploaded object and the"},{"line_number":60,"context_line":"upload will be allowed if the current account size is within the quota."},{"line_number":61,"context_line":"Due to the eventual consistency further uploads might be possible until the"},{"line_number":62,"context_line":"account size has been updated."},{"line_number":63,"context_line":"\"\"\""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"from swift.common.swob import HTTPForbidden, HTTPBadRequest, \\"}],"source_content_type":"text/x-python","patch_set":2,"id":"39be7765_2b057623","line":62,"in_reply_to":"79cb0d2d_78e91c69","updated":"2024-06-26 19:28:29.000000000","message":"Done","commit_id":"96010b6ffc2f7c29c6ed415d9501444adcef359e"}],"test/unit/common/middleware/test_account_quotas.py":[{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"52fa1a9b74cf87e014d6e3f242740606094e19da","unresolved":true,"context_lines":[{"line_number":604,"context_line":"        app \u003d FakeAuthFilter(account_quotas.AccountQuotaMiddleware(self.app))"},{"line_number":605,"context_line":"        cache \u003d FakeCache(None)"},{"line_number":606,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":607,"context_line":"                            headers\u003d{\u0027x-auth-token\u0027: \u0027secret\u0027},"},{"line_number":608,"context_line":"                            environ\u003d{\u0027swift.cache\u0027: cache})"},{"line_number":609,"context_line":"        res \u003d req.get_response(app)"},{"line_number":610,"context_line":"        self.assertEqual(res.status_int, 413)"}],"source_content_type":"text/x-python","patch_set":3,"id":"95576e9d_e829656a","line":607,"range":{"start_line":607,"start_character":54,"end_line":607,"end_character":60},"updated":"2024-07-11 07:27:23.000000000","message":"Doens\u0027t this mean it is authorized?\n\nI assume this should be \u0027bad-secret\u0027.","commit_id":"8ea892a41e2bc5615da9ff7df6a2ad85341484b3"},{"author":{"_account_id":37085,"name":"Daanish Khan","display_name":"Daanish Khan","email":"daanishk@andrew.cmu.edu","username":"daanishk"},"change_message_id":"01f6d4a4c64a28cdd8ec7c83306d63d0013c48c4","unresolved":false,"context_lines":[{"line_number":604,"context_line":"        app \u003d FakeAuthFilter(account_quotas.AccountQuotaMiddleware(self.app))"},{"line_number":605,"context_line":"        cache \u003d FakeCache(None)"},{"line_number":606,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027, method\u003d\u0027PUT\u0027,"},{"line_number":607,"context_line":"                            headers\u003d{\u0027x-auth-token\u0027: \u0027secret\u0027},"},{"line_number":608,"context_line":"                            environ\u003d{\u0027swift.cache\u0027: cache})"},{"line_number":609,"context_line":"        res \u003d req.get_response(app)"},{"line_number":610,"context_line":"        self.assertEqual(res.status_int, 413)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bbe5ce67_c1c65f3e","line":607,"range":{"start_line":607,"start_character":54,"end_line":607,"end_character":60},"in_reply_to":"95576e9d_e829656a","updated":"2024-07-15 17:01:38.000000000","message":"Done","commit_id":"8ea892a41e2bc5615da9ff7df6a2ad85341484b3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"52fa1a9b74cf87e014d6e3f242740606094e19da","unresolved":true,"context_lines":[{"line_number":607,"context_line":"                            headers\u003d{\u0027x-auth-token\u0027: \u0027secret\u0027},"},{"line_number":608,"context_line":"                            environ\u003d{\u0027swift.cache\u0027: cache})"},{"line_number":609,"context_line":"        res \u003d req.get_response(app)"},{"line_number":610,"context_line":"        self.assertEqual(res.status_int, 413)"},{"line_number":611,"context_line":"        self.assertEqual(res.body, b\u0027Upload exceeds quota.\u0027)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"    def test_exceed_quota_count_authorized(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"0b7b5284_33cfff1a","line":610,"range":{"start_line":610,"start_character":41,"end_line":610,"end_character":45},"updated":"2024-07-11 07:27:23.000000000","message":"And on unauth would this still be a 413 or a 403?","commit_id":"8ea892a41e2bc5615da9ff7df6a2ad85341484b3"},{"author":{"_account_id":37085,"name":"Daanish Khan","display_name":"Daanish Khan","email":"daanishk@andrew.cmu.edu","username":"daanishk"},"change_message_id":"01f6d4a4c64a28cdd8ec7c83306d63d0013c48c4","unresolved":false,"context_lines":[{"line_number":607,"context_line":"                            headers\u003d{\u0027x-auth-token\u0027: \u0027secret\u0027},"},{"line_number":608,"context_line":"                            environ\u003d{\u0027swift.cache\u0027: cache})"},{"line_number":609,"context_line":"        res \u003d req.get_response(app)"},{"line_number":610,"context_line":"        self.assertEqual(res.status_int, 413)"},{"line_number":611,"context_line":"        self.assertEqual(res.body, b\u0027Upload exceeds quota.\u0027)"},{"line_number":612,"context_line":""},{"line_number":613,"context_line":"    def test_exceed_quota_count_authorized(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"b2a5d3fd_31d10eac","line":610,"range":{"start_line":610,"start_character":41,"end_line":610,"end_character":45},"in_reply_to":"0b7b5284_33cfff1a","updated":"2024-07-15 17:01:38.000000000","message":"Done","commit_id":"8ea892a41e2bc5615da9ff7df6a2ad85341484b3"}]}
