2012-06-29 9 views
11

Các Sinatra README says:Yêu cầu Sinatra ["SOME_HEADER"] không hoạt động trên POST; doc lỗi?

request["SOME_HEADER"]  # value of SOME_HEADER header 

Với ứng dụng này:

require 'sinatra' 

post '/env' do 
    env['HTTP_X_FOO'] 
end 

post '/request' do 
    request['X-Foo'] 
end 

post '/request_rack_http_format' do 
    request['HTTP_X_FOO'] 
end 

Các spec đầu tiên trôi qua; hai trường hợp tiếp theo không thành công:

describe "Sinatra should place the header in" do 
    before(:all) do 
     header 'X-Foo', 'Bar' 
    end 

    example "env" do 
     post '/env' 
     last_response.body.should == 'Bar' #pass 
    end 

    example "request[]" do 
     post '/request' 
     last_response.body.should == 'Bar' #fail; got "" 
    end 

    example "request[] (rack format)" do 
     post '/request_rack_http_format' 
     last_response.body.should == 'Bar' #fail; got "" 
    end 
end 

Nhìn vào nguồn, Sinatra không thực sự làm bất kỳ điều gì với []; nó được triển khai trong Rack làm công đoàn của GETPOST. Và POSTjust returns the form hash. Đối với GET đó là băm truy vấn. Trong cả ba tuyến đường, request.params trống.

Câu hỏi của tôi: Đây có phải là lỗi tài liệu hay tôi hiểu nhầm cách sử dụng request[]? Hiện tại, đơn đăng ký của tôi đang hoạt động tốt với phương pháp env[]. Nhưng tôi muốn làm điều đó "đúng".

Trả lời

11

Dường như là một lỗi trong tài liệu. request[] thực sự lấy params cho yêu cầu, không phải là tiêu đề:

https://github.com/rack/rack/blob/master/lib/rack/request.rb#L262

def [](key) 
    params[key.to_s] 
end 

Tôi đôi kiểm tra nó bằng cách kiểm tra cũng có. Có vẻ hơi ngớ ngẩn, nhưng có vẻ như bạn thực sự không thể truy cập trực tiếp vào tiêu đề theo bất kỳ cách nào trừ thông qua env. Ít nhất tôi không thể tìm ra cách nào khác.

+0

Tôi nghĩ bạn đang đúng vì [nguồn Rack chính nó dường như sử dụng 'env'] (https://github.com/rack/rack/blob/master/lib/rack/request.rb#L308) –

+2

Tôi vừa [mở một vấn đề với Sinatra cho README] (https://github.com/sinatra/sinatra/issues/542). –

+0

có, xem câu trả lời của tôi –

6

tôi nhận ra rằng nếu một param trong tiêu đề là 'SOME_HEADER'

tôi có thể truy cập vào nó với

env['HTTP_SOME_HEADER'] 

nên Sinatra (có thể rack) dường như để thêm HTTP_ tiền tố (và uppercasing) ... lạ.

0

Ừ như Giorgio nói tiêu đề là vốn và định dạng giống như vậy:

env['HTTP_SOME_HEADER'] 

với bất kỳ dấu gạch nối chuyển đổi sang dấu gạch dưới. Đó là khá khó hiểu.