标签: rack

让Rails测试意识到Rails内部链外的Rack中间件

上下文:应用程序使用必须在config.ru中设置的Rack中间件,而不是Rails的内部中间件链.这是出于与此问题无关的原因.

问题:如何让我的测试(功能和集成)了解这个中间件?

我会举一个例子来说明问题.让我们创建一个原始的Rails 3应用程序,使用机架重写进行说明.

# /config/initializers/example.rb
Rails.application.middleware.insert 0, 'Rack::Rewrite' do
 r301 '/so', 'http://stackoverflow.com'
end

# /test/integration/the_test.rb
require 'test_helper'

class TheTest < ActionDispatch::IntegrationTest
 test "redirect from /so to http://stackoverflow.com" do
   get '/so'
   assert_redirected_to 'http://stackoverflow.com'
 end
end
Run Code Online (Sandbox Code Playgroud)

如果您运行上述测试,一切都很好,使用浏览器,您可以确认访问路径/so会将您重定向到StackOverflow.

很酷,让我们现在在Rails之外设置它.删除上述文件/config/initializers/example.rb,并更改config.ru为以下内容:

# /config.ru
require ::File.expand_path('../config/environment',  __FILE__)

map '/so' do
  run Rack::Rewrite do
    r301 '', 'http://stackoverflow.com'
  end
end

map '/' do
  run Deleteme::Application
end
Run Code Online (Sandbox Code Playgroud)

现在,测试将停止工作.如果您/so使用浏览器访问,该功能确实有效.只是测试不知道Rack设置.

testing integration integration-testing rack ruby-on-rails

16
推荐指数
1
解决办法
5852
查看次数

Sinatra和机架保护设置

我正在使用Sinatra和CORS接受域A(hefty.burger.com)上的文件上传.域B(fizzbuzz.com)有一个表单,可以将文件上传到A上的路由.

我有一个选项路线和一个后期路线,都命名为'/ uploader'.

options '/uploader' do
  headers 'Access-Control-Allow-Origin' => 'http://fizz.buzz.com',
  'Access-Control-Allow-Methods' => 'POST'
  200
end 

post '/uploader' do
  ... 
  content_type :json
  [{:mary => 'little lamb'}].to_json
end
Run Code Online (Sandbox Code Playgroud)

这些选项首先被击中......然后它会起作用..然后帖子被击中并返回403.

如果我禁用保护,帖子工作......我需要从列表中排除什么样的保护以保持保护但允许这些帖子通过?

我最近才被新的机架防护装置狠狠地踩到了Heroku并让我感到悲伤......任何人都有一个很好的指针,可以在这里做什么?我这么说的原因是,我突然看到日志条目带有会话劫持问题的警报(几乎可以肯定是因为只为应用程序运行> 1 Dyno).我在我的Gemfile.lock中看到了机架保护(1.2.0),即使我从未要求它...我的清单中的某些内容正在调用它,因此它已加载,但我的Sinatra应用程序中的任何内容都没有尝试要求它或者设置它.

rack sinatra http-status-code-403

16
推荐指数
3
解决办法
1万
查看次数

重定向Rails 4中特定控制器的记录器输出

我已经根据我之前的问题中的答案构建了一个解决方案.Rails 3 for Rails 3中的特定控制器的重定向记录器输出.它工作得很好但是现在我尝试将相同的基于中间件的解决方案应用于Rails 4项目但是那里是一些差异保持相同的解决方案工作.

Rails 3解决方案:

module MyApp
  class LoggerMiddleware

    REPORTS_API_CONTROLLER_PATH = %r|\A/api/v.*/reports.*|
    REPORTS_API_CONTROLLER_LOGFILE = "reports_controller.log"

    def initialize(app)
      @app = app
      @logger = Rails::logger
           .instance_variable_get(:@logger)
           .instance_variable_get(:@log)
      @reports_api_controller_logger = Logger.new(
           Rails.root.join('log', REPORTS_API_CONTROLLER_LOGFILE), 
           10, 1000000)
    end

    def call(env)
      Rails::logger
           .instance_variable_get(:@logger)
           .instance_variable_set(:@log,
               case env['PATH_INFO']
               when REPORTS_API_CONTROLLER_PATH then
                 @reports_api_controller_logger
               else
                 @logger
               end
           )
      @app.call(env)
    end
  end
end

Rails.application.middleware.insert_before Rails::Rack::Logger, MyApp::LoggerMiddleware
Run Code Online (Sandbox Code Playgroud)

在上面:

Rails.getger = Rails 3 getterRails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)

用于Rails.logger的Rails 3 setter(设置为@my_logger)=Rails::logger.instance_variable_get(:@logger).instance_variable_set(:@log,@my_logger)

我立即注意到的一件事是,在Rails 4中,上面的Rails::logger.instance_variable_get(:@logger).instance_variable_get(:@log)回报为零.

检查Rails 4控制台,我确实看到了Rails.instance_variable_get(:@logger) …

logging rack ruby-on-rails ruby-on-rails-4

16
推荐指数
2
解决办法
941
查看次数

什么是机架?我可以使用它使用Ruby构建Web应用程序吗?

