# Path: drift/fixers.py
# class ReverseProxied(object):
#     '''Wrap the application in this middleware and configure the
#     front-end server to add these headers, to let you quietly bind
#     this to a URL other than / and to an HTTP scheme that is
#     different than what is used locally.
# 
#     In nginx:
#     location /myprefix {
#         proxy_pass http://192.168.0.1:5001;
#         proxy_set_header Host $host;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#         proxy_set_header X-Scheme $scheme;
#         proxy_set_header X-Script-Name /myprefix;
#         }
# 
#     :param app: the WSGI application
#     '''
#     def __init__(self, app):
#         self.app = app
# 
#     def __call__(self, environ, start_response):
#         script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
#         if script_name:
#             environ['SCRIPT_NAME'] = script_name
#             path_info = environ['PATH_INFO']
#             if path_info.startswith(script_name):
#                 environ['PATH_INFO'] = path_info[len(script_name):]
# 
#         scheme = environ.get('HTTP_X_SCHEME', environ.get('X-Forwarded-Proto', ''))
#         if scheme:
#             environ['wsgi.url_scheme'] = scheme
# 
#         server = environ.get('HTTP_X_FORWARDED_SERVER', '')
#         if server:
#             environ['HTTP_HOST'] = server
# 
#         return self.app(environ, start_response)
# 
# class CustomJSONEncoder(JSONEncoder):
#     '''Extend the JSON encoder to treat date-time objects as strict
#     rfc3339 types.
#     '''
#     def default(self, obj):
#         from drift.orm import ModelBase
#         if isinstance(obj, date):
#             return obj.isoformat() + "Z"
#         elif isinstance(obj, ModelBase):
#             return obj.as_dict()
#         else:
#             return JSONEncoder.default(self, obj)
# 
# Path: drift/utils.py
# def get_app_root():
#     """Returns absolute path to the current application root directory."""
#     return os.path.expanduser(os.environ.get('DRIFT_APP_ROOT', os.path.abspath('.')))


import os
import sys
import logging
import importlib
import json
import os.path
import time
import warnings
import pkgutil
import drift.core.extensions
from flask import Flask
from flask_smorest import Api
from werkzeug.middleware.proxy_fix import ProxyFix
from werkzeug.utils import import_string, ImportStringError
from drift.fixers import ReverseProxied, CustomJSONEncoder
from drift.utils import get_app_root
                "%s module '%s' has no drift_init_extension() function.",
                category.title(), module_name
            )

    performance.append({
        'category': category,
        'module_name': module_name,
        'total_time': time.time() - t,
        'import_time': import_time,
    })

    return init


def _apply_patches(app):
    """
    Apply special fixes and/or monkey patches. These fixes will hopefully
    become obsolete with proper fixes made to these libraries in the future.
    """
    # "X-Forwarded-For" remote_ip fixup when running behind a load balancer.
    # Normal setup on AWS includes a single ELB which appends to "X-Forwarded-For"
    # header value, thus one proxy.
    num_proxies = 1
    app.wsgi_app = ProxyFix(app.wsgi_app, x_for=num_proxies, x_proto=num_proxies, x_host=num_proxies)

    # Fixing SCRIPT_NAME/url_scheme when behind reverse proxy (i.e. the
    # API router).
    app.wsgi_app = ReverseProxied(app.wsgi_app)

    # Datetime fix

# Path: drift/fixers.py
# class ReverseProxied(object):
#     '''Wrap the application in this middleware and configure the
#     front-end server to add these headers, to let you quietly bind
#     this to a URL other than / and to an HTTP scheme that is
#     different than what is used locally.
# 
#     In nginx:
#     location /myprefix {
#         proxy_pass http://192.168.0.1:5001;
#         proxy_set_header Host $host;
#         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
#         proxy_set_header X-Scheme $scheme;
#         proxy_set_header X-Script-Name /myprefix;
#         }
# 
#     :param app: the WSGI application
#     '''
#     def __init__(self, app):
#         self.app = app
# 
#     def __call__(self, environ, start_response):
#         script_name = environ.get('HTTP_X_SCRIPT_NAME', '')
#         if script_name:
#             environ['SCRIPT_NAME'] = script_name
#             path_info = environ['PATH_INFO']
#             if path_info.startswith(script_name):
#                 environ['PATH_INFO'] = path_info[len(script_name):]
# 
#         scheme = environ.get('HTTP_X_SCHEME', environ.get('X-Forwarded-Proto', ''))
#         if scheme:
#             environ['wsgi.url_scheme'] = scheme
# 
#         server = environ.get('HTTP_X_FORWARDED_SERVER', '')
#         if server:
#             environ['HTTP_HOST'] = server
# 
#         return self.app(environ, start_response)
# 
# class CustomJSONEncoder(JSONEncoder):
#     '''Extend the JSON encoder to treat date-time objects as strict
#     rfc3339 types.
#     '''
#     def default(self, obj):
#         from drift.orm import ModelBase
#         if isinstance(obj, date):
#             return obj.isoformat() + "Z"
#         elif isinstance(obj, ModelBase):
#             return obj.as_dict()
#         else:
#             return JSONEncoder.default(self, obj)
# 
# Path: drift/utils.py
# def get_app_root():
#     """Returns absolute path to the current application root directory."""
#     return os.path.expanduser(os.environ.get('DRIFT_APP_ROOT', os.path.abspath('.')))


# Path: drift/flaskfactory.py
import os
import sys
import logging
import importlib
import json
import os.path
import time
import warnings
import pkgutil
import drift.core.extensions
from flask import Flask
from flask_smorest import Api
from werkzeug.middleware.proxy_fix import ProxyFix
from werkzeug.utils import import_string, ImportStringError
from drift.fixers import ReverseProxied, CustomJSONEncoder
from drift.utils import get_app_root

                "%s module '%s' has no drift_init_extension() function.",
                category.title(), module_name
            )

    performance.append({
        'category': category,
        'module_name': module_name,
        'total_time': time.time() - t,
        'import_time': import_time,
    })

    return init


def _apply_patches(app):
    """
    Apply special fixes and/or monkey patches. These fixes will hopefully
    become obsolete with proper fixes made to these libraries in the future.
    """
    # "X-Forwarded-For" remote_ip fixup when running behind a load balancer.
    # Normal setup on AWS includes a single ELB which appends to "X-Forwarded-For"
    # header value, thus one proxy.
    num_proxies = 1
    app.wsgi_app = ProxyFix(app.wsgi_app, x_for=num_proxies, x_proto=num_proxies, x_host=num_proxies)

    # Fixing SCRIPT_NAME/url_scheme when behind reverse proxy (i.e. the
    # API router).
    app.wsgi_app = ReverseProxied(app.wsgi_app)

    # Datetime fix

    app.json_encoder = CustomJSONEncoder