#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright (C) 2005-2023 Edgewall Software
# Copyright (C) 2005 Matthew Good <trac@matt-good.net>
# All rights reserved.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://trac.edgewall.org/wiki/TracLicense.
#
# This software consists of voluntary contributions made by many
# individuals. For the exact contribution history, see the revision
# history and logs, available at https://trac.edgewall.org/log/.
#
# Author: Matthew Good <trac@matt-good.net>

import os
import pkg_resources
import urllib.parse

from trac import __version__ as VERSION
from trac.web.main import dispatch_request

use_flup = os.environ.get('TRAC_USE_FLUP', False)
if use_flup in ('0', 'no', 'off'):
    use_flup = False

class FlupMiddleware(object):
    """Flup doesn't URL unquote the PATH_INFO, so we need to do it."""
    def __init__(self, application):
        self.application = application

    def __call__(self, environ, start_response):
        environ['PATH_INFO'] = urllib.parse.unquote(environ.get('PATH_INFO',
                                                                ''))
        return self.application(environ, start_response)

params = {}

if use_flup:
    try:
        from flup.server.fcgi import WSGIServer
    except ImportError:
        use_flup = False
    else:
        params['maxThreads'] = 15
        dispatch_request = FlupMiddleware(dispatch_request)

if not use_flup:
    from ._fcgi import WSGIServer

def run():
    WSGIServer(dispatch_request, **params).run()

if __name__ == '__main__':
    pkg_resources.require('Trac==%s' % VERSION)
    run()
