def get_upload_file_content(upload_id: int, public_file_path: str) -> Response: """ Get the source log associated with upload workspace. Parameters ---------- upload_id : int The unique identifier for upload workspace. public_file_path: str relative path of file to be deleted. Returns ------- dict Complete summary of upload processing. int An HTTP status code. dict Some extra headers to add to the response. """ try: upload_db_data: Optional[Upload] = uploads.retrieve(upload_id) except IOError: logger.error( "%s: ContentFileDownload: There was a problem connecting to database.", upload_db_data.upload_id) raise InternalServerError(UPLOAD_DB_CONNECT_ERROR) if upload_db_data is None: raise NotFound(UPLOAD_NOT_FOUND) try: upload_workspace = UploadWorkspace(upload_id) # Returns path if file exists if upload_workspace.content_file_exists(public_file_path): size = upload_workspace.content_file_size(public_file_path) modified = upload_workspace.content_file_last_modified( public_file_path) checksum = upload_workspace.content_file_checksum(public_file_path) filepointer = upload_workspace.content_file_pointer( public_file_path) headers = { "Content-disposition": f"filename={filepointer.name}", 'ETag': checksum, 'Content-Length': size, 'Last-Modified': modified } else: raise NotFound(f"File '{public_file_path}' not found.") except IOError: logger.error("%s: Delete file request failed ", upload_db_data.upload_id) raise InternalServerError(CANT_DELETE_FILE) except NotFound as nf: logger.info("%s: DeleteFile: %s", upload_id, nf) raise nf except SecurityError as secerr: logger.info("%s: %s", upload_id, secerr.description) # TODO: Should this be BadRequest or NotFound. I'm leaning towards # NotFound in order to provide as little feedback as posible to client. raise NotFound(UPLOAD_FILE_NOT_FOUND) except Forbidden as forb: logger.info("%s: Delete file forbidden: %s.", upload_id, forb) raise forb except Exception as ue: logger.info( "Unknown error in delete file. " " Add except clauses for '%s'. DO IT NOW!", ue) raise InternalServerError(UPLOAD_UNKNOWN_ERROR) headers.update({'ARXIV-OWNER': upload_db_data.owner_user_id}) return filepointer, status.OK, headers
def check_upload_file_content_exists(upload_id: int, public_file_path: str) -> Response: """ Verify that the specified content file exists/is available. Parameters ---------- upload_id : int The unique identifier for upload workspace. public_file_path: str relative path of file to be checked. Returns ------- Standard Response tuple containing content, HTTP status, and HTTP headers. """ try: upload_db_data: Optional[Upload] = uploads.retrieve(upload_id) except IOError: logger.error( "%s: ContentFileExistsCheck: There was a problem " "connecting to database.", upload_id) raise InternalServerError(UPLOAD_DB_CONNECT_ERROR) if upload_db_data is None: raise NotFound(UPLOAD_NOT_FOUND) logger.info("%s: Upload content file exists request.", upload_id) try: upload_workspace = UploadWorkspace(upload_id) # file exists if upload_workspace.content_file_exists(public_file_path): size = upload_workspace.content_file_size(public_file_path) modified = upload_workspace.content_file_last_modified( public_file_path) checksum = upload_workspace.content_file_checksum(public_file_path) return {}, status.OK, { 'ETag': checksum, 'Content-Length': size, 'Last-Modified': modified } raise NotFound(f"File '{public_file_path}' not found.") except IOError: logger.error("%s: Content file exists request failed ", upload_db_data.upload_id) raise InternalServerError(CANT_DELETE_FILE) except NotFound as nf: logger.info("%s: File not found: %s", upload_id, nf) raise nf except SecurityError as secerr: logger.info("%s: %s", upload_id, secerr.description) # TODO: Should this be BadRequest or NotFound. I'm leaning towards # NotFound in order to provide as little feedback as posible to client. raise NotFound(UPLOAD_FILE_NOT_FOUND) except Forbidden as forb: logger.info("%s: Operation forbidden: %s.", upload_id, forb) raise forb except Exception as ue: logger.info( "Unknown error in content file exists operation. " " Add except clauses for '%s'. DO IT NOW!", ue) raise InternalServerError(UPLOAD_UNKNOWN_ERROR) headers = {'ARXIV-OWNER': upload_db_data.owner_user_id, 'ETag': checksum} return {}, status.OK, headers