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()