from albatross import SimpleApp, Template

doc = '''<html>
<head><title>SCGI Test</title>
<body>
<al-form method="post">
Username: <al-input type="text" name="username" /><br/>
Password: <al-input type="password" name="password" /><br/>
<al-input type="submit" name="submit" value="Logon" />
</al-form>
</body>
</html>'''

class Home:
    name = 'home'
    def page_display(self, ctx):
        template = Template(ctx, '<magic>', doc)
        template.to_html(ctx)

class App(SimpleApp):
    def __init__(self):
        SimpleApp.__init__(
            self,
            base_url='/',
            template_path='.',
            start_page='home',
            secret='-=secret=-')
        self.register_page(Home.name, Home())


#
# Everything below here is the SCGI server stuff
#

import cgi
from cStringIO import StringIO
from scgi.scgi_server import SCGIHandler, SCGIServer
from albatross import cgiapp

class Request(cgiapp.RequestFields):

    def __init__(self, env, input):

        # Store the environment
        self.env = env

        # Set up the response objects
        self._status = 200
        self.headers = {}
        self.data = StringIO()

        # Build the fields from the input stream and pass through
        fields = cgi.FieldStorage(fp=input, environ=self.env)
        cgiapp.RequestFields.__init__(self, fields)

    def get_header(self, name):
        env_name = 'HTTP_' + name.upper().replace('-', '_')
        return self.env.get(env_name)

    def get_uri(self):
        return self.env.get('REQUEST_URI')

    def get_path_info(self):
        return self.env.get('PATH_INFO')

    def get_servername(self):
        return self.env.get('SERVER_NAME')

    def write_header(self, name, value):
        self.headers[name] = value

    def end_headers(self):
        pass

    def write_content(self, data):
        self.data.write(data)

    def set_status(self, status):
        self._status = status

    def status(self):
        return self._status

class Handler(SCGIHandler):

    def handle_connection(self, conn):
        # Make the input and output files
        input = conn.makefile('r')
        output = conn.makefile('w')
        
        # Build the environment dict
        env = self.read_env(input)
        
        # Run the request
        request = Request(env, input)
        Server.app.run(request)
        
        # Send the headers
        for name, value in request.headers.items():
            output.write('%s: %s\n' % (name, value))
        output.write('\n')
        # Send the content
        if request.status() == 200:
            output.write(request.data.getvalue())
        
        # Clean up
        input.close()
        output.close()
        conn.close()

class Server(SCGIServer):
    def __init__(self, host='', port=4000, max_children=5):
        SCGIServer.__init__(
            self, 
            handler_class=Handler, 
            host=host, 
            port=port, 
            max_children=max_children)

#
# Everything below here is probably an al-scgi script or something
#

Server.app = App()
server = Server()
server.serve()