ruby - 如何阻止 sinatra 重写我的标题名称?

标签 ruby http-headers sinatra rack p3p

Sinatra 对所有 header 名称采用驼峰式封装,导致“P3P”出现问题。代码:

require 'rubygems'
require 'sinatra'

configure :production do
  # Configure stuff here you'll want to
  # only be run at Heroku at boot

  # TIP:  You can get you database information
  #       from ENV['DATABASE_URI'] (see /env route below) 
end

# Quick test
get '/track' do
  #response.headers['Cache-Control'] = 'public, max-age=300'
  response.set_cookie("visited",1)
  response['this-that'] = "CP=\"CAO DSP COR CURa ADMa DEVa OUR IND PHY ONL UNI COM NAV INT DEM PRE\""
  response['P3P'] = "CP=\"CAO DSP COR CURa ADMa DEVa OUR IND PHY ONL UNI COM NAV INT DEM PRE\""
  "SUCCESS"
end

给我

* About to connect() to localhost port 9393 (#0)
*   Trying 127.0.0.1... connected
> GET /track HTTP/1.1
> User-Agent: curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3
> Host: localhost:9393
> Accept: */*
> 
< HTTP/1.1 200 OK 
< X-Frame-Options: sameorigin
< X-Xss-Protection: 1; mode=block
< Content-Type: text/html;charset=utf-8
< This-That: CP="CAO DSP COR CURa ADMa DEVa OUR IND PHY ONL UNI COM NAV INT DEM PRE"
< P3p: CP="CAO DSP COR CURa ADMa DEVa OUR IND PHY ONL UNI COM NAV INT DEM PRE"
< Content-Length: 7
< Server: WEBrick/1.3.1 (Ruby/1.9.2/2012-04-20)
< Date: Sun, 28 Oct 2012 16:26:47 GMT
< Connection: Keep-Alive
< Set-Cookie: visited=1
< 
* Connection #0 to host localhost left intact
* Closing connection #0
SUCCESS

如您所见,this-that 被重写为 This-That 并且 P3P 被重写为 P3p .这是我的 gem list :

* 本地 gem *

addressable (2.3.2)
bundler (1.2.1)
excon (0.16.7)
heroku (2.32.14)
heroku-api (0.3.5)
launchy (2.1.2)
mime-types (1.19)
netrc (0.7.7)
rack (1.4.1)
rack-protection (1.2.0)
rake (0.9.2.2)
rest-client (1.6.7)
rubygems-bundler (1.1.0)
rubyzip (0.9.9)
rvm (1.11.3.5)
shotgun (0.9)
sinatra (1.3.3)
tilt (1.3.3)

如何阻止 sinatra 重写 cookie 名称。有我可以做的猴子补丁吗?

最佳答案

HTTP header names should be case insensitive , 所以理论上这应该不是问题 - P3p 应该和 P3P 一样好。

在您的情况下, header 是 altered by the Webrick server ,不是西纳特拉。更改为另一个服务器,例如 Thin(不更改 header )将是最简单的解决方法(使用 Thin 而不是 Webrick 也有其他好处)。

如果你真的需要继续使用 Webrick,你可以考虑打补丁 WEBrick::HTTPResponse .您必须小心,因为 Webrick 将 header 名称小写以处理重复项,因此您可能必须考虑到这一点。

关于ruby - 如何阻止 sinatra 重写我的标题名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110708/

相关文章:

ruby - 如何使带有 Hstore 的 PostgreSQL 在 Sinatra 简单应用程序中工作?

ruby - 如何避免使用 erb 模板中的引号生成内容?

ruby-on-rails - rvm 默认 ruby​​ 版本工作其他版本不工作

ruby - 每次在 linux 目录中创建新文件时运行一个进程

php - ZF2 - 如何正确设置标题?

ruby - 在延迟的 sinatra 请求中使用 send_file

ruby - 相当于 Perl 在 Ruby 中的 END block

php - PHP header_remove 的可能替代方案

c# - 添加安全 header 以帮助防止 c# asp.net 中的注入(inject)攻击

ruby - 从 config.ru 设置 Sinatra 应用设置