Files
msw/mswp.py
2020-03-29 10:26:19 +08:00

83 lines
2.4 KiB
Python

import os
import random
import hashlib
from config import jsondata
'''
A datapack must like:
---------------------
post log msw/1.0
id: miku [auto]
flag: 1a2b3c4d [auto]
length: 0 [auto]
from: appname
to: [if has (net id)]
filename: [if has]
[data content here
if has
support many lines...]
---------------------
'''
BUFFSIZE = jsondata.try_to_read_jsondata('buffsize', 4096)
class Datapack:
def __init__(self, method='post', app='all', version='msw/0.1', head=None, body=b'',
file=None, gen_flag=True):
self.id = jsondata.try_to_read_jsondata('id', 'unknown_id')
if head is None:
head = {}
self.head = head
self.head['id'] = self.id
self.method = method
self.file = file
self.app = app
self.version = version
self.body = body
self.encode_data = b''
if gen_flag:
randseed = str(random.random()).encode()
h = hashlib.blake2b(digest_size = 4)
h.update(randseed)
self.head['flag'] = h.hexdigest()
def encode(self):
if self.method == 'file':
self.body = b''
self.head['length'] = str(os.path.getsize(self.head['filename']))
else:
self.head['length'] = str(len(self.body))
first_line = self.method.encode() + b' ' + self.app.encode() + b' ' + self.version.encode()
heads = ''.encode()
needed_to_del = []
for i in self.head: # del the empty head
if not self.head[i]:
needed_to_del.append(i)
for i in needed_to_del:
del(self.head[i])
for i in self.head:
heads += i.encode() + b': ' + self.head[i].encode() + b'\n'
self.encode_data = first_line + b'\n' + heads + b'\n' + self.body
def decode(self, only_head=False):
index = self.encode_data.index(b'\n\n')
upper = self.encode_data[:index]
if not only_head:
self.body = self.encode_data[index+2:]
else:
self.body = b''
upper = upper.decode()
heads = upper.split('\n')
first_line = heads.pop(0)
self.method, self.app, self.version = first_line.split(' ')
for line in heads:
i, ii = line.split(': ')
self.head[i] = ii
if only_head:
return self.encode_data[index+2:]
else:
return None