2010-02-27 4 views
3

레일즈는 모든 헤더와 많은 여분의 비 헤더 정보를 반환하는 request.headers 메소드를 제공합니다 ... 요청 헤더에만 액세스하고 싶습니다. 어떻게 할 수 있습니까? 당신이 더 제한 될 수 있습니다, 또는레일 2 애플리케이션에서만 요청 헤더에 액세스하는 방법은 무엇입니까?

# CONTENT_LENGTH -> Content-Length 
# HTTP_COOKIE -> Cookie 
# HTTP_USER_AGENT -> User-Agent 
@headers |= request.env.inject({}) { |h, (k, v)| 
    if k =~ /^(HTTP|CONTENT)_/ then 
    h[k.sub(/^HTTP_/, '').dasherize.gsub(/([^\-]+)/) { $1.capitalize }] = v 
    end 
    h 
} 

:

감사

답변

5

당신은 기본적으로 당신의 HTTP 헤더에 해당 HTTP_ 또는 CONTENT_로 시작하는 모든 환경 항목, 예를 분리해야 오직 012와 같이 실제로 유효하지 않은 환경 변수를 우연히 선택하는 것을 피하기 위해 특정HTTP headers 만 찾습니다.또는 HTTP_DUMMY.

@headers |= %w[ CONTENT_LENGTH CONTENT_TYPE HTTP_ACCEPT 
HTTP_REFERER HTTP_USER_AGENT ].inject({}) { |h, k| 
    if v = request.env[k] then 
    h[k.sub(/^HTTP_/, '').dasherize.gsub(/([^\-]+)/) { $1.capitalize }] = v 
    end 
    h 
} 

actionpack/lib/action_controller/request.rb에서 요청 헤더를 추출하는 환경이 어떻게 다른지 살펴보십시오.

+0

모든 HTTP 헤더 (즉, 확장 헤더)가 서버에 알려지지 않았기 때문에 실제로 두 번째 메시지를 처리 ​​할 수 ​​없습니다. X-Runtime과 같은 헤더는 env HTTP_X-RUNTIME으로 표시됩니까? 감사합니다. –

+0

환경에서'HTTP_X_RUNTIME'이되고 결과로 나오는'@headers' 해쉬에서'X-Runtime'이됩니다. 두 번째 스 니펫은 흥미로운 헤더 항목을 사용합니다 (흥미롭지 않은 항목을 걸러 내기 위해). 화이트리스트에있는 것이 실제로 환경에 존재하지 않는다면'@headers'에 추가되지 않습니다; 환경에 있지만 화이트리스트에 없다면'@headers'에 추가되지 않습니다. – vladr

+0

감사합니다 블라드 ... 첫 번째 옵션으로 잘못되었습니다. 모든 요청 헤더가 필요합니다. 내가 모르는 고객이라 할지라도 흰색 목록은 사용할 수 없습니다. –

관련 문제