class WSGI(object):

    version = '1.0'
    last_call = True

    def get_headers(self):
        raise NotImplementedError

    def read_body(self, n):
        raise NotImplementedError

    def write_header(self, name, value):
        raise NotImplementedError

    def end_headers(self):
        raise NotImplementedError

    def write(self, chunk):
        raise NotImplementedError

    def flush(self):
        pass

    def end(self):
        raise NotImplementedError

    def write_error(self, msg):
        raise NotImplementedError


import os
import sys

class CGI(WSGI):

    last_call = False

    def __init__(self,
                 environ=os.environ,
                 stdin=sys.stdin,
                 stdout=sys.stdout,
                 stderr=sys.stderr):
        self._environ = environ
        self._stdin = stdin
        self._stdout = stdout
        self._stderr = stderr
        self._state = 'headers'
        
    def get_headers(self):
        return self._environ

    def read_body(self, n):
        return self._stdin.read(n)

    def write_header(self, name, value):
        if self._state != 'headers':
            raise ProtocolError
        self._stdout.write('%s: %s\r\n' % (name, value))

    def end_headers(self):
        if self._state != 'headers':
            raise ProtocolError
        self._stdout.write('\r\n')
        self._state = 'body'
        
    def write(self, chunk):
        if self._state != 'body':
            raise ProtocolError
        self._stdout.write(chunk)

    def flush(self):
        self._stdout.flush()

    def end(self):
        self.flush()
        self._state = 'end'

    def write_error(self, msg):
        self._stderr.write(msg)

def simple_app(wsi):
    wsi.write_header('Status', '200 OK')
    wsi.write_header('Content-Type', 'text/plain')
    wsi.end_headers()
    wsi.write('Hello world!\n')
    wsi.end()
