import os
-from http.server import BaseHTTPRequestHandler
+from http.server import BaseHTTPRequestHandler
+from http.cookies import SimpleCookie
+import json
class PlomException(Exception):
# 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:
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}')
self.unlock()
-class PlomHandler(BaseHTTPRequestHandler):
+class PlomHandler(BaseHTTPRequestHandler):
homepage = '/'
html_head = '<!DOCTYPE html>\n<html>\n<meta charset="UTF-8">'
html_foot = '</body>\n</html>'
-
+
def fail_400(self, e):
self.send_HTML(f'ERROR: {e}', 400)
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()
def try_do(self, do_method):
try:
- do_method()
+ do_method()
except PlomException as e:
self.fail_400(e)