)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"dbe7a06e_3a53c418","updated":"2025-10-01 19:52:26.000000000","message":"This definitely seems like a step in the right direction, but I\u0027m not convinced that it goes far enough. What do we think about adding on https://review.opendev.org/c/openstack/swift/+/962718 as well?","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"9cfd3d371c09a5f6ba9c0435e028e7cc5f401e45","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"d1570784_749e0d61","in_reply_to":"dbe7a06e_3a53c418","updated":"2025-11-13 17:44:44.000000000","message":"@alistairncoles@gmail.com ping -- I think combined with the follow-up, we\u0027re good to merge.","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6404b7736486f67dd34ea4bee08a60071c745b38","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"c2f56266_fa7489dc","updated":"2025-11-17 15:09:11.000000000","message":"@tburke@nvidia.com ack, I squashed in your patch, thanks","commit_id":"cbc3b42d7d8d9280b415f909bce05332689cdf21"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"f3303947c7e88ba649c945f73b94ed27bcf6b11d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"7c0d9689_e75eeb09","updated":"2025-11-17 16:45:38.000000000","message":"recheck\nhttps://bugs.launchpad.net/swift/+bug/2131684","commit_id":"cbc3b42d7d8d9280b415f909bce05332689cdf21"}],"swift/common/middleware/s3api/controllers/multi_delete.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2ffbf075e6ca2d9eabb8136425c9cf3db91a6cc","unresolved":true,"context_lines":[{"line_number":78,"context_line":"                raise MissingRequestBodyError()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            if \u0027x-amz-content-sha256\u0027 in req.headers:"},{"line_number":81,"context_line":"                req.check_md5(xml)"},{"line_number":82,"context_line":"            else:"},{"line_number":83,"context_line":"                # SHA256 got checked when we read the body, so there\u0027s at"},{"line_number":84,"context_line":"                # least *some* verification. Recent versions of boto3 stopped"}],"source_content_type":"text/x-python","patch_set":1,"id":"bcd3763b_8a5c07f9","line":81,"updated":"2025-06-13 16:18:19.000000000","message":"this is sort-of drive-by - turns out we weren\u0027t checking md5 some times when s3 does - ideally this would get some unit test coverage","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6404b7736486f67dd34ea4bee08a60071c745b38","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                raise MissingRequestBodyError()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            if \u0027x-amz-content-sha256\u0027 in req.headers:"},{"line_number":81,"context_line":"                req.check_md5(xml)"},{"line_number":82,"context_line":"            else:"},{"line_number":83,"context_line":"                # SHA256 got checked when we read the body, so there\u0027s at"},{"line_number":84,"context_line":"                # least *some* verification. Recent versions of boto3 stopped"}],"source_content_type":"text/x-python","patch_set":1,"id":"9c61fa69_4f58dd44","line":81,"in_reply_to":"bcd3763b_8a5c07f9","updated":"2025-11-17 15:09:11.000000000","message":"Acknowledged","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7a32a5b533c515cf827e73e6ed19381a09379337","unresolved":true,"context_lines":[{"line_number":83,"context_line":"                # SHA256 got checked when we read the body, so there\u0027s at"},{"line_number":84,"context_line":"                # least *some* verification. Recent versions of boto3 stopped"},{"line_number":85,"context_line":"                # sending Content-MD5, so it can\u0027t *always* be required."},{"line_number":86,"context_line":"                # See https://bugs.launchpad.net/swift/+bug/2098529"},{"line_number":87,"context_line":"                req.require_md5(xml)"},{"line_number":88,"context_line":"            elem \u003d fromstring(xml, \u0027Delete\u0027, self.logger)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5658c10a_59161dde","line":86,"updated":"2025-06-12 14:04:54.000000000","message":"hmmm, maybe the comment should be in the if clause","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c748666f9c20a1b7a9283976937f610fbb470df6","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                # SHA256 got checked when we read the body, so there\u0027s at"},{"line_number":84,"context_line":"                # least *some* verification. Recent versions of boto3 stopped"},{"line_number":85,"context_line":"                # sending Content-MD5, so it can\u0027t *always* be required."},{"line_number":86,"context_line":"                # See https://bugs.launchpad.net/swift/+bug/2098529"},{"line_number":87,"context_line":"                req.require_md5(xml)"},{"line_number":88,"context_line":"            elem \u003d fromstring(xml, \u0027Delete\u0027, self.logger)"},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"cff3ec13_efa9b394","line":86,"in_reply_to":"5658c10a_59161dde","updated":"2025-07-18 09:38:09.000000000","message":"Done","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":true,"context_lines":[{"line_number":77,"context_line":"            if not xml:"},{"line_number":78,"context_line":"                raise MissingRequestBodyError()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            if \u0027x-amz-content-sha256\u0027 in req.headers:"},{"line_number":81,"context_line":"                # SHA256 got checked when we read the body, so there\u0027s at"},{"line_number":82,"context_line":"                # least *some* verification. Recent versions of boto3 stopped"},{"line_number":83,"context_line":"                # sending Content-MD5, so it can\u0027t *always* be required."}],"source_content_type":"text/x-python","patch_set":4,"id":"ffc6a246_394c0fba","line":80,"updated":"2025-10-01 19:52:26.000000000","message":"So the more I dig into this, the less certain I am that `x-amz-content-sha256` should be anywhere involved in deciding whether we should emit the missing-required-header message. This was a useful CYA we did back when we didn\u0027t support checksum verification, but it\u0027s not what AWS does or expects.","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6404b7736486f67dd34ea4bee08a60071c745b38","unresolved":false,"context_lines":[{"line_number":77,"context_line":"            if not xml:"},{"line_number":78,"context_line":"                raise MissingRequestBodyError()"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"            if \u0027x-amz-content-sha256\u0027 in req.headers:"},{"line_number":81,"context_line":"                # SHA256 got checked when we read the body, so there\u0027s at"},{"line_number":82,"context_line":"                # least *some* verification. Recent versions of boto3 stopped"},{"line_number":83,"context_line":"                # sending Content-MD5, so it can\u0027t *always* be required."}],"source_content_type":"text/x-python","patch_set":4,"id":"89cc5b90_cf21ad2b","line":80,"in_reply_to":"ffc6a246_394c0fba","updated":"2025-11-17 15:09:11.000000000","message":"Done - squashed in follow-up","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"}],"swift/common/middleware/s3api/controllers/multi_upload.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2ffbf075e6ca2d9eabb8136425c9cf3db91a6cc","unresolved":true,"context_lines":[{"line_number":698,"context_line":"            if not xml:"},{"line_number":699,"context_line":"                raise InvalidRequest(msg\u003d\u0027You must specify at least one part\u0027)"},{"line_number":700,"context_line":"            # If an MD5 was provided, we need to verify it."},{"line_number":701,"context_line":"            req.check_md5(xml)"},{"line_number":702,"context_line":"            # We\u0027re only interested in the body here, in the"},{"line_number":703,"context_line":"            # multipart-upload controller -- *don\u0027t* let etag get"},{"line_number":704,"context_line":"            # plumbed down to the object-server"}],"source_content_type":"text/x-python","patch_set":1,"id":"2f88f0c3_89f08a27","line":701,"updated":"2025-06-13 16:18:19.000000000","message":"this is just a refactor (or should be!)","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c748666f9c20a1b7a9283976937f610fbb470df6","unresolved":false,"context_lines":[{"line_number":698,"context_line":"            if not xml:"},{"line_number":699,"context_line":"                raise InvalidRequest(msg\u003d\u0027You must specify at least one part\u0027)"},{"line_number":700,"context_line":"            # If an MD5 was provided, we need to verify it."},{"line_number":701,"context_line":"            req.check_md5(xml)"},{"line_number":702,"context_line":"            # We\u0027re only interested in the body here, in the"},{"line_number":703,"context_line":"            # multipart-upload controller -- *don\u0027t* let etag get"},{"line_number":704,"context_line":"            # plumbed down to the object-server"}],"source_content_type":"text/x-python","patch_set":1,"id":"0dd2a94e_a0a9c721","line":701,"in_reply_to":"2f88f0c3_89f08a27","updated":"2025-07-18 09:38:09.000000000","message":"Done","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":false,"context_lines":[{"line_number":698,"context_line":"            if not xml:"},{"line_number":699,"context_line":"                raise InvalidRequest(msg\u003d\u0027You must specify at least one part\u0027)"},{"line_number":700,"context_line":"            # If an MD5 was provided, we need to verify it."},{"line_number":701,"context_line":"            if req.check_md5(xml):"},{"line_number":702,"context_line":"                # We\u0027re only interested in the body here, in the"},{"line_number":703,"context_line":"                # multipart-upload controller -- *don\u0027t* let etag get"},{"line_number":704,"context_line":"                # plumbed down to the object-server"}],"source_content_type":"text/x-python","patch_set":4,"id":"51d72cd5_12f4bff4","line":701,"updated":"2025-10-01 19:52:26.000000000","message":"Nice; yeah, much better to have that check-md5-and-maybe-raise-`BadDigest` in one place.","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"}],"swift/common/middleware/s3api/s3request.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c2ffbf075e6ca2d9eabb8136425c9cf3db91a6cc","unresolved":true,"context_lines":[{"line_number":1072,"context_line":"                verify_checksum \u003d True"},{"line_number":1073,"context_line":"            elif self.method \u003d\u003d \u0027POST\u0027:"},{"line_number":1074,"context_line":"                if \u0027delete\u0027 in self.params:"},{"line_number":1075,"context_line":"                    verify_checksum \u003d True"},{"line_number":1076,"context_line":"                else:"},{"line_number":1077,"context_line":"                    # S3 doesn\u0027t check the checksum for some POSTs (e.g. MPU"},{"line_number":1078,"context_line":"                    # complete)"}],"source_content_type":"text/x-python","patch_set":1,"id":"6d8f2195_29881d68","line":1075,"updated":"2025-06-13 16:18:19.000000000","message":"needs unit test coverage","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"c748666f9c20a1b7a9283976937f610fbb470df6","unresolved":false,"context_lines":[{"line_number":1072,"context_line":"                verify_checksum \u003d True"},{"line_number":1073,"context_line":"            elif self.method \u003d\u003d \u0027POST\u0027:"},{"line_number":1074,"context_line":"                if \u0027delete\u0027 in self.params:"},{"line_number":1075,"context_line":"                    verify_checksum \u003d True"},{"line_number":1076,"context_line":"                else:"},{"line_number":1077,"context_line":"                    # S3 doesn\u0027t check the checksum for some POSTs (e.g. MPU"},{"line_number":1078,"context_line":"                    # complete)"}],"source_content_type":"text/x-python","patch_set":1,"id":"e7a757e0_2049eab6","line":1075,"in_reply_to":"6d8f2195_29881d68","updated":"2025-07-18 09:38:09.000000000","message":"Done","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":true,"context_lines":[{"line_number":1716,"context_line":"    def require_md5(self, body):"},{"line_number":1717,"context_line":"        if \u0027HTTP_CONTENT_MD5\u0027 not in self.environ:"},{"line_number":1718,"context_line":"            raise InvalidRequest(\u0027Missing required header for this request: \u0027"},{"line_number":1719,"context_line":"                                 \u0027Content-MD5\u0027)"},{"line_number":1720,"context_line":"        self.check_md5(body)"},{"line_number":1721,"context_line":""},{"line_number":1722,"context_line":"    def _copy_source_headers(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"21f23f49_616a606b","line":1719,"updated":"2025-10-01 19:52:26.000000000","message":"Apparently the message is now\n\n\u003e Missing required header for this request: Content-MD5 OR x-amz-checksum-*","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6404b7736486f67dd34ea4bee08a60071c745b38","unresolved":false,"context_lines":[{"line_number":1716,"context_line":"    def require_md5(self, body):"},{"line_number":1717,"context_line":"        if \u0027HTTP_CONTENT_MD5\u0027 not in self.environ:"},{"line_number":1718,"context_line":"            raise InvalidRequest(\u0027Missing required header for this request: \u0027"},{"line_number":1719,"context_line":"                                 \u0027Content-MD5\u0027)"},{"line_number":1720,"context_line":"        self.check_md5(body)"},{"line_number":1721,"context_line":""},{"line_number":1722,"context_line":"    def _copy_source_headers(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"0f363d30_e998bda7","line":1719,"in_reply_to":"21f23f49_616a606b","updated":"2025-11-17 15:09:11.000000000","message":"Done - squashed in follow up","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"}],"test/s3api/test_input_errors.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"7a32a5b533c515cf827e73e6ed19381a09379337","unresolved":true,"context_lines":[{"line_number":170,"context_line":"        # S3 v2 seems to require ?key (without value) for valueless params and"},{"line_number":171,"context_line":"        # Swift\u0027s sigv2 seems happy with either ?key or ?key\u003d\u003ctruthy\u003e"},{"line_number":172,"context_line":"        return \u0027\u0026\u0027.join((\u0027%s\u0027 % k) if v is True else (\u0027%s\u003d%s\u0027 % (k, v))"},{"line_number":173,"context_line":"                        for k, v in sorted(query.items()))"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def build_request("},{"line_number":176,"context_line":"        self,"}],"source_content_type":"text/x-python","patch_set":1,"id":"8b8d503a_ff36e64f","line":173,"updated":"2025-06-12 14:04:54.000000000","message":"it took me a lot of time trying to figure out why v2 vs v4 tests failed against s3 vs swift :/\n\nI\u0027m not sure I like the ``if v is True`` part - Any one got a better idea?","commit_id":"d65b17e03c474112ab26c6d4457c67d2ed19c2ea"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":true,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"class S3SessionV2(S3Session):"},{"line_number":187,"context_line":"    def _query_string(self, query):"},{"line_number":188,"context_line":"        # S3 v2 seems to require ?key (without value) for valueless params and"},{"line_number":189,"context_line":"        # Swift\u0027s sigv2 seems happy with either ?key or ?key\u003d\u003ctruthy\u003e"},{"line_number":190,"context_line":"        return \u0027\u0026\u0027.join((\u0027%s\u0027 % k) if v is True else (\u0027%s\u003d%s\u0027 % (k, v))"}],"source_content_type":"text/x-python","patch_set":4,"id":"d47c629c_5e1b5cdd","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":21},"updated":"2025-10-01 19:52:26.000000000","message":"We should probably stub this out (and have it just `raise NotImplementedError`, like `date_to_sign` and `sign_request`) up in `S3Session`. Would also be a fine spot to highlight that it should **not** include the leading `?` in its return value.","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"6404b7736486f67dd34ea4bee08a60071c745b38","unresolved":false,"context_lines":[{"line_number":184,"context_line":""},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"class S3SessionV2(S3Session):"},{"line_number":187,"context_line":"    def _query_string(self, query):"},{"line_number":188,"context_line":"        # S3 v2 seems to require ?key (without value) for valueless params and"},{"line_number":189,"context_line":"        # Swift\u0027s sigv2 seems happy with either ?key or ?key\u003d\u003ctruthy\u003e"},{"line_number":190,"context_line":"        return \u0027\u0026\u0027.join((\u0027%s\u0027 % k) if v is True else (\u0027%s\u003d%s\u0027 % (k, v))"}],"source_content_type":"text/x-python","patch_set":4,"id":"bdb81e30_3aa74b64","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":21},"in_reply_to":"d47c629c_5e1b5cdd","updated":"2025-11-17 15:09:11.000000000","message":"Done","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":true,"context_lines":[{"line_number":305,"context_line":"class S3SessionV4(S3Session):"},{"line_number":306,"context_line":"    def _query_string(self, query):"},{"line_number":307,"context_line":"        # S3 v4 seems happy to receive either ?key or ?key\u003d\u003ctruthy\u003e for"},{"line_number":308,"context_line":"        # valueless params but Swift\u0027s sigv4 checking expects ?key\u003d\u003ctruthy\u003e"},{"line_number":309,"context_line":"        return \u0027\u0026\u0027.join(\u0027%s\u003d%s\u0027 % (k, v) for k, v in sorted(query.items()))"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"    def sign_v4(self, request):"}],"source_content_type":"text/x-python","patch_set":4,"id":"f1981f35_22c89fa6","line":308,"updated":"2025-10-01 19:52:26.000000000","message":"We should probably write up a bug for this -- surely it\u0027s just a matter of time until we encounter some client that only wants to send `?key`","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":false,"context_lines":[{"line_number":1721,"context_line":"                \u0027x-amz-checksum-crc32\u0027: _crc32(delete_request_body),"},{"line_number":1722,"context_line":"            }"},{"line_number":1723,"context_line":"        )"},{"line_number":1724,"context_line":"        self.assertBadDigest("},{"line_number":1725,"context_line":"            resp, _md5(b\u0027not the body\u0027), _md5(delete_request_body),"},{"line_number":1726,"context_line":"            expected_digest_should_be_hex\u003dFalse)"},{"line_number":1727,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"4d64a1bf_9828ddb3","line":1724,"updated":"2025-10-01 19:52:26.000000000","message":"Right; fails on master, which gets back a 200.","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"320c068cb266743d33817b7cea2ab8c851d004cd","unresolved":false,"context_lines":[{"line_number":1756,"context_line":"                \u0027x-amz-checksum-crc32\u0027: _crc32(b\u0027not the body\u0027),"},{"line_number":1757,"context_line":"            }"},{"line_number":1758,"context_line":"        )"},{"line_number":1759,"context_line":"        self.assertBadChecksumDigest(resp, \u0027CRC32\u0027, _crc32(b\u0027not the body\u0027))"},{"line_number":1760,"context_line":""},{"line_number":1761,"context_line":""},{"line_number":1762,"context_line":"class TestV4AuthHeaders(InputErrorsMixin, BaseS3TestCaseWithBucket):"}],"source_content_type":"text/x-python","patch_set":4,"id":"833e11e4_abcf9d07","line":1759,"updated":"2025-10-01 19:52:26.000000000","message":"And similarly here.","commit_id":"dd9b21195e777b820fc32c7976ea5f68315e5521"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0bf09b04ea33eca00f39533332d845fa6a0d373f","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        self.session_token \u003d session_token"},{"line_number":103,"context_line":"        self.session \u003d requests.Session()"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def _query_string(self, query):"},{"line_number":106,"context_line":"        \"\"\""},{"line_number":107,"context_line":"        Compose a dict of query parameters into an appropriately formated query"},{"line_number":108,"context_line":"        string. The returned query string does NOT have a leading \u0027?\u0027."}],"source_content_type":"text/x-python","patch_set":6,"id":"57774a06_52b8093d","line":105,"updated":"2025-11-17 17:13:54.000000000","message":"Thanks!","commit_id":"cbc3b42d7d8d9280b415f909bce05332689cdf21"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0bf09b04ea33eca00f39533332d845fa6a0d373f","unresolved":false,"context_lines":[{"line_number":560,"context_line":"        if expected_body is not None:"},{"line_number":561,"context_line":"            self.assertEqual(resp.content, expected_body)"},{"line_number":562,"context_line":""},{"line_number":563,"context_line":"    def assertMissingMD5OrChecksumHeader(self, resp):"},{"line_number":564,"context_line":"        self.assertEqual(resp.status_code, 400, resp.content)"},{"line_number":565,"context_line":"        self.assertIn(b\u0027\u003cCode\u003eInvalidRequest\u003c/Code\u003e\u0027, resp.content)"},{"line_number":566,"context_line":"        self.assertIn(b\u0027\u003cMessage\u003eMissing required header for this request: \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"951c1ef2_8cccda39","line":563,"updated":"2025-11-17 17:13:54.000000000","message":"Good call.","commit_id":"cbc3b42d7d8d9280b415f909bce05332689cdf21"}]}
