2011-08-05 22 views
14

mojej konfiguracji: Szyny 3.0.9 Ruby 1.9.2Rails 3 middleware modyfikować nagłówki żądania

Pracuję nad moim pierwszym aplikacji middleware i wydaje się, że wszystkie przykłady radzenia sobie z modyfikować odpowiedź. Muszę w szczególności przeanalizować i zmodyfikować nagłówki żądań, usunąć niektóre obraźliwe nagłówki powodujące dławienie się w Rack 1.2.3. Oto typowa aplikacja Rack na świecie Hello.

my_middleware.rb 

class MyMiddleware 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    @status, @headers, @response = @app.call(env) 
    [@status, @headers, @response] 
    end 
end 

Czy ktoś ma przykład, który zajmuje się nagłówkami żądań i przechwytuje je, zanim Rack je zdobędzie? Muszę zmodyfikować nagłówki żądań, zanim trafi do Rack do parsowania. Mam tę konfigurację, myśląc, że umieszczenie jej przed Rackem może załatwić sprawę, ale nie jestem pewien, czy nakaz egzekucji jest egzekwowany w ten sposób.

application.rb 

config.middleware.insert_before Rack::Lock, "MyMiddleware" 

Odpowiedz

16

W swojej metodzie call, powinieneś być w stanie zmodyfikować env, który jest stojaku. Rack przygotowuje HTTP_ do każdego nagłówka, więc nagłówek Accept będzie dostępny za pośrednictwem env['HTTP_ACCEPT'].

Jeśli więc chcesz usunąć określone nagłówki, powinieneś być w stanie zrobić coś takiego, jak env.delete('HTTP_ACCEPT'). Następnie, gdy wykonasz numer @app.call(env), użyje on zmodyfikowanej wersji env.

Aby uzyskać więcej informacji na temat obiektu the Rack documentation (patrz "Środowisko").

+0

Świetnie, spróbuję, czy wiesz, czy moja konfiguracja przechwytuje nagłówki, zanim Rack wykona, czy też nie, kolejność ładowania oprogramowania pośredniego w ogóle w zakresie kolejności wykonywania. – Bob

+0

Wierzę, że Rack nadal będzie przechwytywał żądanie, ale potem przekazuje je do oprogramowania pośredniego zamiast bezpośrednio do Rails. Ale nie jestem w 100% pewny. –

+0

Jeśli tak jest, to nie będzie działać dla mnie. Właśnie wyrzuciłem klasę obiektu '@ app' i pokazuje' Rack :: Lock', co oznacza, że ​​Rack już do niej doszedł. Argh. – Bob