Mam element oprogramowania pośredniczącego typu Rack, który ładuje dzierżawcę za pośrednictwem poddomeny i stosuje pewne ustawienia domyślne. Oprogramowanie pośrednie, choć nie ładne, działa wystarczająco dobrze. Jednakże, gdy wyjątek jest zgłaszany w aplikacji, oprogramowanie pośrednie "zatrzymuje" pełne śledzenie stosu. Kiedy mówię o pułapce, mam na myśli to, że ukrywa oczekiwany ślad stosu.Śledzenie stosu warstwy pośredniej "zalewkowanie"
Oto przykład.
mam rzucać wyjątek w działaniu regulatora tak:
def index
throw "Exception in a Rails controller action"
@taxonomies = Spree::Taxonomy.all
end
Można by oczekiwać, że ślad stosu byłoby odwołać tę lokalizację, ale tak nie jest. Zamiast tego odnosi się do linii w oprogramowaniu pośredniczącym.
Completed 500 Internal Server Error in 139ms
UncaughtThrowError (uncaught throw "Exception in a Rails controller action"):
lib/tenant_manager/middleware/loader.rb:42:in `call'
Dlaczego tak się dzieje? Czy widziałeś coś takiego wcześniej?
Oto middleware:
# lib/tenant_manager/middleware/loader.rb
module TenantManager
module Middleware
class Loader
# Middleware to detect an tenant via subdomain early in
# the request process
#
# Usage:
# # config/application.rb
# config.middleware.use TenantManager::Middleware::Loader
#
# A scaled down version of https://github.com/radar/houser
def initialize(app)
@app = app
end
def call(env)
domain_parts = env['HTTP_HOST'].split('.')
if domain_parts.length > 2
subdomain = domain_parts.first
tenant = Leafer::Tenant.find_by_database(subdomain)
if tenant
ENV['CURRENT_TENANT_ID'] = tenant.id.to_s
ENV['RAILS_CACHE_ID'] = tenant.database
Spree::Image.change_paths tenant.database
Apartment::Tenant.process(tenant.database) do
country = Spree::Country.find_by_name('United States')
Spree.config do |config|
config.default_country_id = country.id if country.present?
config.track_inventory_levels = false
end
Spree::Auth::Config.set(:registration_step => false)
end
end
else
ENV['CURRENT_TENANT_ID'] = nil
ENV['RAILS_CACHE_ID'] = ""
end
@app.call(env)
end
end
end
end
Używam rubin 2.2.0p0
i rails 4.1.8
.
Przeszukałem strony internetowe, ale nie mogłem nic znaleźć, prawdopodobnie dlatego, że nie szukam właściwej rzeczy.
Jakieś myśli o tym, dlaczego tak się dzieje i co robię źle?
Pozdrawiam!