)]}'
{"Engine/swift/storlet_gateway/storlet_docker_gateway.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c45f484f6eef9c3a9de8800f6807a4a34eca7895","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        if self.storlet_metadata:"},{"line_number":237,"context_line":"            self._fix_request_headers(req)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"    def gateway_proxy_put_copy_flow(self, sreq,"},{"line_number":240,"context_line":"                                    container, obj):"},{"line_number":241,"context_line":"        req \u003d sreq._getInitialRequest()"},{"line_number":242,"context_line":"        self.idata \u003d self._get_storlet_invocation_data(req)"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_23cb2d20","line":239,"range":{"start_line":239,"start_character":8,"end_line":239,"end_character":35},"updated":"2016-02-25 09:50:30.000000000","message":"I\u0027m wondering if we should keep or stop using camel case.\n\n(I think we had better deal with it in another patch, though)","commit_id":"5ba64554c9633df2584653606e237828be7790eb"}],"Engine/swift/storlet_gateway/storlet_stub_gateway.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c45f484f6eef9c3a9de8800f6807a4a34eca7895","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def indentity_invocation(self, content):"},{"line_number":40,"context_line":"        self.logger.debug(\"Identity invocation is called\")"},{"line_number":41,"context_line":"        return {}, BytesIO(content)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def augmentStorletRequest(self, request):"},{"line_number":44,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_06e71741","line":41,"range":{"start_line":41,"start_character":15,"end_line":41,"end_character":35},"updated":"2016-02-25 09:50:30.000000000","message":"This makes sense to me. This allows stub gateway to return what it gets without any modification, and this is useful for just simple testing.\n\nAnd now I start wondering if we should make stub_gateway pass also object metadata.","commit_id":"5ba64554c9633df2584653606e237828be7790eb"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"5d415316ffbfa30ff56408adce13bf0a36bda50d","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def indentity_invocation(self, content):"},{"line_number":40,"context_line":"        self.logger.debug(\"Identity invocation is called\")"},{"line_number":41,"context_line":"        return {}, BytesIO(content)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def augmentStorletRequest(self, request):"},{"line_number":44,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9aed3d3a_8709652f","line":41,"range":{"start_line":41,"start_character":15,"end_line":41,"end_character":35},"in_reply_to":"bae84128_06e71741","updated":"2016-02-26 08:24:19.000000000","message":"How about this patch?\n\nhttps://review.openstack.org/#/c/285156/\n\n# I know It conflicts with this patch.","commit_id":"5ba64554c9633df2584653606e237828be7790eb"}],"Engine/swift/storlet_middleware/storlet_handler.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"c45f484f6eef9c3a9de8800f6807a4a34eca7895","unresolved":false,"context_lines":[{"line_number":282,"context_line":"            return original_resp"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _validate_copy_request(self):"},{"line_number":285,"context_line":"        # We currently block copy from account"},{"line_number":286,"context_line":"        if self.request.headers.get(\u0027X-Copy-From-Account\u0027, None):"},{"line_number":287,"context_line":"            raise HTTPBadRequest(\u0027Storlet on copy with copy-from-account\u0027"},{"line_number":288,"context_line":"                                 \u0027 is not supported\u0027)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"        if self.request.headers.get(\u0027Destination-Account\u0027, None):"},{"line_number":291,"context_line":"            raise HTTPBadRequest(\u0027Storlet on copy with destination-account\u0027"},{"line_number":292,"context_line":"                                 \u0027 is not supported\u0027)"},{"line_number":293,"context_line":""},{"line_number":294,"context_line":"        # We currently block fresh metadata"},{"line_number":295,"context_line":"        if self.request.headers.get(\u0027x-fresh-metadata\u0027, None):"},{"line_number":296,"context_line":"            raise HTTPBadRequest(\u0027Storlet on copy with fresh-metadata \u0027"},{"line_number":297,"context_line":"                                 \u0027is not supported\u0027)"},{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def _base_handle_copy(self, source_path, dest_container, dest_object):"},{"line_number":300,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_435d91eb","line":297,"range":{"start_line":285,"start_character":0,"end_line":297,"end_character":52},"updated":"2016-02-25 09:50:30.000000000","message":"How about this?\n\n# SOME COMMENTS ABOUT UNSUPPORTED HEADERS\nunsupported_headers \u003d [\u0027X-Copy-From-Account\u0027,\n                       \u0027Destination-Account\u0027,\n                       \u0027X-Fresh-Metadata\u0027]\nfor header in unsupported_headers:\n    if self.request.headers.get(header):\n        raise HTTPBadRequest(\n            \u0027Storlet on copy with %s\u0027 is not supported\u0027 %\n            header)","commit_id":"5ba64554c9633df2584653606e237828be7790eb"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ee80fef068d4228e9b60ffae6b2054110d707a2","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        if \u0027CONTENT_LENGTH\u0027 in self.request.environ:"},{"line_number":321,"context_line":"            self.request.environ.pop(\u0027CONTENT_LENGTH\u0027)"},{"line_number":322,"context_line":"        self.request.headers[\u0027Transfer-Encoding\u0027] \u003d \u0027chunked\u0027"},{"line_number":323,"context_line":"        return self.request.get_response(self.app)"},{"line_number":324,"context_line":""},{"line_number":325,"context_line":"    def handle_put_copy_request(self):"},{"line_number":326,"context_line":"        self. _validate_copy_request()"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_122f4da2","line":323,"range":{"start_line":323,"start_character":15,"end_line":323,"end_character":50},"updated":"2016-02-25 11:13:03.000000000","message":"Do we need any COPY specific response headers (something like Copy-From header[1])?\n\n1. https://github.com/openstack/swift/blob/master/swift/proxy/controllers/obj.py#L526-L534","commit_id":"5ba64554c9633df2584653606e237828be7790eb"}],"tests/unit/swift/storlet_middleware/test_storlet_handler.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ee80fef068d4228e9b60ffae6b2054110d707a2","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            app(req.environ, self.start_response)"},{"line_number":256,"context_line":"            self.assertEqual(\u0027201 Created\u0027, self.got_statuses[-1])"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        with mock.patch("},{"line_number":259,"context_line":"                \u0027storlet_gateway.storlet_stub_gateway.StorletGatewayStub.\u0027"},{"line_number":260,"context_line":"                \u0027authorizeStorletExecution\u0027) as m:"},{"line_number":261,"context_line":"            copy()"},{"line_number":262,"context_line":"            self.assertEqual(0, m.call_count)"},{"line_number":263,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_ad91e654","line":260,"range":{"start_line":258,"start_character":0,"end_line":260,"end_character":50},"updated":"2016-02-25 11:13:03.000000000","message":"This is used in some test cases, so we can create new contextmanager to refactor them.\n(This can be done in another patch, just note for me)","commit_id":"5ba64554c9633df2584653606e237828be7790eb"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ee80fef068d4228e9b60ffae6b2054110d707a2","unresolved":false,"context_lines":[{"line_number":337,"context_line":"            copy(target, source, destination)"},{"line_number":338,"context_line":""},{"line_number":339,"context_line":"    def test_copy_with_unsupported_headers(self):"},{"line_number":340,"context_line":"        path \u003d \u0027/v1/AUTH_a/c/o\u0027"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"        def copy(method, copy_header):"},{"line_number":343,"context_line":"            req \u003d Request.blank(path, environ\u003d{\u0027REQUEST_METHOD\u0027: method},"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_4db5bace","line":340,"range":{"start_line":340,"start_character":8,"end_line":340,"end_character":12},"updated":"2016-02-25 11:13:03.000000000","message":"(nit) Is target better?","commit_id":"5ba64554c9633df2584653606e237828be7790eb"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0ee80fef068d4228e9b60ffae6b2054110d707a2","unresolved":false,"context_lines":[{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        with storlet_enabled():"},{"line_number":351,"context_line":"            self.assertRaises(HTTPBadRequest,"},{"line_number":352,"context_line":"                              copy(\u0027COPY\u0027, [\u0027Destination-Account\u0027, \u0027a\u0027]))"},{"line_number":353,"context_line":"            self.assertRaises(HTTPBadRequest,"},{"line_number":354,"context_line":"                              copy(\u0027COPY\u0027, [\u0027x-fresh-metadata\u0027, \u0027\u0027]))"},{"line_number":355,"context_line":"            self.assertRaises(HTTPBadRequest,"}],"source_content_type":"text/x-python","patch_set":3,"id":"bae84128_6dba3e70","line":352,"range":{"start_line":352,"start_character":43,"end_line":352,"end_character":71},"updated":"2016-02-25 11:13:03.000000000","message":"Is it better to pass this as dict, and combine it with other headers using update method?\n\nsomething like this.\n\ndef copy(method, copy_headers):\n    base_header \u003d {\u0027X-Run-Storlet\u0027: ....}\n    base_header.update(copy_headers)\n    ....","commit_id":"5ba64554c9633df2584653606e237828be7790eb"}]}
