BASIC認証のWSGIミドルウェア

Python Unconference Tokyo 1 の説明を聞いて、ミドルウェアがなんとなく分かって、何か一つ書きたくなったので書いてみた.

def application(environ, start_response):
    start_response('200 OK', [('Content-type','text/plain')])
    return ['OK']

def basic_auth(application, realm, login_id, password):
    __application = application
    __login_id = login_id
    __password = password
    __realm = realm
    def handler(environ, start_response):
        try:
            if 'HTTP_AUTHORIZATION' in environ:
                s = environ['HTTP_AUTHORIZATION'].split(' ')
                if s[0] == 'Basic':
                    import base64
                    t = base64.b64decode(s[1]).split(':')
                    if (t[0] == __login_id) and (t[1] == __password):
                        return __application(environ, start_response)
        except:
            pass
        start_response('401 Unauthorized', [('WWW-Authenticate', 'Basic realm=%s' % __realm)])
        return ['401 Unauthorized']
    return handler

from wsgiref.simple_server import make_server
make_server('', 8000, basic_auth(application, 'restricted', 'hoge', 'orz')).serve_forever()