2011-08-05 12 views
14

Thiết lập của tôi: Rails 3.0.9, Ruby 1.9.2Rails 3 phần giữa yêu cầu sửa đổi tiêu đề yêu cầu

Tôi đang làm việc trên ứng dụng phần mềm trung gian đầu tiên của mình và dường như tất cả các ví dụ đều thay đổi phản hồi. Tôi cần phải kiểm tra và sửa đổi các tiêu đề yêu cầu nói riêng, xóa một số tiêu đề vi phạm gây ra lỗi trong Rack 1.2.3 để choke. Đây là ứng dụng Hello world Rack điển hình.

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 

Có ai có ví dụ liên quan đến yêu cầu headrers và chặn chúng trước Rack không? Tôi cần phải sửa đổi các tiêu đề yêu cầu trước khi nó đến Rack for parsing. Tôi có thiết lập này, nghĩ rằng việc đặt nó trước khi Rack có thể thực hiện thủ thuật nhưng tôi không chắc chắn nếu lệnh thực hiện được thực thi theo cách này.

application.rb 

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

Trả lời

16

Trong phương pháp call của bạn, bạn sẽ có thể sửa đổi env, đó là môi trường rack. Rack prepends HTTP_ cho mỗi tiêu đề, do đó, tiêu đề Accept sẽ được truy cập qua env['HTTP_ACCEPT'].

Vì vậy, nếu bạn cần xóa một số tiêu đề nhất định, bạn sẽ có thể thực hiện điều gì đó như env.delete('HTTP_ACCEPT'). Sau đó, khi bạn làm @app.call(env), nó sẽ sử dụng env được sửa đổi của bạn.

Xem the Rack documentation để biết thêm thông tin về đối tượng env (xem "Môi trường").

+0

Tuyệt, tôi sẽ thử này, bạn có biết liệu thiết lập của tôi có chặn các tiêu đề trước khi Rack thực hiện hay thực hiện thứ tự tải các phần mềm trung gian về mặt thứ tự thực hiện. – Bob

+0

Tôi tin Rack vẫn sẽ chặn yêu cầu đầu tiên, nhưng sau đó chuyển nó vào phần mềm trung gian thay vì trực tiếp đến Rails. Nhưng tôi không chắc chắn 100%. –

+0

Nếu đó là trường hợp, sau đó nó sẽ không làm việc cho tôi. Tôi vừa hủy bỏ lớp đối tượng '@ app' và nó hiển thị' Rack :: Lock' có nghĩa là Rack đã nhận được nó. Argh. – Bob