Exemple #1
0
def application(environ, start_response):
    global CONFIGFILE
    global gConfig,  gRequest, gSessionStore
    if gSessionStore is None:
        gSessionStore = FilesystemSessionStore()
    conf = {}
    # print('CONFIGFILE=%s' % CONFIGFILE)
    conf['config_path'] = CONFIGFILE
    conf['gConfig'] = gConfig
    conf['gRequest'] = gRequest
    conf['gSessionStore'] = gSessionStore
    conf['gClientMongo'] = gClientMongo

    # headers = {}
    mimetype = 'text/plain'
    headerslist = []
    body = ''
    sess = None
    cookie = {}
    statuscode = 200
    if not ip_check(conf, environ):
        mimetype = 'text/json'
        body = json.dumps({'result':'your_ip_access_deny'}, ensure_ascii=True, indent=4)
        response = Response(body, status=statuscode, mimetype=mimetype)
        return response(environ, start_response)
    path_info = environ['PATH_INFO']
    # headers['Content-Type'] = 'text/plain;charset=' + ENCODING

    app = gConfig['wsgi']['application']
    if not app in gConfig['applications']:
        statuscode = 404
        body = 'Not Found'
    if path_info[-1:] == '/':
        if 'indexpage' in gConfig['applications'][app]['static']['page'] \
           and len(gConfig['applications'][app]['static']['page']['indexpage']) > 0:
            path_info = gConfig['applications'][app]['static']['page']['indexpage']
        else:
            statuscode = 404
            body = 'Not Found'
    if len(path_info) > 7 and path_info[:6] == '/proxy':
        pkey = path_info[7:]
        if '/' in pkey :
            idx = pkey.index('/')
            pkey = pkey[:idx]
        if 'proxy' in gConfig['applications'][app] and  len(list(gConfig['applications'][app]['proxy'].keys()))>0:
            if pkey in gConfig['applications'][app]['proxy']:
                pro = gConfig['applications'][app]['proxy'][pkey]
                proxy_placeholder = 'proxy_%s' % pkey
                real_url = pro['url']
                connection_timeout = float(pro['connection_timeout'])
                network_timeout = float(pro['network_timeout'])
                request_headers={}
                # if 'header' in pro:
                #     for k in pro['header'].keys():
                #         if isinstance(pro['header'][k], str):
                #             request_headers[str(k)] = str(pro['header'][k])
                #         elif isinstance(pro['header'][k], list):
                #             s = ','.join( pro['header'][k])
                #             request_headers[str(k)] = str(s)
                statuscode, mimetype, body = handle_http_proxy(conf, environ,
                                                               proxy_placeholder=proxy_placeholder,
                                                               real_url=real_url,
                                                               # ca_cert=ca_cert,
                                                               connection_timeout=connection_timeout,
                                                               network_timeout=network_timeout,
                                                               request_headers=request_headers)
    elif gConfig['applications'][app]['session']['enable_session'].lower() == 'true':

        is_expire = False
        with session_manager(environ):
            sess, cookie, is_expire = session_handle(environ, gRequest, gSessionStore)
            if not 'ip' in sess:
                sess['ip'] = environ['REMOTE_ADDR']
            gSessionStore.save_if_modified(sess)
            urls_need_not_session_check = gConfig['applications'][app]['session']['urls_need_not_session_check']
            if len(urls_need_not_session_check) > 0 \
                and isinstance(urls_need_not_session_check, str)  \
                and path_info == urls_need_not_session_check:
                statuscode, mimetype, body =  getattr(globals()[app], 'handle_url' )(conf, environ, sess)
            elif len(urls_need_not_session_check) > 0 \
                and isinstance(urls_need_not_session_check, list) :
                if path_info in urls_need_not_session_check:
                    if check_is_static(conf, path_info):
                        statuscode, mimetype, body =  handle_static(conf, environ, path_info)
                    else:
                        statuscode, mimetype, body =  getattr(globals()[app], 'handle_url' )(conf, environ, sess)
                else:
                    if not is_expire and len(sess.sid) > 0:
                        if sess and 'username' in sess:
                            if check_is_static(conf, path_info):
                                statuscode, mimetype, body = handle_static(conf, environ, path_info)
                            else:
                                statuscode, mimetype, body = getattr(globals()[app], 'handle_url')(conf, environ, sess)
                        else:
                            if check_is_static(conf, path_info) and not check_is_static_html(conf, path_info):
                                statuscode, mimetype, body = handle_static(conf, environ, path_info)
                            else:
                                statuscode, mimetype, body = handle_static(conf, environ,
                                                                           gConfig['applications'][app]['static'][
                                                                               'page']['unauthorizedpage'])
                                statuscode = 401
                    else:
                        if check_is_static(conf, path_info) and not check_is_static_html(conf, path_info):
                            statuscode, mimetype, body = handle_static(conf, environ, path_info)
                        else:
                            statuscode, mimetype, body = handle_static(conf, environ,
                                                                       gConfig['applications'][app]['static']['page'][
                                                                           'unauthorizedpage'])
                            statuscode = 401

                    # if check_is_static(conf, path_info) and not check_is_static_html(conf, path_info):
                    #     statuscode, mimetype, body = handle_static(conf, environ, path_info)
                    # else:
                    #     statuscode, mimetype, body = handle_static(conf, environ, gConfig['applications'][app]['static']['page']['unauthorizedpage'])
                    #     statuscode = 401
            elif gConfig['applications'][app]['static']['static_enable'].lower() == 'true':
                if not is_expire and len(sess.sid) > 0:
                    if sess and 'username' in sess:
                        if check_is_static(conf, path_info):
                            statuscode, mimetype, body =  handle_static(conf, environ, path_info)
                        else:
                            statuscode, mimetype, body =  getattr(globals()[app], 'handle_url' )(conf, environ, sess)
                    else:
                        if check_is_static(conf, path_info) and not check_is_static_html(conf, path_info):
                            statuscode, mimetype, body =  handle_static(conf, environ, path_info)
                        else:
                            statuscode, mimetype, body =  handle_static(conf, environ, gConfig['applications'][app]['static']['page']['unauthorizedpage'])
                            statuscode = 401
                else:
                    if check_is_static(conf, path_info) and not check_is_static_html(conf, path_info):
                        statuscode, mimetype, body =  handle_static(conf, environ, path_info)
                    else:
                        statuscode, mimetype, body =  handle_static(conf, environ, gConfig['applications'][app]['static']['page']['unauthorizedpage'])
                        statuscode = 401
            elif gConfig['applications'][app]['static']['static_enable'].lower() == 'false':
                if not is_expire and len(sess.sid) > 0:
                    if check_is_static(conf, path_info):
                        statuscode = 404
                        body = 'Not Found'
                        mimetype = 'text/plain'
                    else:
                        statuscode, mimetype, body =  getattr(globals()[app], 'handle_url' )(conf, environ, sess)
                else:
                    statuscode, mimetype, body =  handle_static(conf, environ, gConfig['applications'][app]['static']['page']['unauthorizedpage'])
                    statuscode = 401
    else:
        if gConfig['applications'][app]['static']['static_enable'].lower() == 'true':
            if check_is_static(conf, path_info):
                statuscode, mimetype, body =  handle_static(conf, environ, path_info)
            else:
                statuscode, mimetype, body =  getattr(globals()[app], 'handle_url' )(conf, environ, None)
        else:
            if check_is_static(conf, path_info):
                statuscode = 404
                body = 'Not Found'
                mimetype = 'text/plain'
            else:
                statuscode, mimetype, body =  getattr(globals()[app], 'handle_url' )(conf, environ, None)

    headers = CORS_header({})
    for k in headers:
        if not check_header_exist(headerslist, k):
            headerslist.append((k, headers[k]))
    if body and isinstance(body, str)  and len(body) > 7 and body[:8] == '_cookie_':
        o = json.loads(body[8:])
        if isinstance(o, dict):
            for k in o.keys():
                cookie[k] = o[k]
        body = body[8:]
    response = Response(body, status=statuscode, mimetype=mimetype, headers=headerslist)
    if len(list(cookie.keys())) > 0 :#and 'username' in cookie:
        if sess and len(list(sess.keys()))>0:
            for k in sess.keys():
                cookie[k] = sess[k]
        response.set_cookie('session_data', json.dumps(cookie, ensure_ascii=True, indent=4))
    return response(environ, start_response)