From 3e314b6ce0dda13b4622ced4ac5ca875a1c1bce0 Mon Sep 17 00:00:00 2001 From: Jeff Hodges Date: Mon, 7 Jun 2021 19:59:21 -0700 Subject: [PATCH] WIP chunk hashing on upload --- frameioclient/lib/upload.py | 19 +++++++++++++++++-- tests/integration.py | 6 +++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/frameioclient/lib/upload.py b/frameioclient/lib/upload.py index 448dae1b..e594f028 100644 --- a/frameioclient/lib/upload.py +++ b/frameioclient/lib/upload.py @@ -1,6 +1,9 @@ import os import math +import base64 +import hashlib import requests +import traceback import threading import concurrent.futures @@ -23,6 +26,11 @@ def _calculate_chunks(self, total_size, chunk_count): return chunk_offsets + def _get_content_md5(self, data): + digest = hashlib.md5(data[:]).digest() + # print(base64.b64encode(digest).decode('utf-8')) + return base64.b64encode(digest).decode('utf-8') + def _get_session(self): if not hasattr(thread_local, "session"): thread_local.session = requests.Session() @@ -35,6 +43,7 @@ def _smart_read_chunk(self, chunk_offset, is_final_chunk): data = file.read() else: # If it's not the final chunk, we want to ONLY read the specified chunk data = file.read(self.chunk_size) + # self._get_content_md5(data) return data def _upload_chunk(self, task): @@ -51,13 +60,19 @@ def _upload_chunk(self, task): session = self._get_session() chunk_data = self._smart_read_chunk(chunk_offset, is_final_chunk) + chunk_md5 = self._get_content_md5(chunk_data) + + print(chunk_md5) try: r = session.put(url, data=chunk_data, headers={ 'content-type': self.asset['filetype'], - 'x-amz-acl': 'private' + 'x-amz-acl': 'private', + 'Content-MD5': chunk_md5 }) - # print("Completed chunk, status: {}".format(r.status_code)) + # 'Content-Length': str(len(chunk_data)) + print("Completed chunk, status: {}".format(r.content)) + print("Completed chunk, status: {}".format(r.status_code)) except Exception as e: print(e) diff --git a/tests/integration.py b/tests/integration.py index 42f7be82..955fad41 100644 --- a/tests/integration.py +++ b/tests/integration.py @@ -3,14 +3,14 @@ import json import time import socket -import platform -import mimetypes import shutil import requests +import platform +import mimetypes from math import ceil -from pprint import pprint, pformat from datetime import datetime +from pprint import pprint, pformat from frameioclient import FrameioClient, Utils, KB, MB token = os.getenv("FRAMEIO_TOKEN") # Your Frame.io token