)]}'
{"swift/common/middleware/encrypter.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"522cecdd97f367105d15d3a4de4902c6e48ae379","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            path_ver, path_acc, path_cont, path_obj)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        if not req.headers[\u0027Content-Type\u0027]:"},{"line_number":203,"context_line":"            guessed_type, _junk \u003d mimetypes.guess_type(path_info)"},{"line_number":204,"context_line":"            req.headers[\u0027Content-Type\u0027] \u003d guessed_type or \\"},{"line_number":205,"context_line":"                \u0027application/octet-stream\u0027"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_caf16603","line":203,"updated":"2015-10-01 23:43:29.000000000","message":"Any reason we can\u0027t use req.path_info, and drop the path splitting and joining? Otherwise, it looks pretty spot-on for how the obj controller does it at https://github.com/openstack/swift/blob/2.4.0/swift/proxy/controllers/obj.py#L516","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b589687d8e86ece6b3a04e3e31d01b99420526f1","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            path_ver, path_acc, path_cont, path_obj)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        if not req.headers[\u0027Content-Type\u0027]:"},{"line_number":203,"context_line":"            guessed_type, _junk \u003d mimetypes.guess_type(path_info)"},{"line_number":204,"context_line":"            req.headers[\u0027Content-Type\u0027] \u003d guessed_type or \\"},{"line_number":205,"context_line":"                \u0027application/octet-stream\u0027"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_8dbb7175","line":203,"in_reply_to":"9a1a9d01_caf16603","updated":"2015-10-02 06:33:37.000000000","message":"Done","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"d9a63753532fd7d64468a131c4d0d8d01425a57f","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # guess content-type if it is not in headers"},{"line_number":197,"context_line":"        if not req.headers[\u0027Content-Type\u0027]:"},{"line_number":198,"context_line":"            guessed_type, _junk \u003d mimetypes.guess_type(req.path_info)"},{"line_number":199,"context_line":"            req.headers[\u0027Content-Type\u0027] \u003d guessed_type or \\"},{"line_number":200,"context_line":"                \u0027application/octet-stream\u0027"},{"line_number":201,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"9a1a9d01_723b559d","line":198,"updated":"2015-10-02 08:28:28.000000000","message":"I have spent little time on this so forgive me if I am confusing matters, but looking at https://github.com/openstack/swift/blob/2.4.0/swift/proxy/controllers/obj.py#L510 I see there is also a possible x-detect-content-type header and if I read it correctly, if that header is true then the obj controller will guess content type again and overwrite whatever has been done here (with plain text!)\n\nSo I wonder if you could take the method at https://github.com/openstack/swift/blob/2.4.0/swift/proxy/controllers/obj.py#L510, refactor it to a function in request_helpers.py, and then just re-use it here? That way the encrypter does exactly what the object controller would have done.\n\nAlso, any tests should include setting the x-detect-content-type header true/false and checking we always get encrypted content type.","commit_id":"a11655d60cd31ddbc4826b8e0362983e9206dbdb"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c02e266f697882f4b42fd9848534398e89ce8df0","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        update_content_type(req)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        ct \u003d req.headers.get(\u0027Content-Type\u0027)"},{"line_number":199,"context_line":"        if ct:"},{"line_number":200,"context_line":"            ct_iv \u003d self.crypto.create_iv()"},{"line_number":201,"context_line":"            ct_crypto_meta \u003d get_crypto_meta(ct_iv, self.crypto.get_cipher())"},{"line_number":202,"context_line":"            req.headers[\u0027Content-Type\u0027], junk \u003d encrypt_header_val("}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_1622ca52","line":199,"updated":"2015-10-07 18:33:31.000000000","message":"Shouldn\u0027t this always be set now? Wasn\u0027t that the whole point of update_content_type?\n\nSo I think we can leave it at\n\n ct \u003d req.headers[\u0027Content-Type\u0027]\n\n(no need to be defensive with the .get), drop the\n\n if ct:\n\nand reclaim some margin.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        update_content_type(req)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"        ct \u003d req.headers.get(\u0027Content-Type\u0027)"},{"line_number":199,"context_line":"        if ct:"},{"line_number":200,"context_line":"            ct_iv \u003d self.crypto.create_iv()"},{"line_number":201,"context_line":"            ct_crypto_meta \u003d get_crypto_meta(ct_iv, self.crypto.get_cipher())"},{"line_number":202,"context_line":"            req.headers[\u0027Content-Type\u0027], junk \u003d encrypt_header_val("}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_9e124c08","line":199,"in_reply_to":"7a2fa921_1622ca52","updated":"2015-10-08 12:49:15.000000000","message":"Agreed. Will change.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"}],"swift/common/request_helpers.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c02e266f697882f4b42fd9848534398e89ce8df0","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    param req: request object"},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    req.content_type_manually_set \u003d True"},{"line_number":93,"context_line":"    detect_content_type \u003d \\"},{"line_number":94,"context_line":"        config_true_value(req.headers.get(\u0027x-detect-content-type\u0027))"},{"line_number":95,"context_line":"    if detect_content_type or not req.headers.get(\u0027content-type\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_b3e1a8d2","line":92,"updated":"2015-10-07 18:33:31.000000000","message":"I\u0027m a little worried about dangling this off the req, instead of stuffing it into req.environ. Can the proxy still see it if middleware calls this first? If not, how much does it matter?\n\nSpeaking of multiple calls, can we make this idempotent? It seems like if we call it repeatedly, every call after the first will think the content-type was manually set.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    param req: request object"},{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    req.content_type_manually_set \u003d True"},{"line_number":93,"context_line":"    detect_content_type \u003d \\"},{"line_number":94,"context_line":"        config_true_value(req.headers.get(\u0027x-detect-content-type\u0027))"},{"line_number":95,"context_line":"    if detect_content_type or not req.headers.get(\u0027content-type\u0027):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_3efbf87a","line":92,"in_reply_to":"7a2fa921_b3e1a8d2","updated":"2015-10-08 12:49:15.000000000","message":"Update_content_type is called once on PUT in obj controller and now in crypto middleware. req.content_type_manually_set is called only for copy: https://github.com/openstack/swift/blob/2.4.0/swift/proxy/controllers/obj.py#L470 (which should also be similar in encrypter when COPY is implemented)\n\nI think proxy wouldn\u0027t have an issue with that.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        if detect_content_type:"},{"line_number":100,"context_line":"            req.headers.pop(\u0027x-detect-content-type\u0027)"},{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            req.content_type_manually_set \u003d False"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"def get_name_and_placement(request, minsegs\u003d1, maxsegs\u003dNone,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_713f6187","line":102,"updated":"2015-10-08 12:49:15.000000000","message":"But I think this else is not needed and should be set to False in the beginning of this function. That\u0027s because this value is True in both cases -(if detect_content_type or not req.headers.get(\u0027content-type\u0027). We are using this value in COPY.\n\nInputs on this are welcome.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"}],"test/functional/tests.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"a610ef4700560766ce6535d5147e241fd54282d8","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"            files.append({\u0027name\u0027: Utils.create_ascii_name(),"},{"line_number":1657,"context_line":"                          \u0027content_type\u0027: Utils.create_ascii_name(),"},{"line_number":1658,"context_line":"                          \u0027bytes\u0027: i})"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        write_time \u003d time.time()"},{"line_number":1661,"context_line":"        for f in files:"},{"line_number":1662,"context_line":"            file_item \u003d container.file(f[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_cfcf3828","line":1659,"updated":"2015-10-01 15:58:19.000000000","message":"I am curious why \"create_name\" was used before.  Is it ok to restrict this test to using an ascii name?  Maybe we are supposed to handle more than ascii here.","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b589687d8e86ece6b3a04e3e31d01b99420526f1","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"            files.append({\u0027name\u0027: Utils.create_ascii_name(),"},{"line_number":1657,"context_line":"                          \u0027content_type\u0027: Utils.create_ascii_name(),"},{"line_number":1658,"context_line":"                          \u0027bytes\u0027: i})"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        write_time \u003d time.time()"},{"line_number":1661,"context_line":"        for f in files:"},{"line_number":1662,"context_line":"            file_item \u003d container.file(f[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_eda6ad52","line":1659,"in_reply_to":"9a1a9d01_6aedbaee","updated":"2015-10-02 06:33:37.000000000","message":"Thanks! I assumed ascii was the way to go for \"name\" and \"content-type\". This should be fixed.","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"0d11b0030d03608ff4604c49b3ac424d68b3bc64","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"            files.append({\u0027name\u0027: Utils.create_ascii_name(),"},{"line_number":1657,"context_line":"                          \u0027content_type\u0027: Utils.create_ascii_name(),"},{"line_number":1658,"context_line":"                          \u0027bytes\u0027: i})"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        write_time \u003d time.time()"},{"line_number":1661,"context_line":"        for f in files:"},{"line_number":1662,"context_line":"            file_item \u003d container.file(f[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_dd8049fa","line":1659,"in_reply_to":"9a1a9d01_b271047a","updated":"2015-10-01 18:40:47.000000000","message":"I think that means we should be able to handle utf8, in that case.  So, crypto needs to do something smarter so that it will work with utf8 as well as ascii.\n\nYou can double check with acoles, but it sounds like we really need to keep the utf8 test case and change or crypto code to correctly handle that.","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"63029742d3d642c918897f348abe9996fdd3478d","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"            files.append({\u0027name\u0027: Utils.create_ascii_name(),"},{"line_number":1657,"context_line":"                          \u0027content_type\u0027: Utils.create_ascii_name(),"},{"line_number":1658,"context_line":"                          \u0027bytes\u0027: i})"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        write_time \u003d time.time()"},{"line_number":1661,"context_line":"        for f in files:"},{"line_number":1662,"context_line":"            file_item \u003d container.file(f[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_b271047a","line":1659,"in_reply_to":"9a1a9d01_cfcf3828","updated":"2015-10-01 18:15:57.000000000","message":"\"create_name\" leads to \"create_utf8_name\" which was causing an issue. Since crypto tries to encode it again with utf-8 in \"process_xml_response\". that is where it was failing initially.","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"522cecdd97f367105d15d3a4de4902c6e48ae379","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"            files.append({\u0027name\u0027: Utils.create_ascii_name(),"},{"line_number":1657,"context_line":"                          \u0027content_type\u0027: Utils.create_ascii_name(),"},{"line_number":1658,"context_line":"                          \u0027bytes\u0027: i})"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        write_time \u003d time.time()"},{"line_number":1661,"context_line":"        for f in files:"},{"line_number":1662,"context_line":"            file_item \u003d container.file(f[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_6aedbaee","line":1659,"in_reply_to":"9a1a9d01_cfcf3828","updated":"2015-10-01 23:43:29.000000000","message":"I agree with Janie. As a general rule, we need to be able to handle non-ascii object names. Restricting content-type is a bit more defensible, but swift certainly allows it currently.\n\nThis likely means that we\u0027ll have to do some decoding, though. Which in turn means that we\u0027ll probably want to run the path through swift.common.constraints.check_utf8 before the proxy would (down in swift/proxy/server.py).","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"},{"author":{"_account_id":17156,"name":"Hamdi Roumani","email":"roumani@ca.ibm.com","username":"hroumani"},"change_message_id":"eaeb74741edd0eaf183a84663262e042b847a8f6","unresolved":false,"context_lines":[{"line_number":1656,"context_line":"            files.append({\u0027name\u0027: Utils.create_ascii_name(),"},{"line_number":1657,"context_line":"                          \u0027content_type\u0027: Utils.create_ascii_name(),"},{"line_number":1658,"context_line":"                          \u0027bytes\u0027: i})"},{"line_number":1659,"context_line":""},{"line_number":1660,"context_line":"        write_time \u003d time.time()"},{"line_number":1661,"context_line":"        for f in files:"},{"line_number":1662,"context_line":"            file_item \u003d container.file(f[\u0027name\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a1a9d01_8319147c","line":1659,"in_reply_to":"9a1a9d01_dd8049fa","updated":"2015-10-01 19:17:26.000000000","message":"Right agreed !  Similar to what Tim pointed out about how we were encoding (and how that could be a problem in py27) which I\u0027m looking into.  But this is a good catch i.e. namely the XML code as well.\n\nSo yea I\u0027d leave this for now as is, but le\u0027s check with acoles to see if we\u0027re going down the right road.","commit_id":"60e583c61fdcc49dd7c226174d1c1849dedbfcc2"}],"test/unit/common/middleware/test_content_type_encryption.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a0e1e3831e9239bc6a3041898b097e5ad22626f3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"7a2fa921_573fc086","updated":"2015-10-08 09:55:05.000000000","message":"these tests should go in common/middleware/test_encrypter - by convention, tests for a module foo go in test_foo.py","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"7a2fa921_51202548","in_reply_to":"7a2fa921_573fc086","updated":"2015-10-08 12:49:15.000000000","message":"Will change","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a0e1e3831e9239bc6a3041898b097e5ad22626f3","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from swift.common.middleware import encrypter"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def set_http_connect(*args, **kwargs):"},{"line_number":28,"context_line":"    new_connect \u003d fake_http_connect(*args, **kwargs)"},{"line_number":29,"context_line":"    swift.proxy.controllers.base.http_connect \u003d new_connect"},{"line_number":30,"context_line":"    swift.proxy.controllers.obj.http_connect \u003d new_connect"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_37200448","line":27,"updated":"2015-10-08 09:55:05.000000000","message":"this looks to be the same as function is proxy/test_server.py so either import from there or move to test/unit/__init__.py and import from there in both cases.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"from swift.common.middleware import encrypter"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"def set_http_connect(*args, **kwargs):"},{"line_number":28,"context_line":"    new_connect \u003d fake_http_connect(*args, **kwargs)"},{"line_number":29,"context_line":"    swift.proxy.controllers.base.http_connect \u003d new_connect"},{"line_number":30,"context_line":"    swift.proxy.controllers.obj.http_connect \u003d new_connect"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_715681cf","line":27,"in_reply_to":"7a2fa921_37200448","updated":"2015-10-08 12:49:15.000000000","message":"Will change.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a0e1e3831e9239bc6a3041898b097e5ad22626f3","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    return new_connect"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class TestEncrypterContentType(unittest.TestCase):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def setUp(self):"},{"line_number":39,"context_line":"        self.proxy_app \u003d proxy_server.Application("}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_57db404f","line":36,"updated":"2015-10-08 09:55:05.000000000","message":"you will need the patch_policies decorator e.g. test.unit.proxy.test_server.TestObjectController\n\nA bare @patch_policies will probably suffice","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    return new_connect"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class TestEncrypterContentType(unittest.TestCase):"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def setUp(self):"},{"line_number":39,"context_line":"        self.proxy_app \u003d proxy_server.Application("}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_f16a9180","line":36,"in_reply_to":"7a2fa921_57db404f","updated":"2015-10-08 12:49:15.000000000","message":"Will change. But I\u0027m not sure how to test this (since it passes on my local without this). Will push a change with bare decorator and see.","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a0e1e3831e9239bc6a3041898b097e5ad22626f3","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        req.get_response(self.app)"},{"line_number":67,"context_line":"        self.assertTrue(any(strip_sys_meta_prefix("},{"line_number":68,"context_line":"            \u0027Object\u0027, key).lower().startswith("},{"line_number":69,"context_line":"            \u0027crypto-meta-content-type\u0027) for key in req.headers))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_PUT_no_content_type(self):"},{"line_number":72,"context_line":"        # Tests content-type is guessed and encrypted when none is supplied"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_77851c05","line":69,"updated":"2015-10-08 09:55:05.000000000","message":"don\u0027t we want to verify that the content-type header is no longer plain text?","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":66,"context_line":"        req.get_response(self.app)"},{"line_number":67,"context_line":"        self.assertTrue(any(strip_sys_meta_prefix("},{"line_number":68,"context_line":"            \u0027Object\u0027, key).lower().startswith("},{"line_number":69,"context_line":"            \u0027crypto-meta-content-type\u0027) for key in req.headers))"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def test_PUT_no_content_type(self):"},{"line_number":72,"context_line":"        # Tests content-type is guessed and encrypted when none is supplied"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_31fc89b7","line":69,"in_reply_to":"7a2fa921_77851c05","updated":"2015-10-08 12:49:15.000000000","message":"Will change","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a0e1e3831e9239bc6a3041898b097e5ad22626f3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        req.get_response(self.app)"},{"line_number":80,"context_line":"        self.assertTrue(any(strip_sys_meta_prefix("},{"line_number":81,"context_line":"            \u0027Object\u0027, key).lower().startswith("},{"line_number":82,"context_line":"            \u0027crypto-meta-content-type\u0027) for key in req.headers))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_b796543d","line":82,"updated":"2015-10-08 09:55:05.000000000","message":"ditto - verify no plain text in content-type","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"b1d00cd77b6d3c1fd118218159604cb26e6cfc3b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        req.get_response(self.app)"},{"line_number":80,"context_line":"        self.assertTrue(any(strip_sys_meta_prefix("},{"line_number":81,"context_line":"            \u0027Object\u0027, key).lower().startswith("},{"line_number":82,"context_line":"            \u0027crypto-meta-content-type\u0027) for key in req.headers))"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a2fa921_11ff0dab","line":82,"in_reply_to":"7a2fa921_b796543d","updated":"2015-10-08 12:49:15.000000000","message":"Will change","commit_id":"c46617e042ae8132a0bf4107a64af1d7c8462a6f"}]}
