)]}'
{"swift/common/middleware/encrypter.py":[{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"c6916d544f2dd43ba67d5893597032f9b0958b39","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # etag values. Since footers_callback is called after streaming,"},{"line_number":95,"context_line":"        # incomplete read check is being done here"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            if self.wsgi_input.read():"},{"line_number":98,"context_line":"                data \u003d iter(self.wsgi_input.read())"},{"line_number":99,"context_line":"                while True:"},{"line_number":100,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_7d5cff7c","line":97,"updated":"2016-02-06 19:15:06.000000000","message":"We don\u0027t want to do the streaming in this callback.  The only thing to move to this callback is the final call to calculate the etag, which is : self.plaintext_etag \u003d self.plaintext_etag.hexdigest()  and the other items that are done after that line which set or log anything in \"footers_to_add\".  The rest should stay as is in the readChunk() method.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"2d4cf283df8b3ead979aadc7cdc4c9153030d751","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # etag values. Since footers_callback is called after streaming,"},{"line_number":95,"context_line":"        # incomplete read check is being done here"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            if self.wsgi_input.read():"},{"line_number":98,"context_line":"                data \u003d iter(self.wsgi_input.read())"},{"line_number":99,"context_line":"                while True:"},{"line_number":100,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_fddf8fd3","line":97,"in_reply_to":"5a5ae5dd_7d5cff7c","updated":"2016-02-06 19:19:46.000000000","message":"readChunk method still has streaming. This is to make sure the entire data is consumed if it is not for any reason. Would we not want the etag of entire object, even if it is partially read?","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a18c1194c1c691b68988c49f4a12b6958e2aa5b","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # etag values. Since footers_callback is called after streaming,"},{"line_number":95,"context_line":"        # incomplete read check is being done here"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            if self.wsgi_input.read():"},{"line_number":98,"context_line":"                data \u003d iter(self.wsgi_input.read())"},{"line_number":99,"context_line":"                while True:"},{"line_number":100,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_c0508f0d","line":97,"in_reply_to":"5a5ae5dd_dda97325","updated":"2016-04-08 09:51:46.000000000","message":"I don\u0027t see much point reading the remainder of the stream and updating the etags, if any stream remains then the etags we then send as footers would not agree with what the proxy read from here.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"59280b64ced91c9224528a1326d672cfdd758d11","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        # etag values. Since footers_callback is called after streaming,"},{"line_number":95,"context_line":"        # incomplete read check is being done here"},{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            if self.wsgi_input.read():"},{"line_number":98,"context_line":"                data \u003d iter(self.wsgi_input.read())"},{"line_number":99,"context_line":"                while True:"},{"line_number":100,"context_line":"                    try:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_dda97325","line":97,"in_reply_to":"5a5ae5dd_fddf8fd3","updated":"2016-02-06 19:51:04.000000000","message":"Oh, I see what you are saying.  I was thinking that the plan was to finalize the data that was already received.  if it was incomplete, then at least all the data would be calculated for what was successfully received, and it would be the job of other processing down the line (or the client) to realize the content-length was shorter than what the client had intended.  I guess its fine to just try to continue the read even though its sort of out of sequence.  Interesting.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"9a18c1194c1c691b68988c49f4a12b6958e2aa5b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        try:"},{"line_number":97,"context_line":"            if self.wsgi_input.read():"},{"line_number":98,"context_line":"                data \u003d iter(self.wsgi_input.read())"},{"line_number":99,"context_line":"                while True:"},{"line_number":100,"context_line":"                    try:"},{"line_number":101,"context_line":"                        chunk \u003d next(data)"},{"line_number":102,"context_line":"                        self.plaintext_etag.update(chunk)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_6040a336","line":99,"updated":"2016-04-08 09:51:46.000000000","message":"...but if you were going to read the stream then why not use the readChunk method?","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"59280b64ced91c9224528a1326d672cfdd758d11","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        except(ValueError, IOError):"},{"line_number":108,"context_line":"            pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.plaintext_etag \u003d self.plaintext_etag.hexdigest()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # If client supplied etag, then validate while we have plaintext"},{"line_number":113,"context_line":"        if self.client_etag:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_dd80938d","line":110,"updated":"2016-02-06 19:51:04.000000000","message":"There is an error logged in proxy.error from running functests:  self.plaintext_etag \u003d self.plaintext_etag.hexdigest()#012AttributeError: \u0027str\u0027 object has no attribute \u0027hexdigest\u0027.\n\nCurrently, the functests have 31 expected failures when testing with encryption using the latest on our branch.  The names all involve COPY, if-match/if-not-match, or slo range requests.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"1fd250a597c1bda6557cdd75427db627d496daf9","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        except(ValueError, IOError):"},{"line_number":108,"context_line":"            pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.plaintext_etag \u003d self.plaintext_etag.hexdigest()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # If client supplied etag, then validate while we have plaintext"},{"line_number":113,"context_line":"        if self.client_etag:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_540c83ec","line":110,"in_reply_to":"3a57f1b5_7ca3c400","updated":"2016-02-12 15:47:40.000000000","message":"Yes, I understood that part.  I was wondering why it was necessary to base on real footers support.  But I am guessing its because we want the \u0027finish streaming\u0027 attempt to be after the pipeline completes.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"d018d29837121a061a7f065dc53ab7ab7ad51b70","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        except(ValueError, IOError):"},{"line_number":108,"context_line":"            pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.plaintext_etag \u003d self.plaintext_etag.hexdigest()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # If client supplied etag, then validate while we have plaintext"},{"line_number":113,"context_line":"        if self.client_etag:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_7ca3c400","line":110,"in_reply_to":"3a57f1b5_8d39b4f4","updated":"2016-02-12 05:56:17.000000000","message":"Because this code is based off footers patch, if you also put in fake_footers middleware, this piece of code is called twice (once by real footers and another by fake fooers), hence the failures.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12279,"name":"Janie Richling","email":"jrichli@us.ibm.com","username":"jrichli"},"change_message_id":"a9a1d098874c894ce8a35006c9e960b37c20e35e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        except(ValueError, IOError):"},{"line_number":108,"context_line":"            pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.plaintext_etag \u003d self.plaintext_etag.hexdigest()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # If client supplied etag, then validate while we have plaintext"},{"line_number":113,"context_line":"        if self.client_etag:"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a57f1b5_8d39b4f4","line":110,"in_reply_to":"5a5ae5dd_1d7eb9ae","updated":"2016-02-12 02:34:24.000000000","message":"Oh, sorry i didn\u0027t notice that.  I guess that is because of what is done now in the callback?  Ok, I will retest.","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"},{"author":{"_account_id":12261,"name":"Mahati","email":"mahati.chamarthy@gmail.com","username":"Mahati"},"change_message_id":"86960989cbc210a9682dfe88ea81d44f16614f3d","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        except(ValueError, IOError):"},{"line_number":108,"context_line":"            pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        self.plaintext_etag \u003d self.plaintext_etag.hexdigest()"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        # If client supplied etag, then validate while we have plaintext"},{"line_number":113,"context_line":"        if self.client_etag:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a5ae5dd_1d7eb9ae","line":110,"in_reply_to":"5a5ae5dd_dd80938d","updated":"2016-02-09 16:31:37.000000000","message":"Since this is based on footers, fake_footers need to be removed while testing this. Func tests will give 31 failures (all COPY if-match stuff)","commit_id":"56f2e1bec2c053ee85ff9b5ba03bd02446b0b082"}]}
