)]}'
{"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1430,"context_line":"    :param chunked: boolean indicating if the request to the object server"},{"line_number":1431,"context_line":"                    shall use Transfer-Encoding: chunked"},{"line_number":1432,"context_line":"    :param mime_boundary: boundary to use in MIME document; only used if"},{"line_number":1433,"context_line":"                          metadata_footer or multiphase is set."},{"line_number":1434,"context_line":"    :param metadata_footer: boolean indicating if some metadata will be sent"},{"line_number":1435,"context_line":"                            after the object data (things that are computed"},{"line_number":1436,"context_line":"                            over the whole object body, like the object\u0027s"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_c452b412","line":1433,"updated":"2016-07-26 15:51:49.000000000","message":"We allow multiphase\u003dTrue and metadata_footer \u003dFalse but don\u0027t use that scenario and I guess don\u0027t test it (given that the mime boundary is only sent to object server if metadata_footer is True)? We should either make one depend upon the other or write some tests.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1430,"context_line":"    :param chunked: boolean indicating if the request to the object server"},{"line_number":1431,"context_line":"                    shall use Transfer-Encoding: chunked"},{"line_number":1432,"context_line":"    :param mime_boundary: boundary to use in MIME document; only used if"},{"line_number":1433,"context_line":"                          metadata_footer or multiphase is set."},{"line_number":1434,"context_line":"    :param metadata_footer: boolean indicating if some metadata will be sent"},{"line_number":1435,"context_line":"                            after the object data (things that are computed"},{"line_number":1436,"context_line":"                            over the whole object body, like the object\u0027s"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b68de032","line":1433,"in_reply_to":"dada55a8_c452b412","updated":"2017-07-05 18:10:07.000000000","message":"It\u0027s true that there are no users of that scenario. I\u0027ll make the code throw an exception if you try it since (I don\u0027t believe) the object server is capable of consuming such a thing. That\u0027ll prevent future-us from tripping over that hazard.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1464,"context_line":"            # We\u0027re going to be sending an indeterminate-length MIME"},{"line_number":1465,"context_line":"            # document as the request body (with the object embedded in it),"},{"line_number":1466,"context_line":"            # so we must use chunked transfer-encoding."},{"line_number":1467,"context_line":"            self.chunked \u003d True"},{"line_number":1468,"context_line":"            if not mime_boundary:"},{"line_number":1469,"context_line":"                # Note: if you\u0027re calling Putter.connect(), it\u0027ll generate"},{"line_number":1470,"context_line":"                # the MIME boundary for you"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_491edd0c","line":1467,"updated":"2016-07-26 15:51:49.000000000","message":"this could be conditionally set in connect()","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1464,"context_line":"            # We\u0027re going to be sending an indeterminate-length MIME"},{"line_number":1465,"context_line":"            # document as the request body (with the object embedded in it),"},{"line_number":1466,"context_line":"            # so we must use chunked transfer-encoding."},{"line_number":1467,"context_line":"            self.chunked \u003d True"},{"line_number":1468,"context_line":"            if not mime_boundary:"},{"line_number":1469,"context_line":"                # Note: if you\u0027re calling Putter.connect(), it\u0027ll generate"},{"line_number":1470,"context_line":"                # the MIME boundary for you"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_d6b85cc9","line":1467,"in_reply_to":"dada55a8_491edd0c","updated":"2017-07-05 18:10:07.000000000","message":"Done","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1512,"context_line":""},{"line_number":1513,"context_line":"    def _start_object_data(self):"},{"line_number":1514,"context_line":"        # Called immediately before the first chunk of object data is sent."},{"line_number":1515,"context_line":"        if self.multiphase or self.metadata_footer:"},{"line_number":1516,"context_line":"            # We\u0027re sending the object plus other stuff in the same request"},{"line_number":1517,"context_line":"            # body, all wrapped up in multipart MIME, so we\u0027d better start"},{"line_number":1518,"context_line":"            # off the MIME document before sending any object data."}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_844f1c33","line":1515,"updated":"2016-07-26 15:51:49.000000000","message":"in other places we use self.mime_boundary as a condition, could do same here","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1512,"context_line":""},{"line_number":1513,"context_line":"    def _start_object_data(self):"},{"line_number":1514,"context_line":"        # Called immediately before the first chunk of object data is sent."},{"line_number":1515,"context_line":"        if self.multiphase or self.metadata_footer:"},{"line_number":1516,"context_line":"            # We\u0027re sending the object plus other stuff in the same request"},{"line_number":1517,"context_line":"            # body, all wrapped up in multipart MIME, so we\u0027d better start"},{"line_number":1518,"context_line":"            # off the MIME document before sending any object data."}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_f6d598e6","line":1515,"in_reply_to":"dada55a8_844f1c33","updated":"2017-07-05 18:10:07.000000000","message":"Done","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"        self.state \u003d DATA_ACKED"},{"line_number":1595,"context_line":""},{"line_number":1596,"context_line":"        if self.mime_boundary:"},{"line_number":1597,"context_line":"            body \u003d \"put_commit_confirmation\""},{"line_number":1598,"context_line":"            tail_boundary \u003d (\"--%s--\" % (self.mime_boundary,))"},{"line_number":1599,"context_line":"            message_parts \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_a94679bd","line":1596,"updated":"2016-07-26 15:51:49.000000000","message":"The condition is not necessary - we only get here if self.multiphase is True and then we\u0027d have raised ValueError in __init__ if there was no mime_boundary","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1593,"context_line":""},{"line_number":1594,"context_line":"        self.state \u003d DATA_ACKED"},{"line_number":1595,"context_line":""},{"line_number":1596,"context_line":"        if self.mime_boundary:"},{"line_number":1597,"context_line":"            body \u003d \"put_commit_confirmation\""},{"line_number":1598,"context_line":"            tail_boundary \u003d (\"--%s--\" % (self.mime_boundary,))"},{"line_number":1599,"context_line":"            message_parts \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_16f49485","line":1596,"in_reply_to":"dada55a8_a94679bd","updated":"2017-07-05 18:10:07.000000000","message":"Done","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1690,"context_line":"        :raises: MultiphasePUTNotSupported if need_multiphase is set but"},{"line_number":1691,"context_line":"                 backend node can\u0027t handle multiphase PUT"},{"line_number":1692,"context_line":"        \"\"\""},{"line_number":1693,"context_line":"        chunked \u003d False"},{"line_number":1694,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":"        if need_metadata_footer or need_multiphase:"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_a4aa206f","line":1693,"updated":"2016-07-26 15:51:49.000000000","message":"unused variable","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1690,"context_line":"        :raises: MultiphasePUTNotSupported if need_multiphase is set but"},{"line_number":1691,"context_line":"                 backend node can\u0027t handle multiphase PUT"},{"line_number":1692,"context_line":"        \"\"\""},{"line_number":1693,"context_line":"        chunked \u003d False"},{"line_number":1694,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":"        if need_metadata_footer or need_multiphase:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_d62bbce8","line":1693,"in_reply_to":"dada55a8_a4aa206f","updated":"2017-07-05 18:10:07.000000000","message":"Done","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1705,"context_line":"        else:"},{"line_number":1706,"context_line":"            mime_boundary \u003d None"},{"line_number":1707,"context_line":""},{"line_number":1708,"context_line":"        if need_metadata_footer:"},{"line_number":1709,"context_line":"            headers[\u0027X-Backend-Obj-Multipart-Mime-Boundary\u0027] \u003d mime_boundary"},{"line_number":1710,"context_line":"            headers[\u0027X-Backend-Obj-Metadata-Footer\u0027] \u003d \u0027yes\u0027"},{"line_number":1711,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_7e71d90b","line":1708,"updated":"2016-07-26 15:51:49.000000000","message":"The object server expects X-Backend-Obj-Multipart-Mime-Boundary if metadata_footer or if multiphase, but here it is only sent if need_metadata_footer is True.\n\nOf course, we never call connect() with need_metadata_footer\u003dFalse and need_multiphase\u003dTrue, yet, but here and in other places the interdependency is confusing.\n\nPerhaps we need at line 1693 or thereabouts:\n\n  need_metadata_footer \u003d need_metadata_footer or need_multiphase\n\nor raise a ValueError if \nneed_metadata_footer\u003dFalse and need_multiphase\u003dTrue\n\nbut it also leaves me feeling that \"need_metadata_footer\" really means \"need_multipart\" and that might be a more helpful variable name??","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1705,"context_line":"        else:"},{"line_number":1706,"context_line":"            mime_boundary \u003d None"},{"line_number":1707,"context_line":""},{"line_number":1708,"context_line":"        if need_metadata_footer:"},{"line_number":1709,"context_line":"            headers[\u0027X-Backend-Obj-Multipart-Mime-Boundary\u0027] \u003d mime_boundary"},{"line_number":1710,"context_line":"            headers[\u0027X-Backend-Obj-Metadata-Footer\u0027] \u003d \u0027yes\u0027"},{"line_number":1711,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_b61720a4","line":1708,"in_reply_to":"dada55a8_7e71d90b","updated":"2017-07-05 18:10:07.000000000","message":"I\u0027ve taken the approach of raising ValueError (in __init__(), not here in connect()). You\u0027re right that it\u0027s unused, and the ValueError makes it clear that it is not a supported code path.\n\nI\u0027ve also set the mime boundary in both cases. It\u0027s not strictly necessary, as you pointed out, since multiphase implies footers, but it helps the clarity of this code IMO.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1707,"context_line":""},{"line_number":1708,"context_line":"        if need_metadata_footer:"},{"line_number":1709,"context_line":"            headers[\u0027X-Backend-Obj-Multipart-Mime-Boundary\u0027] \u003d mime_boundary"},{"line_number":1710,"context_line":"            headers[\u0027X-Backend-Obj-Metadata-Footer\u0027] \u003d \u0027yes\u0027"},{"line_number":1711,"context_line":""},{"line_number":1712,"context_line":"        if need_multiphase:"},{"line_number":1713,"context_line":"            headers[\u0027X-Backend-Obj-Multiphase-Commit\u0027] \u003d \u0027yes\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_4966dded","line":1710,"updated":"2016-07-26 15:51:49.000000000","message":"can we set chunked\u003dTrue here and save more chunked-setting-related logic in Putter.__init__","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1707,"context_line":""},{"line_number":1708,"context_line":"        if need_metadata_footer:"},{"line_number":1709,"context_line":"            headers[\u0027X-Backend-Obj-Multipart-Mime-Boundary\u0027] \u003d mime_boundary"},{"line_number":1710,"context_line":"            headers[\u0027X-Backend-Obj-Metadata-Footer\u0027] \u003d \u0027yes\u0027"},{"line_number":1711,"context_line":""},{"line_number":1712,"context_line":"        if need_multiphase:"},{"line_number":1713,"context_line":"            headers[\u0027X-Backend-Obj-Multiphase-Commit\u0027] \u003d \u0027yes\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_960e648b","line":1710,"in_reply_to":"dada55a8_4966dded","updated":"2017-07-05 18:10:07.000000000","message":"Done","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1712,"context_line":"        if need_multiphase:"},{"line_number":1713,"context_line":"            headers[\u0027X-Backend-Obj-Multiphase-Commit\u0027] \u003d \u0027yes\u0027"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"        cl \u003d headers.get(\u0027Content-Length\u0027)"},{"line_number":1716,"context_line":"        if cl is None:"},{"line_number":1717,"context_line":"            # indeterminate-length request body"},{"line_number":1718,"context_line":"            headers[\u0027Expect\u0027] \u003d \u0027100-continue\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_1b0f0f3a","line":1715,"updated":"2016-07-26 15:51:49.000000000","message":"I need some help understanding this...we already set Expect based on content-length in _get_put_connections (line 547), but here we do it again, but with more conditions.\n\nSo (a) can the two places be reduced to one and (b) do the new conditions imply there are also new test cases that are needed? Looks like here we are anticipating that the request headers may already have an Expect header.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1712,"context_line":"        if need_multiphase:"},{"line_number":1713,"context_line":"            headers[\u0027X-Backend-Obj-Multiphase-Commit\u0027] \u003d \u0027yes\u0027"},{"line_number":1714,"context_line":""},{"line_number":1715,"context_line":"        cl \u003d headers.get(\u0027Content-Length\u0027)"},{"line_number":1716,"context_line":"        if cl is None:"},{"line_number":1717,"context_line":"            # indeterminate-length request body"},{"line_number":1718,"context_line":"            headers[\u0027Expect\u0027] \u003d \u0027100-continue\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_76a2a84d","line":1715,"in_reply_to":"dada55a8_1b0f0f3a","updated":"2017-07-05 18:10:07.000000000","message":"(a) yes [right here], and (b) I think if the client sends an Expect header to the proxy, it\u0027ll make its way in here. I\u0027m not 100% sure of that, though.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1724,"context_line":"            headers.pop(\u0027Transfer-Encoding\u0027, None)"},{"line_number":1725,"context_line":"            chunked \u003d False"},{"line_number":1726,"context_line":"        else:"},{"line_number":1727,"context_line":"            # zero-length request body"},{"line_number":1728,"context_line":"            headers.pop(\u0027Expect\u0027, None)"},{"line_number":1729,"context_line":"            headers.pop(\u0027Transfer-Encoding\u0027, None)"},{"line_number":1730,"context_line":"            chunked \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_0fcce5b9","line":1727,"updated":"2016-07-26 15:51:49.000000000","message":"do we check somewhere else that it is not negative?","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1724,"context_line":"            headers.pop(\u0027Transfer-Encoding\u0027, None)"},{"line_number":1725,"context_line":"            chunked \u003d False"},{"line_number":1726,"context_line":"        else:"},{"line_number":1727,"context_line":"            # zero-length request body"},{"line_number":1728,"context_line":"            headers.pop(\u0027Expect\u0027, None)"},{"line_number":1729,"context_line":"            headers.pop(\u0027Transfer-Encoding\u0027, None)"},{"line_number":1730,"context_line":"            chunked \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_36ad5031","line":1727,"in_reply_to":"dada55a8_0fcce5b9","updated":"2017-07-05 18:10:07.000000000","message":"Yes, in the proxy server\u0027s handle_request() method right near the top.\n\nThat\u0027s probably good, since I wouldn\u0027t know what to do with a negative content length. I suppose I could generate abs(content_length) random bytes and send them back to the client...","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"            # zero-length request body"},{"line_number":1728,"context_line":"            headers.pop(\u0027Expect\u0027, None)"},{"line_number":1729,"context_line":"            headers.pop(\u0027Transfer-Encoding\u0027, None)"},{"line_number":1730,"context_line":"            chunked \u003d False"},{"line_number":1731,"context_line":""},{"line_number":1732,"context_line":"        conn, expect_resp, final_resp, connect_duration \u003d cls._make_connection("},{"line_number":1733,"context_line":"            node, part, req, headers, conn_timeout, node_timeout)"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_cfee4d21","line":1730,"updated":"2016-07-26 15:51:49.000000000","message":"on master, AFAICT, a plain old replicated policy request with req._is_chunked \u003d True resulted in chunked \u003d True in the Putter. Here it seems we change that logic, and always ignore req.is_chunked and rely on the absence of content-length.\n\nRFC7230 does say that clients should not send both content-length and transfer-encoding [1], but nevertheless this feels like a subtle but possibly significant change. In constraints.py we check for either content-length or chunked, but don\u0027t check/error if both exist.\n\n[1] https://tools.ietf.org/html/rfc7230#section-3.3.2","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":1727,"context_line":"            # zero-length request body"},{"line_number":1728,"context_line":"            headers.pop(\u0027Expect\u0027, None)"},{"line_number":1729,"context_line":"            headers.pop(\u0027Transfer-Encoding\u0027, None)"},{"line_number":1730,"context_line":"            chunked \u003d False"},{"line_number":1731,"context_line":""},{"line_number":1732,"context_line":"        conn, expect_resp, final_resp, connect_duration \u003d cls._make_connection("},{"line_number":1733,"context_line":"            node, part, req, headers, conn_timeout, node_timeout)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_d61a9c7b","line":1730,"in_reply_to":"dada55a8_cfee4d21","updated":"2017-07-05 18:10:07.000000000","message":"That\u0027s always been a bit weird in the proxy server. If a client sent a chunked PUT, we\u0027d always send a chunked PUT to the object servers regardless of whether we knew the content length or not.\n\nThe proxy never actually receives chunked-encoding data from the WSGI layer; whether the actual request is chunked or not, eventlet.wsgi.Input.read() handles that and returns the possibly-chunk-decoded data.\n\nCorrect me if I\u0027m wrong, but I think this is benign. The behavior change happens if a client sends both Transfer-Encoding: chunked and Content-Length to the proxy server. The proxy used to use chunked encoding for the request to the object servers and now it doesn\u0027t, but since we only deal in decoded bytes, I believe there\u0027s no significant change here. At most, we use slightly fewer bytes in sending the request body to the object servers.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"3c57fe145ceaf7a7a3fd6fadbd850ad7b2de462a","unresolved":false,"context_lines":[{"line_number":2025,"context_line":"                \u0027X-Object-Sysmeta-Ec-Content-Length\u0027)"},{"line_number":2026,"context_line":"            resp.fix_conditional_response()"},{"line_number":2027,"context_line":""},{"line_number":2028,"context_line":"    def _make_putter(self, node, part, req, headers):"},{"line_number":2029,"context_line":"        return Putter.connect("},{"line_number":2030,"context_line":"            node, part, req.swift_entity_path, headers,"},{"line_number":2031,"context_line":"            conn_timeout\u003dself.app.conn_timeout,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_af74b9fd","line":2028,"updated":"2016-07-26 15:51:49.000000000","message":"we could eliminate the _make_putter methods if we passed the booleans need_metadata and need_multiphase through get_put_connections - perhaps using **kwargs to plumb them to connect() from the _store_object methods.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"c17999d9009f210d344400d75804560b7b21d656","unresolved":false,"context_lines":[{"line_number":2025,"context_line":"                \u0027X-Object-Sysmeta-Ec-Content-Length\u0027)"},{"line_number":2026,"context_line":"            resp.fix_conditional_response()"},{"line_number":2027,"context_line":""},{"line_number":2028,"context_line":"    def _make_putter(self, node, part, req, headers):"},{"line_number":2029,"context_line":"        return Putter.connect("},{"line_number":2030,"context_line":"            node, part, req.swift_entity_path, headers,"},{"line_number":2031,"context_line":"            conn_timeout\u003dself.app.conn_timeout,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3f1d235d_310e7a32","line":2028,"in_reply_to":"dada55a8_af74b9fd","updated":"2017-07-05 18:10:07.000000000","message":"If you feel strongly about this then I can make the change. I\u0027m a bit hesitant to put more things into the EC controller\u0027s _store_object method, though, as it\u0027s got a lot going on already.","commit_id":"f045311937cf7e3e003928289fce02d2c070c738"}]}