红宝石新手提醒!(嘿那押韵:))

我已经阅读了官方定义,但仍空手而归.当他们说中间件时究竟是什么?目的是使用ruby和https吗?

patnaik博客上的小教程让事情更清晰,但我如何在localhost上做些什么呢?我有ruby 1.9.2与rack gem和mongrel服务器一起安装.

我先开始杂种吗?怎么样?

ruby rack

15
推荐指数
2
解决办法
5804
查看次数

Ruby/Rack中的单点登录服务器身份验证

我在Windows服务器上编写和托管Web应用程序以供Intranet使用.我的服务器堆栈使用Sinatra(使用Rack),Thin和(在某些情况下)Apache仅用于反向代理.

我想在我们的ActiveDirectory支持的域中支持单点登录(使用NTLM或Kerberos).我已经看到我可以使用mod_ntlm或者mod_auth_kerb当我支持Apache时执行我的NTLM身份验证.我还没有尝试过,但我认为它会起作用.

我的问题是关于NTLM或Kerberos身份验证,当我不在Apache之后,只使用Thin和Sinatra.我见过rack-ntlm,但是那里的使用细节非常稀少.

请在Sinatra或Rack下提供已知工作代码,说明如何在服务器端使用NTLM或Kerberos,使用ActiveDirectory进行身份验证(可能是通过net-ldap).

编辑:强调了所需的答案,因为到目前为止还没有答案提供这个问题要求的明确帮助.用户应该能够找到这个答案并拥有一个可行的解决方案,而不是指向外部库的指针,他们必须弄清楚如何使用.

ruby rack ntlm kerberos active-directory

15
推荐指数
2
解决办法
9202
查看次数

Rails 3中间件修改请求标头

我的设置:Rails 3.0.9,Ruby 1.9.2

我正在开发我的第一个中间件应用程序,似乎所有示例都涉及修改响应.我需要检查和修改请求标头,特别是删除导致Rack 1.2.3中的错误的一些有问题的标头.这是典型的hello world Rack应用程序.

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
Run Code Online (Sandbox Code Playgroud)

有没有人有一个例子来处理请求头部并在Rack获得它之前拦截它们?我需要在进入Rack进行解析之前修改请求标头.我有这个设置,认为把它放在Rack之前可能会做到这一点,但我不确定是否以这种方式强制执行.

application.rb

config.middleware.insert_before Rack::Lock, "MyMiddleware"
Run Code Online (Sandbox Code Playgroud)

rack middleware ruby-on-rails-3

15
推荐指数
1
解决办法
8826
查看次数

您已经激活了机架1.6.0,但您的Gemfile需要机架1.6.4

与机架1.3.2的问题类似.你已经激活了机架1.3.2,但你的Gemfile需要机架1.2.3 - 我You have already activated rack 1.6.0, but your Gemfile requires rack 1.6.4在尝试使用Puma和Nginx在生产中运行Rails(4.2)时遇到了问题.

bundle update rakerm Gemfile.lock && bundle install似乎没有帮助,到目前为止我唯一的解决方案是手动更改rack (1.6.4)rack (1.6.0)Gemfile.lock.

rack ruby-on-rails nginx gemfile

15
推荐指数
1
解决办法
8633
查看次数

RACK在哪里登录?

我正在通过RACK运行sinatra应用程序.

该活动记录到哪个文件?另外我如何设置日志文件路径?

ruby rack sinatra

14
推荐指数
1
解决办法
1万
查看次数

如何使用Rspec在Sinatra中测试助手块?

我正在编写一个sinatra应用程序并使用rspec和rack/test进行测试(如sinatrarb.com所述).
到目前为止,它一直很棒,直到我将一些相当程序化的代码从我的域对象移动到sinatra助手.

从那时起,我一直在试图弄清楚如何隔离测试这些?

ruby testing rack rspec sinatra

14
推荐指数
3
解决办法
4893
查看次数

何处将Rack :: Deflater插入机架?

我目前有以下内容:

use Rack::Rewrite
use Rack::Cache, {:verbose=>true, :metastore=>"memcached://localhost:11211/rack-cache/meta", :entitystore=>"memcached://localhost:11211/rack-cache/body"}
use Rack::Rewrite
use Rack::Lock
use Rack::Deflater
use ActionController::Failsafe
use #<Class:0x007fb34be9ac90>
use ActionController::Session::DalliStore, #<Proc:0x007fb34bea3638@(eval):8 (lambda)>
use Rails::Rack::Metal
use ActionController::ParamsParser
use Rack::MethodOverride
use Rack::Head
use ActionController::StringCoercion
use Sass::Plugin::Rack
use Hassle
use ActiveRecord::ConnectionAdapters::ConnectionManagement
use ActiveRecord::QueryCache
run ActionController::Dispatcher.new
Run Code Online (Sandbox Code Playgroud)

我可能错了,但将Deflater移到顶端是没有意义的吗?这样任何和所有流量都被gzip压缩.

谢谢您的帮助.

ruby gzip rack ruby-on-rails

14
推荐指数
2
解决办法
8853
查看次数