import zlib
import hashlib
import json
import base64


def chksum(string, salt):
	m = hashlib.md5()
	m.update(string)
	m.update(salt)
	return m.hexdigest()

def freeze(obj, salt, level = 1):
	j = json.dumps(obj)
	c = chksum(j,salt)
	payload = "%s:%s" % ( c, j )
	c = zlib.compress(payload, level)
	b = base64.standard_b64encode(c) 
	if len(b) > 3500 and level == 1:
		# if we get close to the cookie size limit, try again with higher compression
		b = freeze( obj, salt, 9)
	return b


def thaw(string, salt):
	c = base64.standard_b64decode(string)
	payload = zlib.decompress(c)
	(h, j) = payload.split(":",1)
	obj = json.loads(j)
	c = chksum(j, salt)

	if( h != c):
		raise InvalidChecksum
	return obj

def sizetest(startcount, endcount = None, step = 1, strlen = 1):
	import random
	items = {} 
	salt = "foobar"

	if not endcount:
		endcount = startcount + 1

	payload = None
	print "items,length,raw"
	for x in xrange(0,endcount, step):
		for sx in xrange(0,step):
			i = random.randint(1000,9999)
			c = random.randint(1,20)
			c = ""
			for ch in xrange(0,strlen):
				c += chr(random.randint(49,122))

			items[i] = c

		if x >= startcount:
			payload = freeze(items, salt)
			j = json.dumps(items)
			print "%d,%d,%d" % ( x, len(payload),len(j) )
		if len(payload) > 4000:
			break
	return payload

if __name__ == "__main__":
	sizetest(0,500,1,8)

