Implement ETag support in HTTP header Signed-off-by: Nickle Wang <nick...@nvidia.com> Cc: Abner Chang <abner.ch...@amd.com> Cc: Igor Kulchytskyy <ig...@ami.com> --- .../v1sim/resource.py | 10 +++++-- .../v1sim/systems.py | 28 +++++++++++-------- 2 files changed, 25 insertions(+), 13 deletions(-)
diff --git a/Tools/Redfish-Profile-Simulator/v1sim/resource.py b/Tools/Redfish-Profile-Simulator/v1sim/resource.py index e722d16a..0c7a8382 100644 --- a/Tools/Redfish-Profile-Simulator/v1sim/resource.py +++ b/Tools/Redfish-Profile-Simulator/v1sim/resource.py @@ -36,6 +36,12 @@ class RfResource: self.final_init_processing(base_path, rel_path) else: self.res_data = {} + self.generate_etag(json.dumps(self.res_data)) + + def generate_etag(self, context): + md5 = hashlib.md5() + md5.update(context.encode('utf-8')) + self.etag = 'W/"' + md5.hexdigest() + '"' def create_sub_objects(self, base_path, rel_path): pass @@ -49,8 +55,8 @@ class RfResource: # SHA1 should generate well-behaved etags response = flask.make_response(self.response) response.mimetype = 'application/json' - etag = hashlib.sha1(self.response.encode('utf-8')).hexdigest() - response.set_etag(etag) + response.headers["ETag"] = self.etag + return response except KeyError: flask.abort(404) diff --git a/Tools/Redfish-Profile-Simulator/v1sim/systems.py b/Tools/Redfish-Profile-Simulator/v1sim/systems.py index 6305a51e..5adf81be 100644 --- a/Tools/Redfish-Profile-Simulator/v1sim/systems.py +++ b/Tools/Redfish-Profile-Simulator/v1sim/systems.py @@ -92,7 +92,11 @@ class RfSystemObj(RfResource): if "BootOrder" in boot_data: self.res_data['Boot']['BootOrder'] = boot_data['BootOrder'] - resp = flask.Response(json.dumps(self.res_data,indent=4), mimetype="application/json") + context = json.dumps(self.res_data,indent=4) + self.generate_etag(context) + resp = flask.Response(context, mimetype="application/json") + resp.headers["ETag"] = self.etag + return 0, 200, None, resp def reset_resource(self, reset_data): @@ -136,26 +140,28 @@ class RfMemoryCollection(RfCollection): post_data["@odata.id"] = newMemoryUrl - md5 = hashlib.md5() - md5.update(json.dumps(post_data).encode("utf-8")) - etag_str = 'W/"' + md5.hexdigest() + '"' - post_data["@odata.etag"] = etag_str + self.generate_etag(json.dumps(post_data,indent=4)) + + post_data["@odata.etag"] = self.etag self.elements[str(newMemoryIdx)] = post_data resp = flask.Response(json.dumps(post_data,indent=4), mimetype="application/json") resp.headers["Location"] = newMemoryUrl - resp.headers["ETag"] = etag_str - + resp.headers["ETag"] = self.etag return 0, 200, None, resp def patch_memory(self, Idx, patch_data): - md5 = hashlib.md5() - md5.update(json.dumps(patch_data).encode("utf-8")) - etag_str = 'W/"' + md5.hexdigest() + '"' - patch_data["@odata.etag"] = etag_str + + self.elements[str(Idx)] = {**self.elements[str(Idx)], **patch_data} + + context = json.dumps(self.elements[str(Idx)],indent=4) + self.generate_etag(context) + patch_data["@odata.etag"] = self.etag self.elements[str(Idx)] = {**self.elements[str(Idx)], **patch_data} + resp = flask.Response(json.dumps(self.elements[str(Idx)],indent=4), mimetype="application/json") + resp.headers["ETag"] = self.etag return 0, 200, None, resp def get_memory(self, Idx): -- 2.17.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#104267): https://edk2.groups.io/g/devel/message/104267 Mute This Topic: https://groups.io/mt/98762711/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-