X-Git-Url: https://plomlompom.com/repos/?a=blobdiff_plain;f=plomlib.py;fp=plomlib.py;h=a94eb54af2646ed1079c5498af0cb0bb0aa59775;hb=520a7a19656bb44f43b405fcd65fc495fac62748;hp=d95a35c98b0d01411f803f6d547564be15e37a91;hpb=472874343c229fc77136e1cc3bae5a1d8bc543f9;p=misc diff --git a/plomlib.py b/plomlib.py index d95a35c..a94eb54 100644 --- a/plomlib.py +++ b/plomlib.py @@ -1,5 +1,7 @@ import os -from http.server import BaseHTTPRequestHandler +from http.server import BaseHTTPRequestHandler +from http.cookies import SimpleCookie +import json class PlomException(Exception): @@ -50,10 +52,10 @@ class PlomDB: # timedelta, keep the newest file that's older ages_to_keep = [timedelta(minutes=4**i) for i in range(0, 8)] print(f'DEBUG ages_to_keep: {ages_to_keep}') - now = datetime.now() + now = datetime.now() to_save = {} for age in ages_to_keep: - limit = now - age + limit = now - age for mtime in reversed(sorted(mtimes_to_paths.keys())): print(f'DEBUG checking if {mtime} < {limit} ({now} - {age})') if datetime.strptime(mtime, '%Y-%m-%d %H:%M:%S.%f') < limit: @@ -75,7 +77,7 @@ class PlomDB: shutil.move(source, target) i += 1 - # put copy of current state at end of bak list + # put copy of current state at end of bak list print(f'DEBUG saving current state to {bak_prefix}{i}') shutil.copy(self.db_file, f'{bak_prefix}{i}') @@ -87,11 +89,11 @@ class PlomDB: self.unlock() -class PlomHandler(BaseHTTPRequestHandler): +class PlomHandler(BaseHTTPRequestHandler): homepage = '/' html_head = '\n\n' html_foot = '\n' - + def fail_400(self, e): self.send_HTML(f'ERROR: {e}', 400) @@ -99,8 +101,39 @@ class PlomHandler(BaseHTTPRequestHandler): self.send_code_and_headers(code, [('Content-type', 'text/html')]) self.wfile.write(bytes(f'{self.html_head}\n{html}\n{self.html_foot}', 'utf-8')) + def ensure_cookies_to_set(self): + if not hasattr(self, 'cookies_to_set'): + self.cookies_to_set = [] + + def set_cookie(self, cookie_name, cookie_path, cookie_db): + self.ensure_cookies_to_set() + cookie = SimpleCookie() + cookie[cookie_name] = json.dumps(cookie_db) + cookie[cookie_name]['path'] = cookie_path + self.cookies_to_set += [cookie] + + def unset_cookie(self, cookie_name, cookie_path): + self.ensure_cookies_to_set() + cookie = SimpleCookie() + cookie[cookie_name] = '' + cookie[cookie_name]['path'] = cookie_path + cookie[cookie_name]['expires'] = 'Thu, 01 Jan 1970 00:00:00 GMT' + self.cookies_to_set += [cookie] + + def get_cookie_db(self, cookie_name): + cookie_db = {} + if 'Cookie' in self.headers: + cookie = SimpleCookie(self.headers['Cookie']) + if cookie_name in cookie: + cookie_db = json.loads(cookie[cookie_name].value) + return cookie_db + def send_code_and_headers(self, code, headers=[]): + self.ensure_cookies_to_set() self.send_response(code) + for cookie in self.cookies_to_set: + for morsel in cookie.values(): + self.send_header('Set-Cookie', morsel.OutputString()) for fieldname, content in headers: self.send_header(fieldname, content) self.end_headers() @@ -110,7 +143,7 @@ class PlomHandler(BaseHTTPRequestHandler): def try_do(self, do_method): try: - do_method() + do_method() except PlomException as e: self.fail_400(e)