#!/usr/bin/env python3
import http.server, os, re, datetime

DIR = "/opt/drop"
REQLOG = os.path.join(DIR, '_req.log')

def logreq(ip, method, path, n, head):
    try:
        with open(REQLOG, 'a') as f:
            f.write('%s %s %s %s len=%d %r\n' % (datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), ip, method, path, n, head[:60]))
    except Exception:
        pass

class H(http.server.SimpleHTTPRequestHandler):
    protocol_version = 'HTTP/1.1'

    def _reply(self, code, body):
        self.send_response(code)
        self.send_header('Content-type', 'text/plain')
        self.send_header('Content-Length', str(len(body)))
        self.end_headers()
        self.wfile.write(body)

    def do_POST(self):
        name = 'soc-sim.log'
        if self.path == '/log':
            pass
        elif self.path.startswith('/log/'):
            raw = os.path.basename(self.path[len('/log/'):].lstrip('/'))
            if not re.match(r'^soc-sim[A-Za-z0-9._-]*\.log$', raw):
                self._reply(400, b'bad name')
                return
            name = raw
        else:
            self._reply(404, b'not found')
            return
        try:
            length = int(self.headers.get('Content-Length', 0))
            data = self.rfile.read(length)
            with open(os.path.join(DIR, name), 'wb') as f:
                f.write(data)
        except Exception as e:
            self._reply(500, ('write fail: %s' % e).encode())
            return
        logreq(self.client_address[0], 'POST', self.path, len(data), data)
        self._reply(200, b'OK')

    def do_GET(self):
        logreq(self.client_address[0], 'GET', self.path, 0, b'')
        super().do_GET()

    def log_message(self, fmt, *args):
        pass

if __name__ == '__main__':
    os.chdir(DIR)
    H.directory = DIR
    http.server.ThreadingHTTPServer(('0.0.0.0', 8088), H).serve_forever()

