)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"043714a44ac4aed6e6f2b2d1327bca1b5a1721fb","unresolved":true,"context_lines":[{"line_number":13,"context_line":"- Address request line splitting (https://bugs.python.org/issue33973)"},{"line_number":14,"context_line":"- Special-case py2 header-parsing"},{"line_number":15,"context_line":"- Address multiple leading slashes in request path"},{"line_number":16,"context_line":"  (https://github.com/python/cpython/issues/99220)"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: Iae28097668213aa0734837ff21aef83251167d19"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"a8e8838d_987737bc","line":16,"updated":"2022-12-09 22:11:13.000000000","message":"Oh, right! A few things here:\n\n- This should be mentioned more prominently; it\u0027s the whole reason we\u0027re doing this!\n- Since we\u0027ve got this fix, this patch should also revert https://review.opendev.org/c/openstack/swift/+/864946\n- Now that I\u0027ve written up https://bugs.launchpad.net/swift/+bug/1999278 this patch should close it","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26e4bea60d0c21b87cea8f4e65ff43c866fc7f22","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5a9df090_fb5cf832","updated":"2022-12-06 20:49:45.000000000","message":"Cleaned up the kludges I added in https://github.com/openstack/swift/commit/93b49c5e4818774febb7aa59fc21cbbcf8db2344 and https://github.com/openstack/swift/commit/7753eff66233db82948227c7f592fb0c463a0aef at least -- I\u0027ll wait for test results and mull it over.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1821a3ffec0d215c0a4b7e24b8ef2cae732cfb9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e4873635_5f873a9e","updated":"2022-12-06 21:51:19.000000000","message":"i think maybe this is slightly more than just the inline - i\u0027m not sure about the raw_path_info thing (mabye we don\u0027t support py2 anymore?)\n\n... either way it looks pretty good and I like this direction.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"260ed4a8b1df6fe8e3c14ddfb73484df88751178","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a931cae7_b4d27f31","updated":"2022-12-19 23:00:52.000000000","message":"Ah, shoot! I forgot to include in the commit message that it closes https://bugs.launchpad.net/swift/+bug/1999278","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"043714a44ac4aed6e6f2b2d1327bca1b5a1721fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"01ae3265_bf548a0f","updated":"2022-12-09 22:11:13.000000000","message":"Clay, you say you like this direction (presumably more than https://review.opendev.org/c/openstack/swift/+/863441) -- can we commit to getting it reviewed and landed? I hate having jobs set to non-voting because of this upstream regression.","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cca63d94c43e70402e173ff0b2bac8aece8aedc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"0dcdf3b3_18a775b7","updated":"2022-12-07 01:06:34.000000000","message":"Downsides to this approach:\n\n- needing to re-litigate a bunch of *other* HTTP-parsing fixes (though there\u0027s some hope that we can get some net-simplifications)\n- almost certainly need a bunch more tests to cover branches that we were previously content to let stdlib deal with\n- on-going cost of monitoring upstream for changes and deciding whether we want to apply the one patch that comes along every two years or so","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e85eccde_13426b0e","updated":"2022-12-15 05:06:47.000000000","message":"Nice one Tim. I\u0027ve compared this with the cpyton parse_request function from the revision you pulled this from. Makes it much easier to review as you can see the parts that were changed (to make py2 happy and to better fix // handling).\n\nThere isn\u0027t that much code inline, and it doesn\u0027t seem to get updated too often. We may need to make a note to remember to keep an eye on the \"upstream\" cpython version of this code to get future fixes. But I this feels much cleaner, and gives us a little more access to the request handling from the swift side if we ever need it.","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"0ac3e1b453d6a342f6eb4fdeee00aa3a6b148c47","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f1cb3657_bb878893","updated":"2022-12-19 00:08:31.000000000","message":"i happy with all this","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"}],"swift/common/http_protocol.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1821a3ffec0d215c0a4b7e24b8ef2cae732cfb9f","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        def get_environ(self, *args, **kwargs):"},{"line_number":100,"context_line":"            environ \u003d wsgi.HttpProtocol.get_environ(self, *args, **kwargs)"},{"line_number":101,"context_line":"            environ[\u0027RAW_PATH_INFO\u0027] \u003d bytes_to_wsgi("},{"line_number":102,"context_line":"                self.__raw_path_info)"},{"line_number":103,"context_line":"            header_payload \u003d self.headers.get_payload()"},{"line_number":104,"context_line":"            if isinstance(header_payload, list) and len(header_payload) \u003d\u003d 1:"},{"line_number":105,"context_line":"                header_payload \u003d header_payload[0].get_payload()"}],"source_content_type":"text/x-python","patch_set":1,"id":"84317075_5104d9d4","side":"PARENT","line":102,"updated":"2022-12-06 21:51:19.000000000","message":"wait, i don\u0027t understand - we don\u0027t need environ[\u0027RAW_PATH_INFO\u0027] anymore?\n\nso i guess eventlet was always setting this for us - i\u0027m not exactly sure why we don\u0027t have to do the pre-capture trick on py2 anymore.","commit_id":"597887dedcf1f2c855edfd1c591d4f30222be580"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cca63d94c43e70402e173ff0b2bac8aece8aedc","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        def get_environ(self, *args, **kwargs):"},{"line_number":100,"context_line":"            environ \u003d wsgi.HttpProtocol.get_environ(self, *args, **kwargs)"},{"line_number":101,"context_line":"            environ[\u0027RAW_PATH_INFO\u0027] \u003d bytes_to_wsgi("},{"line_number":102,"context_line":"                self.__raw_path_info)"},{"line_number":103,"context_line":"            header_payload \u003d self.headers.get_payload()"},{"line_number":104,"context_line":"            if isinstance(header_payload, list) and len(header_payload) \u003d\u003d 1:"},{"line_number":105,"context_line":"                header_payload \u003d header_payload[0].get_payload()"}],"source_content_type":"text/x-python","patch_set":1,"id":"946f79c4_ed8069dc","side":"PARENT","line":102,"in_reply_to":"84317075_5104d9d4","updated":"2022-12-07 01:06:34.000000000","message":"Eventlet sets it for us -- on py2, it does so correctly; on py3, we had to capture it early since we were going to rewrite the request line to be something cpython could actually parse correctly (see https://bugs.python.org/issue33973).\n\nWith the more-targeted split() at L87, we no longer need to track it at all, and can rely on eventlet setting it.","commit_id":"597887dedcf1f2c855edfd1c591d4f30222be580"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        def get_environ(self, *args, **kwargs):"},{"line_number":100,"context_line":"            environ \u003d wsgi.HttpProtocol.get_environ(self, *args, **kwargs)"},{"line_number":101,"context_line":"            environ[\u0027RAW_PATH_INFO\u0027] \u003d bytes_to_wsgi("},{"line_number":102,"context_line":"                self.__raw_path_info)"},{"line_number":103,"context_line":"            header_payload \u003d self.headers.get_payload()"},{"line_number":104,"context_line":"            if isinstance(header_payload, list) and len(header_payload) \u003d\u003d 1:"},{"line_number":105,"context_line":"                header_payload \u003d header_payload[0].get_payload()"}],"source_content_type":"text/x-python","patch_set":1,"id":"41a282f2_0224bf99","side":"PARENT","line":102,"in_reply_to":"946f79c4_ed8069dc","updated":"2022-12-15 05:06:47.000000000","message":"nice!","commit_id":"597887dedcf1f2c855edfd1c591d4f30222be580"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26e4bea60d0c21b87cea8f4e65ff43c866fc7f22","unresolved":true,"context_lines":[{"line_number":63,"context_line":"            return \u0027\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def parse_request(self):"},{"line_number":66,"context_line":"        \"\"\"Parse a request (inlined from cpython@7e293984)."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        The request should be stored in self.raw_requestline; the results"},{"line_number":69,"context_line":"        are in self.command, self.path, self.request_version and"}],"source_content_type":"text/x-python","patch_set":1,"id":"12dc8ee3_68b5a0d4","line":66,"range":{"start_line":66,"start_character":28,"end_line":66,"end_character":57},"updated":"2022-12-06 20:49:45.000000000","message":"Good news is, this seems to generally be a fairly stable function -- I count 6 commits to (directly) touch it in the last ten years:\n\n- https://github.com/python/cpython/commit/70e2847347f9b4fd579e23cf2e2f329aab1faa5d\n- https://github.com/python/cpython/commit/e82338ddab6ee66b845866dfb75e3e01b0bb76d7\n- https://github.com/python/cpython/commit/50badad807abc5367359bd81a2a8051ff5cdce7e\n- https://github.com/python/cpython/commit/e4db76967d7fb0ec0f5a98a9603ca5563f4a8320\n- https://github.com/python/cpython/commit/4abab6b603dd38bec1168e9a37c40a48ec89508e\n- https://github.com/python/cpython/commit/acc03195b0609490a4e5f8b1d9eb504c22c6526e","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":63,"context_line":"            return \u0027\u0027"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def parse_request(self):"},{"line_number":66,"context_line":"        \"\"\"Parse a request (inlined from cpython@7e293984)."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        The request should be stored in self.raw_requestline; the results"},{"line_number":69,"context_line":"        are in self.command, self.path, self.request_version and"}],"source_content_type":"text/x-python","patch_set":1,"id":"de384bb0_7e95bf2a","line":66,"range":{"start_line":66,"start_character":28,"end_line":66,"end_character":57},"in_reply_to":"12dc8ee3_68b5a0d4","updated":"2022-12-15 05:06:47.000000000","message":"OK so it isn\u0027t updated very often. Nice this makes this inline approach much more appealing.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26e4bea60d0c21b87cea8f4e65ff43c866fc7f22","unresolved":true,"context_lines":[{"line_number":77,"context_line":"        self.request_version \u003d version \u003d self.default_request_version"},{"line_number":78,"context_line":"        self.close_connection \u003d True"},{"line_number":79,"context_line":"        requestline \u003d self.raw_requestline"},{"line_number":80,"context_line":"        if not six.PY2:"},{"line_number":81,"context_line":"            requestline \u003d requestline.decode(\u0027iso-8859-1\u0027)"},{"line_number":82,"context_line":"        requestline \u003d requestline.rstrip(\u0027\\r\\n\u0027)"},{"line_number":83,"context_line":"        self.requestline \u003d requestline"}],"source_content_type":"text/x-python","patch_set":1,"id":"ea67206c_7ed8e2d2","line":80,"updated":"2022-12-06 20:49:45.000000000","message":"Needing a py2-specific branch is unfortunate, but I\u0027m not sure it\u0027s avoidable here.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1821a3ffec0d215c0a4b7e24b8ef2cae732cfb9f","unresolved":true,"context_lines":[{"line_number":136,"context_line":"        # with \u0027//\u0027 because http clients treat //path as an absolute URI"},{"line_number":137,"context_line":"        # without scheme (similar to http://path) rather than a path."},{"line_number":138,"context_line":"        if self.path.startswith(\u0027//\u0027):"},{"line_number":139,"context_line":"            self.path \u003d \u0027/\u0027 + self.path.lstrip(\u0027/\u0027)  # Reduce to a single /"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Examine the headers and look for a Connection directive."},{"line_number":142,"context_line":"        if six.PY2:"}],"source_content_type":"text/x-python","patch_set":1,"id":"b624164e_146e4e63","line":139,"updated":"2022-12-06 21:51:19.000000000","message":"grrrr","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26e4bea60d0c21b87cea8f4e65ff43c866fc7f22","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Examine the headers and look for a Connection directive."},{"line_number":142,"context_line":"        if six.PY2:"},{"line_number":143,"context_line":"            self.headers \u003d self.MessageClass(self.rfile, 0)"},{"line_number":144,"context_line":"        else:"},{"line_number":145,"context_line":"            try:"},{"line_number":146,"context_line":"                self.headers \u003d http_client.parse_headers(self.rfile,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d1e510bf_9d619c64","line":143,"updated":"2022-12-06 20:49:45.000000000","message":"This py2 branch strikes me as more annoying :-/","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Examine the headers and look for a Connection directive."},{"line_number":142,"context_line":"        if six.PY2:"},{"line_number":143,"context_line":"            self.headers \u003d self.MessageClass(self.rfile, 0)"},{"line_number":144,"context_line":"        else:"},{"line_number":145,"context_line":"            try:"},{"line_number":146,"context_line":"                self.headers \u003d http_client.parse_headers(self.rfile,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d9cac16a_0b0bc8fc","line":143,"in_reply_to":"43391ff1_d9c6ad98","updated":"2022-12-15 05:06:47.000000000","message":"ahh the py2 httplib doesn\u0027t have a parse_headers method, yeah that\u0027s annoying.\n\nGood thing py2 is on the way out.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1821a3ffec0d215c0a4b7e24b8ef2cae732cfb9f","unresolved":true,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"        # Examine the headers and look for a Connection directive."},{"line_number":142,"context_line":"        if six.PY2:"},{"line_number":143,"context_line":"            self.headers \u003d self.MessageClass(self.rfile, 0)"},{"line_number":144,"context_line":"        else:"},{"line_number":145,"context_line":"            try:"},{"line_number":146,"context_line":"                self.headers \u003d http_client.parse_headers(self.rfile,"}],"source_content_type":"text/x-python","patch_set":1,"id":"43391ff1_d9c6ad98","line":143,"in_reply_to":"d1e510bf_9d619c64","updated":"2022-12-06 21:51:19.000000000","message":"yeah what the heck is that!?","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26e4bea60d0c21b87cea8f4e65ff43c866fc7f22","unresolved":true,"context_lines":[{"line_number":182,"context_line":"                header_payload \u003d header_payload[0].get_payload()"},{"line_number":183,"context_line":"            if header_payload:"},{"line_number":184,"context_line":"                # This shouldn\u0027t be here. We must\u0027ve bumped up against"},{"line_number":185,"context_line":"                # https://bugs.python.org/issue37093"},{"line_number":186,"context_line":"                headers_raw \u003d list(environ[\u0027headers_raw\u0027])"},{"line_number":187,"context_line":"                for line in header_payload.rstrip(\u0027\\r\\n\u0027).split(\u0027\\n\u0027):"},{"line_number":188,"context_line":"                    if \u0027:\u0027 not in line or line[:1] in \u0027 \\t\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"91d0df2f_8ae2a1e4","line":185,"updated":"2022-12-06 20:49:45.000000000","message":"We could probably hoist this hack up into parse_request() now, and avoid tinkering with get_environ()...","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0cca63d94c43e70402e173ff0b2bac8aece8aedc","unresolved":true,"context_lines":[{"line_number":182,"context_line":"                header_payload \u003d header_payload[0].get_payload()"},{"line_number":183,"context_line":"            if header_payload:"},{"line_number":184,"context_line":"                # This shouldn\u0027t be here. We must\u0027ve bumped up against"},{"line_number":185,"context_line":"                # https://bugs.python.org/issue37093"},{"line_number":186,"context_line":"                headers_raw \u003d list(environ[\u0027headers_raw\u0027])"},{"line_number":187,"context_line":"                for line in header_payload.rstrip(\u0027\\r\\n\u0027).split(\u0027\\n\u0027):"},{"line_number":188,"context_line":"                    if \u0027:\u0027 not in line or line[:1] in \u0027 \\t\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"feeda165_f06caa7f","line":185,"in_reply_to":"91d0df2f_8ae2a1e4","updated":"2022-12-07 01:06:34.000000000","message":"Or not. There\u0027s still a header-casing bug, where we\u0027ll upper() non-ascii chars that we shouldn\u0027t :-/\n\nMight still be nice to avoid the need to reset wsgi.input and/or 100-continue stuff though... I might keep poking at it in https://review.opendev.org/c/openstack/swift/+/866813/ if we continue down this road.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":182,"context_line":"                header_payload \u003d header_payload[0].get_payload()"},{"line_number":183,"context_line":"            if header_payload:"},{"line_number":184,"context_line":"                # This shouldn\u0027t be here. We must\u0027ve bumped up against"},{"line_number":185,"context_line":"                # https://bugs.python.org/issue37093"},{"line_number":186,"context_line":"                headers_raw \u003d list(environ[\u0027headers_raw\u0027])"},{"line_number":187,"context_line":"                for line in header_payload.rstrip(\u0027\\r\\n\u0027).split(\u0027\\n\u0027):"},{"line_number":188,"context_line":"                    if \u0027:\u0027 not in line or line[:1] in \u0027 \\t\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3925f234_0312c52d","line":185,"in_reply_to":"feeda165_f06caa7f","updated":"2022-12-15 05:06:47.000000000","message":"sounds like a good plan. Doesn\u0027t hurt to keep this in for now and land the other later.","commit_id":"eda3ec61b96f37ccb344b7e0812d3763d6fdc493"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":20,"context_line":"if six.PY2:"},{"line_number":21,"context_line":"    from eventlet.green import httplib as http_client"},{"line_number":22,"context_line":"else:"},{"line_number":23,"context_line":"    from eventlet.green.http import client as http_client"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class SwiftHttpProtocol(wsgi.HttpProtocol):"}],"source_content_type":"text/x-python","patch_set":3,"id":"d85075b1_5edadd31","line":23,"updated":"2022-12-15 05:06:47.000000000","message":"Yup another reason it\u0027ll be nice when we remove py3 completely","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":84,"context_line":"        requestline \u003d requestline.rstrip(\u0027\\r\\n\u0027)"},{"line_number":85,"context_line":"        self.requestline \u003d requestline"},{"line_number":86,"context_line":"        # Split off \\x20 explicitly (see https://bugs.python.org/issue33973)"},{"line_number":87,"context_line":"        words \u003d requestline.split(\u0027 \u0027)"},{"line_number":88,"context_line":"        if len(words) \u003d\u003d 0:"},{"line_number":89,"context_line":"            return False"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b04159fa_aed0f0a4","line":87,"updated":"2022-12-15 05:06:47.000000000","message":"So here is the py3 fix for cpython that tim mentioned in the discussion with Clay on 101 (of the old code).","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":106,"context_line":"                version_number \u003d int(version_number[0]), int(version_number[1])"},{"line_number":107,"context_line":"            except (ValueError, IndexError):"},{"line_number":108,"context_line":"                self.send_error("},{"line_number":109,"context_line":"                    400,"},{"line_number":110,"context_line":"                    \"Bad request version (%r)\" % version)"},{"line_number":111,"context_line":"                return False"},{"line_number":112,"context_line":"            if version_number \u003e\u003d (1, 1) and \\"}],"source_content_type":"text/x-python","patch_set":3,"id":"6b16cacf_4a22549e","line":109,"range":{"start_line":109,"start_character":20,"end_line":109,"end_character":23},"updated":"2022-12-15 05:06:47.000000000","message":"So we are hardcoding the return status codes. Sure, we do that elsewhere. At least its obvious.","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcccc8e41d9febd76ecd14e369b1cef2c2529240","unresolved":true,"context_lines":[{"line_number":106,"context_line":"                version_number \u003d int(version_number[0]), int(version_number[1])"},{"line_number":107,"context_line":"            except (ValueError, IndexError):"},{"line_number":108,"context_line":"                self.send_error("},{"line_number":109,"context_line":"                    400,"},{"line_number":110,"context_line":"                    \"Bad request version (%r)\" % version)"},{"line_number":111,"context_line":"                return False"},{"line_number":112,"context_line":"            if version_number \u003e\u003d (1, 1) and \\"}],"source_content_type":"text/x-python","patch_set":3,"id":"f8e09708_b683220c","line":109,"range":{"start_line":109,"start_character":20,"end_line":109,"end_character":23},"in_reply_to":"6b16cacf_4a22549e","updated":"2022-12-19 20:04:09.000000000","message":"Maybe I should have used our constants from swift.common.http? *shrug*","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"02c0a4f44a50b5581cf9e368caa355af3c496629","unresolved":true,"context_lines":[{"line_number":132,"context_line":"                    400,"},{"line_number":133,"context_line":"                    \"Bad HTTP/0.9 request type (%r)\" % command)"},{"line_number":134,"context_line":"                return False"},{"line_number":135,"context_line":"        self.command, self.path \u003d command, path"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        # Examine the headers and look for a Connection directive."},{"line_number":138,"context_line":"        if six.PY2:"}],"source_content_type":"text/x-python","patch_set":3,"id":"7169edc0_523107e1","line":135,"updated":"2022-12-09 17:52:18.000000000","message":"FWIW, this is about the point at which we\u0027ll want to fix absolute-form request targets -- see https://review.opendev.org/c/openstack/swift/+/856327","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"193c26ce7376dadf7f745d810d2310f1716d2037","unresolved":true,"context_lines":[{"line_number":132,"context_line":"                    400,"},{"line_number":133,"context_line":"                    \"Bad HTTP/0.9 request type (%r)\" % command)"},{"line_number":134,"context_line":"                return False"},{"line_number":135,"context_line":"        self.command, self.path \u003d command, path"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        # Examine the headers and look for a Connection directive."},{"line_number":138,"context_line":"        if six.PY2:"}],"source_content_type":"text/x-python","patch_set":3,"id":"649691db_7ebb28a6","line":135,"in_reply_to":"7169edc0_523107e1","updated":"2022-12-15 05:06:47.000000000","message":"yup, I see, I compared with the function at the commit your taking this from. Here is where it should lstrip the \u0027/\u0027 to make it only 1.\n\nNice.","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":597,"name":"Pete Zaitcev","email":"zaitcev@kotori.zaitcev.us","username":"zaitcev"},"change_message_id":"5fd7e8c8f6dcfe727e0d6d7e188fc7f7f1d79a7b","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        # Examine the headers and look for an Expect directive"},{"line_number":166,"context_line":"        expect \u003d self.headers.get(\u0027Expect\u0027, \"\")"},{"line_number":167,"context_line":"        if (expect.lower() \u003d\u003d \"100-continue\" and"},{"line_number":168,"context_line":"                self.protocol_version \u003e\u003d \"HTTP/1.1\" and"},{"line_number":169,"context_line":"                self.request_version \u003e\u003d \"HTTP/1.1\"):"},{"line_number":170,"context_line":"            if not self.handle_expect_100():"},{"line_number":171,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"5e746ff5_97f8c577","line":168,"updated":"2022-12-16 23:50:32.000000000","message":"I\u0027m amazed that comparing strings like this even works. I investigated and prototol_version does not seem to be a magical property that parses and compares numerically.","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcccc8e41d9febd76ecd14e369b1cef2c2529240","unresolved":true,"context_lines":[{"line_number":165,"context_line":"        # Examine the headers and look for an Expect directive"},{"line_number":166,"context_line":"        expect \u003d self.headers.get(\u0027Expect\u0027, \"\")"},{"line_number":167,"context_line":"        if (expect.lower() \u003d\u003d \"100-continue\" and"},{"line_number":168,"context_line":"                self.protocol_version \u003e\u003d \"HTTP/1.1\" and"},{"line_number":169,"context_line":"                self.request_version \u003e\u003d \"HTTP/1.1\"):"},{"line_number":170,"context_line":"            if not self.handle_expect_100():"},{"line_number":171,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f2ae94d_5428e4ba","line":168,"in_reply_to":"5e746ff5_97f8c577","updated":"2022-12-19 20:04:09.000000000","message":"Yeah, that stuck out to me, too. Upstream looks... not always great.","commit_id":"884f5538f8fb187b6ff18316249f1bd4b97b0952"}],"test/unit/common/test_http_protocol.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"26e4bea60d0c21b87cea8f4e65ff43c866fc7f22","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                b\u0027POST /?and%20it\u003dfixes+params\u0026\u0027"},{"line_number":108,"context_line":"                b\u0027PALMTREE\u003d\\xf0%9f\\x8c%b4 HTTP/1.1\u0027,"},{"line_number":109,"context_line":"                b\u0027POST /?and+it\u003dfixes+params\u0026PALMTREE\u003d%F0%9F%8C%B4 HTTP/1.1\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ProtocolTest(unittest.TestCase):"},{"line_number":113,"context_line":"    def _run_bytes_through_protocol(self, bytes_from_client):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ea3b3948_7e121d66","side":"PARENT","line":110,"updated":"2022-12-06 20:49:45.000000000","message":"I *think* most of the spirit of this is reproduced in the new test below? Note that the query-param-handling behavior has changed a good bit though -- as long as we\u0027re always using wsgi_unquote, I think it should be fine.","commit_id":"597887dedcf1f2c855edfd1c591d4f30222be580"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1821a3ffec0d215c0a4b7e24b8ef2cae732cfb9f","unresolved":true,"context_lines":[{"line_number":107,"context_line":"                b\u0027POST /?and%20it\u003dfixes+params\u0026\u0027"},{"line_number":108,"context_line":"                b\u0027PALMTREE\u003d\\xf0%9f\\x8c%b4 HTTP/1.1\u0027,"},{"line_number":109,"context_line":"                b\u0027POST /?and+it\u003dfixes+params\u0026PALMTREE\u003d%F0%9F%8C%B4 HTTP/1.1\u0027)"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"class ProtocolTest(unittest.TestCase):"},{"line_number":113,"context_line":"    def _run_bytes_through_protocol(self, bytes_from_client):"}],"source_content_type":"text/x-python","patch_set":1,"id":"db076f3e_55a755d6","side":"PARENT","line":110,"in_reply_to":"ea3b3948_7e121d66","updated":"2022-12-06 21:51:19.000000000","message":"yeah, i think _run_bytes_through_protocol is better - KUDOS","commit_id":"597887dedcf1f2c855edfd1c591d4f30222be580"}]}
