)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"a8b996d951ce92c6913e3fce8cec2c9ab8685f59","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"a293b3a4_c2038fba","updated":"2026-06-02 15:16:55.000000000","message":"recheck\n\nUnrelated probetest error (passed in dependent patches), investigating separately.","commit_id":"5b130d12dcd9e032e9eb675613d7a99263991b51"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"4f07523167f91ceb7d4d184ee2a88ee20f37bc4e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"03e9385a_1e8856d7","updated":"2026-07-06 10:48:44.000000000","message":"Great implementation of EC multi-phase PUT support. The approach of intercepting the Expect header before Gunicorn processes it is clean and matches eventlet\u0027s behavior perfectly. This patch clarifies why the Content-Length + Transfer-Encoding workaround in #979790 is necessary.","commit_id":"f167cc53db40c26663189ccee5420fdd0a1a45c8"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"a4807784c7af987627148e4a4c048889f0b7f072","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"1601f1ab_9c8671b4","updated":"2026-07-09 15:31:41.000000000","message":"The core idea of this patch is sound: adding multiphase PUT support for gunicorn by intercepting Expect: 100-continue and wrapping wsgi.input. I did add a few comments because I believe there\u0027s room for improvement.","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"2039d06d09df7adb427b437a21ef81ce252948e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"bf858345_a599b075","updated":"2026-07-21 12:11:17.000000000","message":"Still have a few unaddressed comments but nothing required.","commit_id":"f97083752338232ee5db6278cd26b9da07879d52"}],"swift/common/wsgi_gunicorn.py":[{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"4f07523167f91ceb7d4d184ee2a88ee20f37bc4e","unresolved":true,"context_lines":[{"line_number":162,"context_line":""},{"line_number":163,"context_line":"class ChunkedInput:"},{"line_number":164,"context_line":"    \"\"\"Wrapper around gunicorn.http.body.Body for chunked requests. Uses the"},{"line_number":165,"context_line":"    same approach as in eventlet.wsgi.Input: thorw in a 100 Continue header"},{"line_number":166,"context_line":"    into the HTTP stream."},{"line_number":167,"context_line":"    \"\"\""},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"8e009cd4_ac97a409","line":165,"updated":"2026-07-06 10:48:44.000000000","message":"Requirement: I would usually add this as suggestion, but since it is a docstring I think it needs to be fixed. There\u0027s a typo here in \"thorw\"","commit_id":"f167cc53db40c26663189ccee5420fdd0a1a45c8"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"a4807784c7af987627148e4a4c048889f0b7f072","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        # Check if this is a chunked request and if so, remove \"Expect:"},{"line_number":88,"context_line":"        # 100-continue\" header before calling default_environ()"},{"line_number":89,"context_line":"        headers \u003d []"},{"line_number":90,"context_line":"        chunked \u003d False"},{"line_number":91,"context_line":"        for name, value in req.headers:"},{"line_number":92,"context_line":"            if name \u003d\u003d \u0027EXPECT\u0027 and value.lower() \u003d\u003d \u0027100-continue\u0027:"},{"line_number":93,"context_line":"                chunked \u003d True"}],"source_content_type":"text/x-python","patch_set":11,"id":"93753239_4707d67f","line":90,"updated":"2026-07-09 15:31:41.000000000","message":"Suggestion: Since the code sets `chunked \u003d True` based on the presence of `Expect: 100-continue` header, rename `chunked` to `expect_continue` to avoid confusion.","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9f0b20d1680ad1cebe3c7dc2b97a8ba028c31cd7","unresolved":true,"context_lines":[{"line_number":87,"context_line":"        # Check if this is a chunked request and if so, remove \"Expect:"},{"line_number":88,"context_line":"        # 100-continue\" header before calling default_environ()"},{"line_number":89,"context_line":"        headers \u003d []"},{"line_number":90,"context_line":"        chunked \u003d False"},{"line_number":91,"context_line":"        for name, value in req.headers:"},{"line_number":92,"context_line":"            if name \u003d\u003d \u0027EXPECT\u0027 and value.lower() \u003d\u003d \u0027100-continue\u0027:"},{"line_number":93,"context_line":"                chunked \u003d True"}],"source_content_type":"text/x-python","patch_set":11,"id":"ecb8fe59_d948dbe7","line":90,"in_reply_to":"93753239_4707d67f","updated":"2026-07-10 10:28:48.000000000","message":"Good point, will do.","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"a4807784c7af987627148e4a4c048889f0b7f072","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        env[\u0027gunicorn.socket\u0027] \u003d sock"},{"line_number":103,"context_line":"        env[\u0027wsgi.input\u0027].get_socket \u003d lambda: sock  # used by obj/server.py"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if chunked:"},{"line_number":106,"context_line":"            env[\u0027wsgi.input\u0027] \u003d ChunkedInput(env[\u0027wsgi.input\u0027], sock, req)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        return env"}],"source_content_type":"text/x-python","patch_set":11,"id":"4b7e2aa7_87c75319","line":105,"updated":"2026-07-09 15:31:41.000000000","message":"ChunkedReader expects chunk-encoded data format (\u003csize\u003e\\r\\n\u003cdata\u003e\\r\\n). Non-chunked requests with Expect: 100-continue and Content-Length will fail because ChunkedReader will try to parse plain body data as chunk-encoded.\n\nSuggestion:\n\n```\nexpect_continue \u003d req.environ.get(\u0027HTTP_EXPECT\u0027, \u0027\u0027).lower() \u003d\u003d \u0027100-continue\u0027\nis_chunked \u003d req.environ.get(\u0027HTTP_TRANSFER_ENCODING\u0027, \u0027\u0027).lower() \u003d\u003d \u0027chunked\u0027\n\nif expect_continue:\n    # Remove Expect header to prevent gunicorn from sending 100 Continue\n    # (we\u0027ll send it ourselves via ChunkedInput)\n    req.headers \u003d headers  # headers without EXPECT\n\nif expect_continue and is_chunked:\n    env[\u0027wsgi.input\u0027] \u003d ChunkedInput(env[\u0027wsgi.input\u0027], sock, req)\nelif expect_continue: \n    # Handle Content-Length request with Expect: 100-continue\n    # Need different wrapper that sends 100 Continue but doesn\u0027t use ChunkedReader\n    ...\n```","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"},{"author":{"_account_id":6968,"name":"Christian Schwede","email":"cschwede@nvidia.com","username":"cschwede"},"change_message_id":"9f0b20d1680ad1cebe3c7dc2b97a8ba028c31cd7","unresolved":true,"context_lines":[{"line_number":102,"context_line":"        env[\u0027gunicorn.socket\u0027] \u003d sock"},{"line_number":103,"context_line":"        env[\u0027wsgi.input\u0027].get_socket \u003d lambda: sock  # used by obj/server.py"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if chunked:"},{"line_number":106,"context_line":"            env[\u0027wsgi.input\u0027] \u003d ChunkedInput(env[\u0027wsgi.input\u0027], sock, req)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        return env"}],"source_content_type":"text/x-python","patch_set":11,"id":"d77bfda1_0576ce95","line":105,"in_reply_to":"4b7e2aa7_87c75319","updated":"2026-07-10 10:28:48.000000000","message":"ChunkedInput doesn\u0027t parse the body - it only sends the 100 Continue on first read, then delegates to the reader gunicorn already picked from the headers (a LengthReader for Content-Length). The only ChunkedReader we build is for the later phases of a multiphase EC PUT, which are always chunked.\n  \nThe suggested split would deadlock Content-Length + Expect requests: the normal replicated PUT path: Expect is stripped, so gunicorn never sends the 100, and without the wrapper nothing does. Client waits for the 100, server waits for the body, until node_timeout fails the PUT. The \"different wrapper\" in the elif would end up being ChunkedInput again.","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"2039d06d09df7adb427b437a21ef81ce252948e1","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        env[\u0027gunicorn.socket\u0027] \u003d sock"},{"line_number":103,"context_line":"        env[\u0027wsgi.input\u0027].get_socket \u003d lambda: sock  # used by obj/server.py"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        if chunked:"},{"line_number":106,"context_line":"            env[\u0027wsgi.input\u0027] \u003d ChunkedInput(env[\u0027wsgi.input\u0027], sock, req)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        return env"}],"source_content_type":"text/x-python","patch_set":11,"id":"a6887733_90d467fe","line":105,"in_reply_to":"d77bfda1_0576ce95","updated":"2026-07-21 12:11:17.000000000","message":"Marked as resolved.","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"},{"author":{"_account_id":38496,"name":"Andressa Cabistani","display_name":"Andressa","email":"acabistani@gmail.com","username":"andressadotpy","status":"I\u0027m a Software Engineer at Red Hat and I love Open Source and connect with people! Feel free to DM through IRC, I\u0027ll be delighted to chat"},"change_message_id":"707fdacc9a56eff7e043f3e49c24e82349784b39","unresolved":true,"context_lines":[{"line_number":181,"context_line":"        for header in self.headers:"},{"line_number":182,"context_line":"            parts.append((\u0027%s: %s\\r\\n\u0027 % header).encode(\u0027latin-1\u0027))"},{"line_number":183,"context_line":"        parts.append(b\u0027\\r\\n\u0027)"},{"line_number":184,"context_line":"        self.sock.sendall(b\u0027\u0027.join(parts))"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        self.headers \u003d []"},{"line_number":187,"context_line":"        if self.continue_sent:"}],"source_content_type":"text/x-python","patch_set":11,"id":"5b104a75_3ba1dbaf","line":184,"updated":"2026-07-09 10:32:46.000000000","message":"Suggestion: I believe we could have a timeout here because if the network connection stalls or the client stops reading, this blocks the Gunicorn worker thread indefinitely and in the threading model, blocked threads cannot handle other requests.","commit_id":"3c2e6ffb18bf26cfecf4a2391c84af4eac9789aa"}]}
