)]}'
{"swift/common/middleware/tlo.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            will be used (not including account or leading slash)"},{"line_number":48,"context_line":"mode        (optional) the mode that should be presented by the"},{"line_number":49,"context_line":"            tarball for the object. If omitted, the file mode will"},{"line_number":50,"context_line":"            default to 0o644."},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"The format of the list will be:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_ed1e2b0b","line":50,"updated":"2018-01-02 20:44:17.000000000","message":"Probably worth calling out that this needs to be an octal string. You can\u0027t just stick in 384 to mean \"0600\".","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"            will be used (not including account or leading slash)"},{"line_number":48,"context_line":"mode        (optional) the mode that should be presented by the"},{"line_number":49,"context_line":"            tarball for the object. If omitted, the file mode will"},{"line_number":50,"context_line":"            default to 0o644."},{"line_number":51,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"The format of the list will be:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_3bc78548","line":50,"in_reply_to":"9f91af0f_ed1e2b0b","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"A DELETE with a query parameter::"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    ?tar-manifest\u003ddelete"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"will delete all the objects referenced in the manifest and then the manifest"},{"line_number":83,"context_line":"itself. The failure response will be similar to the bulk delete middleware."}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_2e764e08","line":80,"range":{"start_line":80,"start_character":5,"end_line":80,"end_character":24},"updated":"2018-01-02 20:44:17.000000000","message":"I wonder if this should just continue using the existing\n\n ?multipart-manifest\u003ddelete\n\nquery param... since the thing is ultimately an SLO, that\u0027ll *also* work, yeah?","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"A DELETE with a query parameter::"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    ?tar-manifest\u003ddelete"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"will delete all the objects referenced in the manifest and then the manifest"},{"line_number":83,"context_line":"itself. The failure response will be similar to the bulk delete middleware."}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_dbaa2170","line":80,"range":{"start_line":80,"start_character":5,"end_line":80,"end_character":24},"in_reply_to":"9f91af0f_2e764e08","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"REQUIRED_TLO_KEYS \u003d set([\u0027path\u0027, \u0027size_bytes\u0027])"},{"line_number":126,"context_line":"OPTIONAL_TLO_KEYS \u003d set(["},{"line_number":127,"context_line":"    \u0027range\u0027, \u0027etag\u0027, \u0027size_bytes\u0027, \u0027name\u0027, \u0027uid\u0027, \u0027gid\u0027, \u0027mode\u0027"},{"line_number":128,"context_line":"])"},{"line_number":129,"context_line":"ALLOWED_TLO_KEYS \u003d REQUIRED_TLO_KEYS | OPTIONAL_TLO_KEYS"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_c9a31c4f","line":127,"range":{"start_line":127,"start_character":22,"end_line":127,"end_character":32},"updated":"2018-01-02 20:44:17.000000000","message":"\u0027size_bytes\u0027 is both required *and* optional? And is that \u0027size\u0027 or \u0027size_bytes\u0027? The docs referred to \u0027size\u0027...\n\nDo we ever actually use uid/gid?","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":124,"context_line":""},{"line_number":125,"context_line":"REQUIRED_TLO_KEYS \u003d set([\u0027path\u0027, \u0027size_bytes\u0027])"},{"line_number":126,"context_line":"OPTIONAL_TLO_KEYS \u003d set(["},{"line_number":127,"context_line":"    \u0027range\u0027, \u0027etag\u0027, \u0027size_bytes\u0027, \u0027name\u0027, \u0027uid\u0027, \u0027gid\u0027, \u0027mode\u0027"},{"line_number":128,"context_line":"])"},{"line_number":129,"context_line":"ALLOWED_TLO_KEYS \u003d REQUIRED_TLO_KEYS | OPTIONAL_TLO_KEYS"},{"line_number":130,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_1ba16996","line":127,"range":{"start_line":127,"start_character":22,"end_line":127,"end_character":32},"in_reply_to":"9f91af0f_c9a31c4f","updated":"2018-01-19 20:51:21.000000000","message":"Fixed docs. Dropping uid/gid for now.","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    }"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"def _tar_header(name, size, mode\u003d0o644):"},{"line_number":143,"context_line":"    \"\"\""},{"line_number":144,"context_line":"    Build a tar header for a given file name, size and mode"},{"line_number":145,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_898514b0","line":142,"updated":"2018-01-02 20:44:17.000000000","message":"No uid/gid?","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    info.mode \u003d mode"},{"line_number":150,"context_line":"    info.mtime \u003d time.time()"},{"line_number":151,"context_line":"    return {"},{"line_number":152,"context_line":"        \u0027data\u0027: base64.b64encode(info.tobuf(format\u003dtarfile.GNU_FORMAT))"},{"line_number":153,"context_line":"    }"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_49faac42","line":152,"range":{"start_line":152,"start_character":59,"end_line":152,"end_character":69},"updated":"2018-01-02 20:44:17.000000000","message":"Do we have any feel for how common ustar and pax formats are? Should this be client-configurable?","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            continue"},{"line_number":230,"context_line":"        else:"},{"line_number":231,"context_line":"            # Don\u0027t allow dangerous tarballs"},{"line_number":232,"context_line":"            seg_name \u003d seg_name.lstrip(\u0027/\u0027)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        seg_mode \u003d seg_dict.get(\u0027mode\u0027)"},{"line_number":235,"context_line":"        if seg_mode is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_692450c7","line":232,"updated":"2018-01-02 20:44:17.000000000","message":"Should there be other validations, too? https://docs.python.org/2/library/tarfile.html#supported-tar-formats says\n\n\u003e The GNU tar format (GNU_FORMAT). It supports long filenames and linknames\n\n...but how long is \"long\"? Surely there\u0027s *some* limit...","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":229,"context_line":"            continue"},{"line_number":230,"context_line":"        else:"},{"line_number":231,"context_line":"            # Don\u0027t allow dangerous tarballs"},{"line_number":232,"context_line":"            seg_name \u003d seg_name.lstrip(\u0027/\u0027)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        seg_mode \u003d seg_dict.get(\u0027mode\u0027)"},{"line_number":235,"context_line":"        if seg_mode is None:"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_b2c5fa0c","line":232,"in_reply_to":"9f91af0f_692450c7","updated":"2018-01-19 20:51:21.000000000","message":"Huh.\n\n\u003e\u003e\u003e len(tarfile.TarInfo(name\u003d\u0027a\u0027).tobuf(format\u003dtarfile.GNU_FORMAT))\n512\n\u003e\u003e\u003e len(tarfile.TarInfo(name\u003d\u0027a\u0027 * 2**20).tobuf(format\u003dtarfile.GNU_FORMAT))\n1050112\n\u003e\u003e\u003e len(tarfile.TarInfo(name\u003d\u0027a\u0027 * 2**24).tobuf(format\u003dtarfile.GNU_FORMAT))\n16778752\n\u003e\u003e\u003e len(tarfile.TarInfo(name\u003d\u0027a\u0027 * 2**30).tobuf(format\u003dtarfile.GNU_FORMAT))\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/usr/lib/python2.7/tarfile.py\", line 995, in tobuf\n    return self.create_gnu_header(info)\n  File \"/usr/lib/python2.7/tarfile.py\", line 1024, in create_gnu_header\n    buf +\u003d self._create_gnu_long_header(info[\"name\"], GNUTYPE_LONGNAME)\n  File \"/usr/lib/python2.7/tarfile.py\", line 1143, in _create_gnu_long_header\n    name +\u003d NUL\nMemoryError\n\nWhatever the limit is, it seems you\u0027ll almost certainly hit the max manifest size first.","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            seg_mode \u003d int(seg_mode, 8)"},{"line_number":239,"context_line":"        except (TypeError, ValueError):"},{"line_number":240,"context_line":"            errors.append(\"Index %d: invalid mode\" % seg_index)"},{"line_number":241,"context_line":"            continue"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        parsed_seg_data \u003d {"},{"line_number":244,"context_line":"            \u0027name\u0027: seg_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_6d521b16","line":241,"updated":"2018-01-02 20:44:17.000000000","message":"Should we also constrain mode to 0o000 - 0o777 ? I think I\u0027d be perfectly happy to wait on allowing set-uid/gid and sticky bits until someone actually has a use-case that calls for it...","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            seg_mode \u003d int(seg_mode, 8)"},{"line_number":239,"context_line":"        except (TypeError, ValueError):"},{"line_number":240,"context_line":"            errors.append(\"Index %d: invalid mode\" % seg_index)"},{"line_number":241,"context_line":"            continue"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        parsed_seg_data \u003d {"},{"line_number":244,"context_line":"            \u0027name\u0027: seg_name,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_fbfd9db1","line":241,"in_reply_to":"9f91af0f_6d521b16","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            \u0027name\u0027: seg_name,"},{"line_number":245,"context_line":"            \u0027size_bytes\u0027: seg_size,"},{"line_number":246,"context_line":"            \u0027mode\u0027: seg_mode"},{"line_number":247,"context_line":"        }"},{"line_number":248,"context_line":"        seg_dict.update(parsed_seg_data)"},{"line_number":249,"context_line":"        slo_data.append(seg_dict)"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_ed9f0b4e","line":247,"updated":"2018-01-02 20:44:17.000000000","message":"No \u0027range\u0027?","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":244,"context_line":"            \u0027name\u0027: seg_name,"},{"line_number":245,"context_line":"            \u0027size_bytes\u0027: seg_size,"},{"line_number":246,"context_line":"            \u0027mode\u0027: seg_mode"},{"line_number":247,"context_line":"        }"},{"line_number":248,"context_line":"        seg_dict.update(parsed_seg_data)"},{"line_number":249,"context_line":"        slo_data.append(seg_dict)"},{"line_number":250,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_9b2c994b","line":247,"in_reply_to":"9f91af0f_ed9f0b4e","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":284,"context_line":"    @staticmethod"},{"line_number":285,"context_line":"    def _process_seg_dict(seg_dict):"},{"line_number":286,"context_line":"        \"\"\""},{"line_number":287,"context_line":"        TODO: Add support for inline sub-tars"},{"line_number":288,"context_line":"        \"\"\""},{"line_number":289,"context_line":"        processed \u003d {"},{"line_number":290,"context_line":"            k: seg_dict[k] for k in seg_dict"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_6d0a1bd3","line":287,"updated":"2018-01-02 20:44:17.000000000","message":"*shrug*\n\nI\u0027m fine with this being a pretty flat structure -- seems like the only reason to allow nesting would be for more than 1000 files, yeah? I\u0027m happy to wait on implementing it -- besides, it\u0027d require that we do some sort of crazy callback/message-passing with slo\u0027s PUT validation...","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            if k in [\u0027path\u0027, \u0027etag\u0027, \u0027size\u0027, \u0027range\u0027] and seg_dict[k]"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"        seg_name \u003d seg_dict[\u0027name\u0027]"},{"line_number":294,"context_line":"        seg_size \u003d seg_dict[\u0027size\u0027]"},{"line_number":295,"context_line":"        seg_mode \u003d seg_dict[\u0027mode\u0027]"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        header \u003d _tar_header(seg_name, seg_size, seg_mode)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_0dab4f89","line":294,"updated":"2018-01-02 20:44:17.000000000","message":"This needs to check whether a range was provided, yeah?","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            if k in [\u0027path\u0027, \u0027etag\u0027, \u0027size\u0027, \u0027range\u0027] and seg_dict[k]"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"        seg_name \u003d seg_dict[\u0027name\u0027]"},{"line_number":294,"context_line":"        seg_size \u003d seg_dict[\u0027size\u0027]"},{"line_number":295,"context_line":"        seg_mode \u003d seg_dict[\u0027mode\u0027]"},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"        header \u003d _tar_header(seg_name, seg_size, seg_mode)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_5b26116b","line":294,"in_reply_to":"9f91af0f_0dab4f89","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        :params req: a swob.Request with an obj in path"},{"line_number":311,"context_line":"        :raises: HttpException on errors"},{"line_number":312,"context_line":"        \"\"\""},{"line_number":313,"context_line":"        try:"},{"line_number":314,"context_line":"            req.split_path(1, 4, True)"},{"line_number":315,"context_line":"        except ValueError:"},{"line_number":316,"context_line":"            return self.app(req.environ, start_response)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        length_required \u003d ("},{"line_number":319,"context_line":"            req.content_length is None and"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_2d2df342","line":316,"range":{"start_line":313,"start_character":8,"end_line":316,"end_character":56},"updated":"2018-01-02 20:44:17.000000000","message":"We\u0027ve already got tighter validation at lines 364-367 -- I\u0027d be fine dropping this.","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        :params req: a swob.Request with an obj in path"},{"line_number":311,"context_line":"        :raises: HttpException on errors"},{"line_number":312,"context_line":"        \"\"\""},{"line_number":313,"context_line":"        try:"},{"line_number":314,"context_line":"            req.split_path(1, 4, True)"},{"line_number":315,"context_line":"        except ValueError:"},{"line_number":316,"context_line":"            return self.app(req.environ, start_response)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        length_required \u003d ("},{"line_number":319,"context_line":"            req.content_length is None and"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_1b208949","line":316,"range":{"start_line":313,"start_character":8,"end_line":316,"end_character":56},"in_reply_to":"9f91af0f_2d2df342","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        req.params[\u0027multipart-manifest\u0027] \u003d \u0027put\u0027"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        env \u003d req.environ"},{"line_number":349,"context_line":"        # TODO: update content type to be tar"},{"line_number":350,"context_line":"        if not env.get(\u0027CONTENT_TYPE\u0027):"},{"line_number":351,"context_line":"            guessed_type, _junk \u003d mimetypes.guess_type(req.path_info)"},{"line_number":352,"context_line":"            env[\u0027CONTENT_TYPE\u0027] \u003d guessed_type or \u0027application/octet-stream\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_0d410f0c","line":349,"updated":"2018-01-02 20:44:17.000000000","message":"+1 -- I\u0027d be totally fine with saying\n\n if not req.content_type:\n     req.content_type \u003d \u0027application/x-tar\u0027","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":346,"context_line":"        req.params[\u0027multipart-manifest\u0027] \u003d \u0027put\u0027"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        env \u003d req.environ"},{"line_number":349,"context_line":"        # TODO: update content type to be tar"},{"line_number":350,"context_line":"        if not env.get(\u0027CONTENT_TYPE\u0027):"},{"line_number":351,"context_line":"            guessed_type, _junk \u003d mimetypes.guess_type(req.path_info)"},{"line_number":352,"context_line":"            env[\u0027CONTENT_TYPE\u0027] \u003d guessed_type or \u0027application/octet-stream\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_fb16fdf1","line":349,"in_reply_to":"9f91af0f_0d410f0c","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e97ff080c4c4eb2ec8f75e42e121a2266e9982aa","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            )"},{"line_number":374,"context_line":"            if tar_manifest_put:"},{"line_number":375,"context_line":"                return self.handle_tar_put(req, start_response)"},{"line_number":376,"context_line":"            if \u0027X-Tar-Large-Object\u0027 in req.headers:"},{"line_number":377,"context_line":"                raise HTTPBadRequest("},{"line_number":378,"context_line":"                    request\u003dreq,"},{"line_number":379,"context_line":"                    body\u003d\u0027X-Tar-Large-Object is a reserved header. \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f91af0f_8d919f9c","line":376,"updated":"2018-01-02 20:44:17.000000000","message":"If we\u0027re going to enforce this, it should go in gatekeeper -- we\u0027ve seen odd behavior previously when a client would send a X-Static-Large-Object header to a cluster without slo in the pipeline, then later *add* slo... see https://bugs.launchpad.net/swift/+bug/1680083\n\nBut do we actually *do* anything with this header? Even if we did, I think it\u0027d be better as sysmeta...","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"428a6c8df9f8eddc9d82236e87464e187d2ff40a","unresolved":false,"context_lines":[{"line_number":373,"context_line":"            )"},{"line_number":374,"context_line":"            if tar_manifest_put:"},{"line_number":375,"context_line":"                return self.handle_tar_put(req, start_response)"},{"line_number":376,"context_line":"            if \u0027X-Tar-Large-Object\u0027 in req.headers:"},{"line_number":377,"context_line":"                raise HTTPBadRequest("},{"line_number":378,"context_line":"                    request\u003dreq,"},{"line_number":379,"context_line":"                    body\u003d\u0027X-Tar-Large-Object is a reserved header. \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"7f96bb07_3bcb0573","line":376,"in_reply_to":"9f91af0f_8d919f9c","updated":"2018-01-19 20:51:21.000000000","message":"Done","commit_id":"551a347df2560627a4ec4b515429b7ef499b4593"}]}
