Skip to content
Snippets Groups Projects
webserver.py 1.54 KiB
Newer Older
  • Learn to ignore specific revisions
  • matrix.org's avatar
    matrix.org committed
    import argparse
    import BaseHTTPServer
    import os
    import SimpleHTTPServer
    
    matrix.org's avatar
    matrix.org committed
    
    from daemonize import Daemonize
    
    
    class SimpleHTTPRequestHandlerWithPOST(SimpleHTTPServer.SimpleHTTPRequestHandler):
        UPLOAD_PATH = "upload"
    
        """
        Accept all post request as file upload
        """
        def do_POST(self):
    
            path = os.path.join(self.UPLOAD_PATH, os.path.basename(self.path))
            length = self.headers['content-length']
            data = self.rfile.read(int(length))
    
            with open(path, 'wb') as fh:
                fh.write(data)
    
            self.send_response(200)
            self.send_header('Content-Type', 'application/json')
            self.end_headers()
    
            # Return the absolute path of the uploaded file
            self.wfile.write('{"url":"/%s"}' % path)
    
    
    matrix.org's avatar
    matrix.org committed
    
    def setup():
        parser = argparse.ArgumentParser()
        parser.add_argument("directory")
        parser.add_argument("-p", "--port", dest="port", type=int, default=8080)
        parser.add_argument('-P', "--pid-file", dest="pid", default="web.pid")
        args = parser.parse_args()
    
        # Get absolute path to directory to serve, as daemonize changes to '/'
        os.chdir(args.directory)
        dr = os.getcwd()
    
        httpd = BaseHTTPServer.HTTPServer(
            ('', args.port),
    
    matrix.org's avatar
    matrix.org committed
        )
    
        def run():
            os.chdir(dr)
            httpd.serve_forever()
    
        daemon = Daemonize(
                app="synapse-webclient",
                pid=args.pid,
                action=run,
                auto_close_fds=False,
            )
    
        daemon.start()
    
    if __name__ == '__main__':
        setup()