)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fe0695a73b1afe4554b23d38e89116a9b00bf906","unresolved":false,"context_lines":[{"line_number":7,"context_line":"moving object validation checks to top of PUT method"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This adds a sanity check on x-delete headers as"},{"line_number":10,"context_line":"part of check_object_creation method"},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: If5069469e433189235b1178ea203b5c8a926f553"},{"line_number":13,"context_line":"Signed-off-by: Thiago da Silva \u003cthiago@redhat.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1abeadc6_e55f4f3f","line":10,"updated":"2014-08-21 18:39:41.000000000","message":"also need to mention the change wrt swob on the message length and transfer-encoding/content-length.","commit_id":"7de86ccfeb3d9fa99620758da53812e655790fa3"}],"swift/common/constraints.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fe0695a73b1afe4554b23d38e89116a9b00bf906","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    if req.content_length and req.content_length \u003e MAX_FILE_SIZE:"},{"line_number":159,"context_line":"        return HTTPRequestEntityTooLarge(body\u003d\u0027Your request is too large.\u0027,"},{"line_number":160,"context_line":"                                         request\u003dreq,"},{"line_number":161,"context_line":"                                         content_type\u003d\u0027text/plain\u0027)"},{"line_number":162,"context_line":"    if req.content_length is None and \\"},{"line_number":163,"context_line":"            req.headers.get(\u0027transfer-encoding\u0027) !\u003d \u0027chunked\u0027:"},{"line_number":164,"context_line":"        return HTTPLengthRequired(request\u003dreq)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_652dfffd","side":"PARENT","line":161,"updated":"2014-08-21 18:39:41.000000000","message":"What exactly would the HTTP request look like where ml is None?  Are we sure about precedence in the spec when a client sends Content-Length and Transfer-Encoding: chunked?","commit_id":"21adf82cf11fa80479676225a8a61c0029387cb5"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fe0695a73b1afe4554b23d38e89116a9b00bf906","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        if x_delete_at \u003c time.time():"},{"line_number":191,"context_line":"            raise HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":192,"context_line":"                                 body\u003d\u0027X-Delete-At in past\u0027)"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    if \u0027X-Copy-From\u0027 in req.headers and req.content_length:"},{"line_number":195,"context_line":"        return HTTPBadRequest(body\u003d\u0027Copy requests require a zero byte body\u0027,"},{"line_number":196,"context_line":"                              request\u003dreq, content_type\u003d\u0027text/plain\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_05afeb2a","line":193,"updated":"2014-08-21 18:39:41.000000000","message":"I think I like the idea of consolidating all the checks under a single entry point - but with an eye towards https://review.openstack.org/#/c/113325/3 - I worry about code re-use with everything crammed into a single function.\n\nWe can save that for later, or it might be as simple as having check_object_creation call _check_delete_at_headers sorta like what we do at the bottom with check_metadata.","commit_id":"7de86ccfeb3d9fa99620758da53812e655790fa3"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bf7cd22104e4d7d28923b25879777d491988937","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    :returns HTTPLengthRequired: missing content-length header and not"},{"line_number":155,"context_line":"                                 a chunked request"},{"line_number":156,"context_line":"    :returns HTTPBadRequest: missing or bad content-type header, or"},{"line_number":157,"context_line":"                             bad metadata"},{"line_number":158,"context_line":"    \"\"\""},{"line_number":159,"context_line":"    try:"},{"line_number":160,"context_line":"        ml \u003d req.message_length()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_576d4dcb","line":157,"updated":"2014-09-03 14:10:20.000000000","message":"nit: add returns HTTPNotImplemented","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"cdd815416b652623fdb9994975b1d9f01340ee29","unresolved":false,"context_lines":[{"line_number":154,"context_line":"    :returns HTTPLengthRequired: missing content-length header and not"},{"line_number":155,"context_line":"                                 a chunked request"},{"line_number":156,"context_line":"    :returns HTTPBadRequest: missing or bad content-type header, or"},{"line_number":157,"context_line":"                             bad metadata"},{"line_number":158,"context_line":"    \"\"\""},{"line_number":159,"context_line":"    try:"},{"line_number":160,"context_line":"        ml \u003d req.message_length()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_f0b8d512","line":157,"in_reply_to":"fa98f980_576d4dcb","updated":"2014-09-05 18:16:29.000000000","message":"Done","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bf7cd22104e4d7d28923b25879777d491988937","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                                         content_type\u003d\u0027text/plain\u0027)"},{"line_number":171,"context_line":"    if req.content_length is None and \\"},{"line_number":172,"context_line":"            req.headers.get(\u0027transfer-encoding\u0027) !\u003d \u0027chunked\u0027:"},{"line_number":173,"context_line":"        return HTTPLengthRequired(body\u003d\u0027Missing Content_Length header.\u0027,"},{"line_number":174,"context_line":"                                  request\u003dreq,"},{"line_number":175,"context_line":"                                  content_type\u003d\u0027text/plain\u0027)"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_6527faca","line":173,"updated":"2014-09-03 14:10:20.000000000","message":"Content_Length -\u003e Content-Length","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"cdd815416b652623fdb9994975b1d9f01340ee29","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                                         content_type\u003d\u0027text/plain\u0027)"},{"line_number":171,"context_line":"    if req.content_length is None and \\"},{"line_number":172,"context_line":"            req.headers.get(\u0027transfer-encoding\u0027) !\u003d \u0027chunked\u0027:"},{"line_number":173,"context_line":"        return HTTPLengthRequired(body\u003d\u0027Missing Content_Length header.\u0027,"},{"line_number":174,"context_line":"                                  request\u003dreq,"},{"line_number":175,"context_line":"                                  content_type\u003d\u0027text/plain\u0027)"},{"line_number":176,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_103b999d","line":173,"in_reply_to":"fa98f980_6527faca","updated":"2014-09-05 18:16:29.000000000","message":"Done","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bf7cd22104e4d7d28923b25879777d491988937","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                             content_type\u003d\u0027text/plain\u0027)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def check_delete_headers(request):"},{"line_number":248,"context_line":"    \"\"\""},{"line_number":249,"context_line":"    Validate if \u0027x-delete\u0027 headers are have correct values"},{"line_number":250,"context_line":"    values should be positive integers and correspond to"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_0dcad41a","line":247,"updated":"2014-09-03 14:10:20.000000000","message":"Would be good to have unit test for this function, or add delete-* tests to check_object_creation tests.\n\nI think its mostly covered but I managed to make a change e.g. at line 266 and still pass all unit tests","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"cdd815416b652623fdb9994975b1d9f01340ee29","unresolved":false,"context_lines":[{"line_number":244,"context_line":"                             content_type\u003d\u0027text/plain\u0027)"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def check_delete_headers(request):"},{"line_number":248,"context_line":"    \"\"\""},{"line_number":249,"context_line":"    Validate if \u0027x-delete\u0027 headers are have correct values"},{"line_number":250,"context_line":"    values should be positive integers and correspond to"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_e6ebbbd9","line":247,"in_reply_to":"fa98f980_0dcad41a","updated":"2014-09-05 18:16:29.000000000","message":"Done","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bf7cd22104e4d7d28923b25879777d491988937","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                                  content_type\u003d\u0027text/plain\u0027,"},{"line_number":264,"context_line":"                                  body\u003d\u0027Non-integer X-Delete-After\u0027)"},{"line_number":265,"context_line":"        request.headers[\u0027x-delete-at\u0027] \u003d utils.normalize_delete_at_timestamp("},{"line_number":266,"context_line":"            time.time() + x_delete_after)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    if \u0027x-delete-at\u0027 in request.headers:"},{"line_number":269,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_cdfa8c42","line":266,"updated":"2014-09-03 14:10:20.000000000","message":"Out of badness I added \u0027 - 1\u0027 after x_delete_after and unit tests still passed.","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2c20b065c3e6137feba30d1306fc71971429399c","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                                  content_type\u003d\u0027text/plain\u0027,"},{"line_number":264,"context_line":"                                  body\u003d\u0027Non-integer X-Delete-After\u0027)"},{"line_number":265,"context_line":"        request.headers[\u0027x-delete-at\u0027] \u003d utils.normalize_delete_at_timestamp("},{"line_number":266,"context_line":"            time.time() + x_delete_after)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    if \u0027x-delete-at\u0027 in request.headers:"},{"line_number":269,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_2aac5e35","line":266,"in_reply_to":"fa98f980_a6cc538a","updated":"2014-09-08 13:44:24.000000000","message":"I did this to break the code:\n request.headers[\u0027x-delete-at\u0027] \u003d utils.normalize_delete_at_timestamp(time.time() + x_delete_after - 1)\n\nThat is now caught by controllers/test_obj.py by virtue of your refactor. I\u0027ll push a patch that adds a test directly on the check_delete_headers method.","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"cdd815416b652623fdb9994975b1d9f01340ee29","unresolved":false,"context_lines":[{"line_number":263,"context_line":"                                  content_type\u003d\u0027text/plain\u0027,"},{"line_number":264,"context_line":"                                  body\u003d\u0027Non-integer X-Delete-After\u0027)"},{"line_number":265,"context_line":"        request.headers[\u0027x-delete-at\u0027] \u003d utils.normalize_delete_at_timestamp("},{"line_number":266,"context_line":"            time.time() + x_delete_after)"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"    if \u0027x-delete-at\u0027 in request.headers:"},{"line_number":269,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_a6cc538a","line":266,"in_reply_to":"fa98f980_cdfa8c42","updated":"2014-09-05 18:16:29.000000000","message":"@Alistair, I added some unit tests for this function. I wasn\u0027t sure how you tested with -1, so please let me know if the tests I added cover what you tested or if something needs to be changed in the code here. Thanks!","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"}],"swift/common/swob.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fe0695a73b1afe4554b23d38e89116a9b00bf906","unresolved":false,"context_lines":[{"line_number":991,"context_line":"        :raises AttributeError: if the last value of the transfer-encoding"},{"line_number":992,"context_line":"            header is not \"chunked\""},{"line_number":993,"context_line":"        :raises KeyError: if either transfer-encoding or content-length"},{"line_number":994,"context_line":"            headers are not provided"},{"line_number":995,"context_line":"        \"\"\""},{"line_number":996,"context_line":"        te \u003d self.headers.get(\u0027transfer-encoding\u0027)"},{"line_number":997,"context_line":"        if te:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_45c3a356","line":994,"updated":"2014-08-21 18:39:41.000000000","message":"does this contradict with \"or None if the headers don\u0027t contain a length\"?","commit_id":"7de86ccfeb3d9fa99620758da53812e655790fa3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fe0695a73b1afe4554b23d38e89116a9b00bf906","unresolved":false,"context_lines":[{"line_number":1018,"context_line":"                except ValueError:"},{"line_number":1019,"context_line":"                    raise ValueError(\u0027Invalid Content-Length header value\u0027)"},{"line_number":1020,"context_line":"            else:"},{"line_number":1021,"context_line":"                raise KeyError(\u0027Missing Content-Length header\u0027)"},{"line_number":1022,"context_line":"        else:"},{"line_number":1023,"context_line":"            fsize \u003d None"},{"line_number":1024,"context_line":"        return fsize"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_259dc766","line":1021,"updated":"2014-08-21 18:39:41.000000000","message":"worried about behavior change - do we already return None/0 to distinguish this case?","commit_id":"7de86ccfeb3d9fa99620758da53812e655790fa3"}],"swift/proxy/controllers/obj.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bf7cd22104e4d7d28923b25879777d491988937","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":"            if x_delete_at \u003c time.time():"},{"line_number":447,"context_line":"                raise HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":448,"context_line":"                                     body\u003d\u0027X-Delete-At in past\u0027)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"            req.environ.setdefault(\u0027swift.log_info\u0027, []).append("},{"line_number":451,"context_line":"                \u0027x-delete-at:%s\u0027 % x_delete_at)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_0a071d1a","line":448,"updated":"2014-09-03 14:10:20.000000000","message":"lines 428 - 449 duplicates code in check_delete_headers function. Would be nice if you could call check_delete_headers here somehow - maybe change check_delete_headers to return x_delete_at or raise HTTPBadRequest?? Then wrap in try/except in check_object_creation?","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"cdd815416b652623fdb9994975b1d9f01340ee29","unresolved":false,"context_lines":[{"line_number":445,"context_line":""},{"line_number":446,"context_line":"            if x_delete_at \u003c time.time():"},{"line_number":447,"context_line":"                raise HTTPBadRequest(request\u003dreq, content_type\u003d\u0027text/plain\u0027,"},{"line_number":448,"context_line":"                                     body\u003d\u0027X-Delete-At in past\u0027)"},{"line_number":449,"context_line":""},{"line_number":450,"context_line":"            req.environ.setdefault(\u0027swift.log_info\u0027, []).append("},{"line_number":451,"context_line":"                \u0027x-delete-at:%s\u0027 % x_delete_at)"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_c4a5b0a2","line":448,"in_reply_to":"fa98f980_0a071d1a","updated":"2014-09-05 18:16:29.000000000","message":"Done","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"}],"test/functional/tests.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"fe0695a73b1afe4554b23d38e89116a9b00bf906","unresolved":false,"context_lines":[{"line_number":1197,"context_line":"        self.assertRaises(ResponseError, file_item.write_random, file_length,"},{"line_number":1198,"context_line":"                          hdrs\u003d{\u0027transfer-encoding\u0027: \u0027gzip,chunked\u0027},"},{"line_number":1199,"context_line":"                          cfg\u003d{\u0027no_content_length\u0027: True})"},{"line_number":1200,"context_line":"        self.assert_status(501)"},{"line_number":1201,"context_line":""},{"line_number":1202,"context_line":"        # bad request types"},{"line_number":1203,"context_line":"        #for req in (\u0027LICK\u0027, \u0027GETorHEAD_base\u0027, \u0027container_info\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1abeadc6_85385bf0","line":1200,"updated":"2014-08-21 18:39:41.000000000","message":"nice!","commit_id":"7de86ccfeb3d9fa99620758da53812e655790fa3"}],"test/unit/common/test_constraints.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"5bf7cd22104e4d7d28923b25879777d491988937","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027/\u0027, headers\u003dheaders), \u0027object_name\u0027).status_int,"},{"line_number":175,"context_line":"            HTTP_BAD_REQUEST)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # a content-length header is always required"},{"line_number":178,"context_line":"        headers \u003d {\u0027X-Copy-From\u0027: \u0027c/o2\u0027,"},{"line_number":179,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":180,"context_line":"        self.assertEquals(constraints.check_object_creation(Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_576c6d08","line":177,"updated":"2014-09-03 14:10:20.000000000","message":"Q: if Transfer-Encoding is set then content-length is not required. Should the constraints check ensure there is no transfer-encoding when x-copy-from is set?","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"afff5e55a88d731c9bc75253f53e02fbef203378","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027/\u0027, headers\u003dheaders), \u0027object_name\u0027).status_int,"},{"line_number":175,"context_line":"            HTTP_BAD_REQUEST)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # a content-length header is always required"},{"line_number":178,"context_line":"        headers \u003d {\u0027X-Copy-From\u0027: \u0027c/o2\u0027,"},{"line_number":179,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":180,"context_line":"        self.assertEquals(constraints.check_object_creation(Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_ede58509","line":177,"in_reply_to":"fa98f980_576c6d08","updated":"2014-09-03 18:49:00.000000000","message":"copy requests require some valid form of http body transfer specification - content-length: 0 being the most common - but transfer-encoding: chunked for a zero byte request also seems reasonable as long as the client sends all the requisite bits - which IIRC does work; but I haven\u0027t tested it in awhile.  We don\u0027t want to change behavior on clients; so we\u0027d probably need to understand the current behavior better before making a change like that?","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"2c20b065c3e6137feba30d1306fc71971429399c","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027/\u0027, headers\u003dheaders), \u0027object_name\u0027).status_int,"},{"line_number":175,"context_line":"            HTTP_BAD_REQUEST)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # a content-length header is always required"},{"line_number":178,"context_line":"        headers \u003d {\u0027X-Copy-From\u0027: \u0027c/o2\u0027,"},{"line_number":179,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":180,"context_line":"        self.assertEquals(constraints.check_object_creation(Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_c7dcab49","line":177,"in_reply_to":"fa98f980_8aaf317c","updated":"2014-09-08 13:44:24.000000000","message":"what clay said i.e. lets not rush into constraining what clients might be doing","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"},{"author":{"_account_id":9625,"name":"Thiago da Silva","email":"thiagodasilva@gmail.com","username":"thiago"},"change_message_id":"cdd815416b652623fdb9994975b1d9f01340ee29","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027/\u0027, headers\u003dheaders), \u0027object_name\u0027).status_int,"},{"line_number":175,"context_line":"            HTTP_BAD_REQUEST)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        # a content-length header is always required"},{"line_number":178,"context_line":"        headers \u003d {\u0027X-Copy-From\u0027: \u0027c/o2\u0027,"},{"line_number":179,"context_line":"                   \u0027Content-Type\u0027: \u0027text/plain\u0027}"},{"line_number":180,"context_line":"        self.assertEquals(constraints.check_object_creation(Request.blank("}],"source_content_type":"text/x-python","patch_set":3,"id":"fa98f980_8aaf317c","line":177,"in_reply_to":"fa98f980_ede58509","updated":"2014-09-05 18:16:29.000000000","message":"Ok, not sure what changes to make here so I\u0027m keeping functionality the same for now, I just added one more unit test to show that \u0027transfer-encoding\u0027 header is valid. \n\nJust as additional info: while the request can currently contain the transfer-encoding header, once we GET the source obj, the response must have content-length and not transfer-encoding. See: https://github.com/openstack/swift/blob/master/swift/proxy/controllers/obj.py#L627","commit_id":"804a6678e0914fd6a868d3582c6071587c9a75a9"}]}
