@@ -118,7 +118,8 @@ def format_object(self, *args, **kwargs):
118118 return result
119119 return format_object
120120
121- def calculate_etag (node , key , classname = "Missing" , id = "0" ):
121+ def calculate_etag (node , key , classname = "Missing" , id = "0" ,
122+ repr_format = "json" ):
122123 '''given a hyperdb node generate a hashed representation of it to be
123124 used as an etag.
124125
@@ -142,13 +143,15 @@ def calculate_etag (node, key, classname="Missing", id="0"):
142143 '''
143144
144145 items = node .items (protected = True ) # include every item
145- etag = hmac .new (bs2b (key ),bs2b (repr (sorted (items )))).hexdigest ()
146+ etag = hmac .new (bs2b (key ),bs2b (repr_format +
147+ repr (sorted (items )))).hexdigest ()
146148 logger .debug ("object=%s%s; tag=%s; repr=%s" , classname , id ,
147149 etag , repr (node .items (protected = True )))
148150 # Quotes are part of ETag spec, normal headers don't have quotes
149151 return '"%s"' % etag
150152
151- def check_etag (node , key , etags , classname = "Missing" , id = "0" ):
153+ def check_etag (node , key , etags , classname = "Missing" , id = "0" ,
154+ repr_format = "json" ):
152155 '''Take a list of etags and compare to the etag for the given node.
153156
154157 Iterate over all supplied etags,
@@ -159,7 +162,8 @@ def check_etag (node, key, etags, classname="Missing", id="0"):
159162 '''
160163 have_etag_match = False
161164
162- node_etag = calculate_etag (node , key , classname , id )
165+ node_etag = calculate_etag (node , key , classname , id ,
166+ repr_format = repr_format )
163167
164168 for etag in etags :
165169 if etag is not None :
@@ -508,13 +512,13 @@ def patch_data(self, op, old_val, new_val):
508512
509513 return result
510514
511- def raise_if_no_etag (self , class_name , item_id , input ):
515+ def raise_if_no_etag (self , class_name , item_id , input , repr_format = "json" ):
512516 class_obj = self .db .getclass (class_name )
513517 if not check_etag (class_obj .getnode (item_id ),
514518 self .db .config .WEB_SECRET_KEY ,
515519 obtain_etags (self .client .request .headers , input ),
516520 class_name ,
517- item_id ):
521+ item_id , repr_format = repr_format ):
518522 raise PreconditionFailed (
519523 "If-Match is missing or does not match."
520524 " Retrieve asset and retry modification if valid." )
@@ -789,7 +793,7 @@ def get_element(self, class_name, item_id, input):
789793
790794 node = class_obj .getnode (itemid )
791795 etag = calculate_etag (node , self .db .config .WEB_SECRET_KEY ,
792- class_name , itemid )
796+ class_name , itemid , repr_format = "json" )
793797 props = None
794798 protected = False
795799 verbose = 1
@@ -871,7 +875,7 @@ def get_attribute(self, class_name, item_id, attr_name, input):
871875 class_obj = self .db .getclass (class_name )
872876 node = class_obj .getnode (item_id )
873877 etag = calculate_etag (node , self .db .config .WEB_SECRET_KEY ,
874- class_name , item_id )
878+ class_name , item_id , repr_format = "json" )
875879 data = node .__getattr__ (attr_name )
876880 result = {
877881 'id' : item_id ,
0 commit comments