diff --git a/lib/rack_stuff.rb b/lib/rack_stuff.rb index 2c9ab92d..cf3cdbca 100644 --- a/lib/rack_stuff.rb +++ b/lib/rack_stuff.rb @@ -8,12 +8,12 @@ module Rack class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet def self.run(app, options={}) options[:BindAddress] = options.delete(:Host) if options[:Host] - server = ::WEBrick::HTTPServer.new(options) - server.mount "/", Rack::Handler::WEBrick, app - trap(:INT) { server.shutdown } - trap(:TERM) { server.shutdown } - yield server if block_given? - server.start + @server = ::WEBrick::HTTPServer.new(options) + @server.mount "/", Rack::Handler::WEBrick, app + trap(:INT) { @server.shutdown } + trap(:TERM) { @server.shutdown } + yield @server if block_given? + @server.start end end end @@ -39,7 +39,7 @@ module Rack entire_buffer_written_out = false while !entire_buffer_written_out written = @rewindable_io.write(buffer) - entire_buffer_written_out = written == buffer.size + entire_buffer_written_out = written == Rack::Utils.bytesize(buffer) if !entire_buffer_written_out buffer.slice!(0 .. written - 1) end diff --git a/test/unit/page_renderer_test.rb b/test/unit/page_renderer_test.rb index d1e5e13c..0288e193 100644 --- a/test/unit/page_renderer_test.rb +++ b/test/unit/page_renderer_test.rb @@ -226,6 +226,15 @@ END_THM def test_have_latest_itex2mml + assert_markup_parsed_as( + %{

boxed equation <} + + %{menclose notation='updiagonalstrike'>D\317\210=0

}, + "boxed equation $\\boxed{\\slash{D}\\psi=0}$") + assert_markup_parsed_as( %{

equation . +the bug tracker at . Mailing list archives are available at . Git repository (send Git patches to the mailing list): * http://github.com/rack/rack -* http://git.vuxu.org/cgi-bin/gitweb.cgi?p=rack.git +* http://git.vuxu.org/cgi-bin/gitweb.cgi?p=rack-github.git You are also welcome to join the #rack channel on irc.freenode.net. @@ -345,12 +340,14 @@ would like to thank: * Tim Fletcher, for the HTTP authentication code. * Luc Heinrich for the Cookie sessions, the static file handler and bugfixes. * Armin Ronacher, for the logo and racktools. -* Aredridel, Ben Alpert, Dan Kubb, Daniel Roethlisberger, Matt Todd, - Tom Robinson, Phil Hagelberg, S. Brent Faulkner, Bosko Milekic, - Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey Grosenbach, - Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi, Patrick - Aljordm, Mig, and Kazuhiro Nishiyama for bug fixing and other - improvements. +* Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben + Alpert, Dan Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson, + Phil Hagelberg, S. Brent Faulkner, Bosko Milekic, Daniel Rodríguez + Troitiño, Genki Takiuchi, Geoffrey Grosenbach, Julien Sanchez, Kamal + Fariz Mahyuddin, Masayoshi Takahashi, Patrick Aljordm, Mig, Kazuhiro + Nishiyama, Jon Bardin, Konstantin Haase, Larry Siden, Matias + Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin, and + Zach Brock for bug fixing and other improvements. * Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support and API improvements. * Yehuda Katz and Carl Lerche for refactoring rackup. @@ -368,7 +365,7 @@ would like to thank: == Copyright -Copyright (C) 2007, 2008, 2009 Christian Neukirchen +Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to diff --git a/vendor/plugins/rack/Rakefile b/vendor/plugins/rack/Rakefile index e22f060a..8a78b25b 100644 --- a/vendor/plugins/rack/Rakefile +++ b/vendor/plugins/rack/Rakefile @@ -1,16 +1,13 @@ # Rakefile for Rack. -*-ruby-*- require 'rake/rdoctask' -require 'rake/testtask' - desc "Run all the tests" task :default => [:test] desc "Make an archive as .tar.gz" task :dist => [:chmod, :changelog, :rdoc, "SPEC"] do - FileUtils.touch("RDOX") sh "git archive --format=tar --prefix=#{release}/ HEAD^{tree} >#{release}.tar" - sh "pax -waf #{release}.tar -s ':^:#{release}/:' RDOX SPEC ChangeLog doc rack.gemspec" + sh "pax -waf #{release}.tar -s ':^:#{release}/:' SPEC ChangeLog doc rack.gemspec" sh "gzip -f -9 #{release}.tar" end @@ -23,19 +20,19 @@ task :officialrelease do sh "mv stage/#{release}.tar.gz stage/#{release}.gem ." end -task :officialrelease_really => [:fulltest, "RDOX", "SPEC", :dist, :gem] do +task :officialrelease_really => ["SPEC", :dist, :gem] do sh "sha1sum #{release}.tar.gz #{release}.gem" end def release require File.dirname(__FILE__) + "/lib/rack" - "rack-#{Rack.release}" + "rack-#{Rack.release}.0" end desc "Make binaries executable" task :chmod do Dir["bin/*"].each { |binary| File.chmod(0775, binary) } - Dir["test/cgi/test*"].each { |binary| File.chmod(0775, binary) } + Dir["spec/cgi/spec*"].each { |binary| File.chmod(0775, binary) } end desc "Generate a ChangeLog" @@ -57,11 +54,6 @@ task :changelog do end -desc "Generate RDox" -task "RDOX" do - sh "specrb -Ilib:test -a --rdox >RDOX" -end - desc "Generate Rack Specification" task "SPEC" do File.open("SPEC", "wb") { |file| @@ -75,24 +67,29 @@ end desc "Run all the fast tests" task :test do - sh "specrb -Ilib:test -w #{ENV['TEST'] || '-a'} #{ENV['TESTOPTS'] || '-t "^(?!Rack::Handler|Rack::Adapter|Rack::Session::Memcache|rackup)"'}" + opts = ENV['TEST'] || '-a' + specopts = ENV['TESTOPTS'] || + "-q -t '^(?!Rack::Handler|Rack::Adapter|Rack::Session::Memcache|rackup)'" + + sh "bacon -I./lib:./spec -w #{opts} #{specopts}" end desc "Run all the tests" task :fulltest => [:chmod] do - sh "specrb -Ilib:test -w #{ENV['TEST'] || '-a'} #{ENV['TESTOPTS']}" + opts = ENV['TEST'] || '-a' + specopts = ENV['TESTOPTS'] || '-q' + sh "bacon -I./lib:./spec -w #{opts} #{specopts}" end task :gem => ["SPEC"] do - FileUtils.touch("RDOX") sh "gem build rack.gemspec" end desc "Generate RDoc documentation" -task :rdoc do +task :rdoc => ["SPEC"] do sh(*%w{rdoc --line-numbers --main README --title 'Rack\ Documentation' --charset utf-8 -U -o doc} + - %w{README KNOWN-ISSUES SPEC RDOX} + + %w{README KNOWN-ISSUES SPEC} + Dir["lib/**/*.rb"]) end diff --git a/vendor/plugins/rack/bin/rackup b/vendor/plugins/rack/bin/rackup index a6f98913..ad94af4b 100755 --- a/vendor/plugins/rack/bin/rackup +++ b/vendor/plugins/rack/bin/rackup @@ -1,2 +1,4 @@ +#!/usr/bin/env ruby + require "rack" Rack::Server.start diff --git a/vendor/plugins/rack/lib/rack.rb b/vendor/plugins/rack/lib/rack.rb index ecc238ee..328776dd 100644 --- a/vendor/plugins/rack/lib/rack.rb +++ b/vendor/plugins/rack/lib/rack.rb @@ -1,4 +1,4 @@ -# Copyright (C) 2007, 2008, 2009 Christian Neukirchen +# Copyright (C) 2007, 2008, 2009, 2010 Christian Neukirchen # # Rack is freely distributable under the terms of an MIT-style license. # See COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -20,7 +20,7 @@ module Rack # Return the Rack release as a dotted string. def self.release - "1.1" + "1.2" end autoload :Builder, "rack/builder" @@ -78,15 +78,4 @@ module Rack autoload :Pool, "rack/session/pool" autoload :Memcache, "rack/session/memcache" end - - # *Adapters* connect Rack with third party web frameworks. - # - # Rack includes an adapter for Camping, see README for other - # frameworks supporting Rack in their code bases. - # - # Refer to the submodules for framework-specific calling details. - - module Adapter - autoload :Camping, "rack/adapter/camping" - end end diff --git a/vendor/plugins/rack/lib/rack/adapter/camping.rb b/vendor/plugins/rack/lib/rack/adapter/camping.rb deleted file mode 100644 index 63bc787f..00000000 --- a/vendor/plugins/rack/lib/rack/adapter/camping.rb +++ /dev/null @@ -1,22 +0,0 @@ -module Rack - module Adapter - class Camping - def initialize(app) - @app = app - end - - def call(env) - env["PATH_INFO"] ||= "" - env["SCRIPT_NAME"] ||= "" - controller = @app.run(env['rack.input'], env) - h = controller.headers - h.each_pair do |k,v| - if v.kind_of? URI - h[k] = v.to_s - end - end - [controller.status, controller.headers, [controller.body.to_s]] - end - end - end -end diff --git a/vendor/plugins/rack/lib/rack/auth/digest/params.rb b/vendor/plugins/rack/lib/rack/auth/digest/params.rb index 730e2efd..f2dd8a54 100644 --- a/vendor/plugins/rack/lib/rack/auth/digest/params.rb +++ b/vendor/plugins/rack/lib/rack/auth/digest/params.rb @@ -35,7 +35,7 @@ module Rack super k.to_s, v.to_s end - UNQUOTED = ['qop', 'nc', 'stale'] + UNQUOTED = ['nc', 'stale'] def to_s inject([]) do |parts, (k, v)| diff --git a/vendor/plugins/rack/lib/rack/auth/openid.rb b/vendor/plugins/rack/lib/rack/auth/openid.rb deleted file mode 100644 index c5f6a514..00000000 --- a/vendor/plugins/rack/lib/rack/auth/openid.rb +++ /dev/null @@ -1,480 +0,0 @@ -# AUTHOR: blink ; blink#ruby-lang@irc.freenode.net - -gem 'ruby-openid', '~> 2' if defined? Gem -require 'rack/request' -require 'rack/utils' -require 'rack/auth/abstract/handler' -require 'uri' -require 'openid' #gem -require 'openid/extension' #gem -require 'openid/store/memory' #gem - -module Rack - class Request - def openid_request - @env['rack.auth.openid.request'] - end - - def openid_response - @env['rack.auth.openid.response'] - end - end - - module Auth - - # Rack::Auth::OpenID provides a simple method for setting up an OpenID - # Consumer. It requires the ruby-openid library from janrain to operate, - # as well as a rack method of session management. - # - # The ruby-openid home page is at http://openidenabled.com/ruby-openid/. - # - # The OpenID specifications can be found at - # http://openid.net/specs/openid-authentication-1_1.html - # and - # http://openid.net/specs/openid-authentication-2_0.html. Documentation - # for published OpenID extensions and related topics can be found at - # http://openid.net/developers/specs/. - # - # It is recommended to read through the OpenID spec, as well as - # ruby-openid's documentation, to understand what exactly goes on. However - # a setup as simple as the presented examples is enough to provide - # Consumer functionality. - # - # This library strongly intends to utilize the OpenID 2.0 features of the - # ruby-openid library, which provides OpenID 1.0 compatiblity. - # - # NOTE: Due to the amount of data that this library stores in the - # session, Rack::Session::Cookie may fault. - - class OpenID - - class NoSession < RuntimeError; end - class BadExtension < RuntimeError; end - # Required for ruby-openid - ValidStatus = [:success, :setup_needed, :cancel, :failure] - - # = Arguments - # - # The first argument is the realm, identifying the site they are trusting - # with their identity. This is required, also treated as the trust_root - # in OpenID 1.x exchanges. - # - # The optional second argument is a hash of options. - # - # == Options - # - # :return_to defines the url to return to after the client - # authenticates with the openid service provider. This url should point - # to where Rack::Auth::OpenID is mounted. If :return_to is not - # provided, return_to will be the current url which allows flexibility - # with caveats. - # - # :session_key defines the key to the session hash in the env. - # It defaults to 'rack.session'. - # - # :openid_param defines at what key in the request parameters to - # find the identifier to resolve. As per the 2.0 spec, the default is - # 'openid_identifier'. - # - # :store defined what OpenID Store to use for persistant - # information. By default a Store::Memory will be used. - # - # :immediate as true will make initial requests to be of an - # immediate type. This is false by default. See OpenID specification - # documentation. - # - # :extensions should be a hash of openid extension - # implementations. The key should be the extension main module, the value - # should be an array of arguments for extension::Request.new. - # The hash is iterated over and passed to #add_extension for processing. - # Please see #add_extension for further documentation. - # - # == Examples - # - # simple_oid = OpenID.new('http://mysite.com/') - # - # return_oid = OpenID.new('http://mysite.com/', { - # :return_to => 'http://mysite.com/openid' - # }) - # - # complex_oid = OpenID.new('http://mysite.com/', - # :immediate => true, - # :extensions => { - # ::OpenID::SReg => [['email'],['nickname']] - # } - # ) - # - # = Advanced - # - # Most of the functionality of this library is encapsulated such that - # expansion and overriding functions isn't difficult nor tricky. - # Alternately, to avoid opening up singleton objects or subclassing, a - # wrapper rack middleware can be composed to act upon Auth::OpenID's - # responses. See #check and #finish for locations of pertinent data. - # - # == Responses - # - # To change the responses that Auth::OpenID returns, override the methods - # #redirect, #bad_request, #unauthorized, #access_denied, and - # #foreign_server_failure. - # - # Additionally #confirm_post_params is used when the URI would exceed - # length limits on a GET request when doing the initial verification - # request. - # - # == Processing - # - # To change methods of processing completed transactions, override the - # methods #success, #setup_needed, #cancel, and #failure. Please ensure - # the returned object is a rack compatible response. - # - # The first argument is an OpenID::Response, the second is a - # Rack::Request of the current request, the last is the hash used in - # ruby-openid handling, which can be found manually at - # env['rack.session'][:openid]. - # - # This is useful if you wanted to expand the processing done, such as - # setting up user accounts. - # - # oid_app = Rack::Auth::OpenID.new realm, :return_to => return_to - # def oid_app.success oid, request, session - # user = Models::User[oid.identity_url] - # user ||= Models::User.create_from_openid oid - # request['rack.session'][:user] = user.id - # redirect MyApp.site_home - # end - # - # site_map['/openid'] = oid_app - # map = Rack::URLMap.new site_map - # ... - - def initialize(realm, options={}) - realm = URI(realm) - raise ArgumentError, "Invalid realm: #{realm}" \ - unless realm.absolute? \ - and realm.fragment.nil? \ - and realm.scheme =~ /^https?$/ \ - and realm.host =~ /^(\*\.)?#{URI::REGEXP::PATTERN::URIC_NO_SLASH}+/ - realm.path = '/' if realm.path.empty? - @realm = realm.to_s - - if ruri = options[:return_to] - ruri = URI(ruri) - raise ArgumentError, "Invalid return_to: #{ruri}" \ - unless ruri.absolute? \ - and ruri.scheme =~ /^https?$/ \ - and ruri.fragment.nil? - raise ArgumentError, "return_to #{ruri} not within realm #{realm}" \ - unless self.within_realm?(ruri) - @return_to = ruri.to_s - end - - @session_key = options[:session_key] || 'rack.session' - @openid_param = options[:openid_param] || 'openid_identifier' - @store = options[:store] || ::OpenID::Store::Memory.new - @immediate = !!options[:immediate] - - @extensions = {} - if extensions = options.delete(:extensions) - extensions.each do |ext, args| - add_extension ext, *args - end - end - - # Undocumented, semi-experimental - @anonymous = !!options[:anonymous] - end - - attr_reader :realm, :return_to, :session_key, :openid_param, :store, - :immediate, :extensions - - # Sets up and uses session data at :openid within the session. - # Errors in this setup will raise a NoSession exception. - # - # If the parameter 'openid.mode' is set, which implies a followup from - # the openid server, processing is passed to #finish and the result is - # returned. However, if there is no appropriate openid information in the - # session, a 400 error is returned. - # - # If the parameter specified by options[:openid_param] is - # present, processing is passed to #check and the result is returned. - # - # If neither of these conditions are met, #unauthorized is called. - - def call(env) - env['rack.auth.openid'] = self - env_session = env[@session_key] - unless env_session and env_session.is_a?(Hash) - raise NoSession, 'No compatible session' - end - # let us work in our own namespace... - session = (env_session[:openid] ||= {}) - unless session and session.is_a?(Hash) - raise NoSession, 'Incompatible openid session' - end - - request = Rack::Request.new(env) - consumer = ::OpenID::Consumer.new(session, @store) - - if mode = request.GET['openid.mode'] - if session.key?(:openid_param) - finish(consumer, session, request) - else - bad_request - end - elsif request.GET[@openid_param] - check(consumer, session, request) - else - unauthorized - end - end - - # As the first part of OpenID consumer action, #check retrieves the data - # required for completion. - # - # If all parameters fit within the max length of a URI, a 303 redirect - # will be returned. Otherwise #confirm_post_params will be called. - # - # Any messages from OpenID's request are logged to env['rack.errors'] - # - # env['rack.auth.openid.request'] is the openid checkid request - # instance. - # - # session[:openid_param] is set to the openid identifier - # provided by the user. - # - # session[:return_to] is set to the return_to uri given to the - # identity provider. - - def check(consumer, session, req) - oid = consumer.begin(req.GET[@openid_param], @anonymous) - req.env['rack.auth.openid.request'] = oid - req.env['rack.errors'].puts(oid.message) - p oid if $DEBUG - - ## Extension support - extensions.each do |ext,args| - oid.add_extension(ext::Request.new(*args)) - end - - session[:openid_param] = req.GET[openid_param] - return_to_uri = return_to ? return_to : req.url - session[:return_to] = return_to_uri - immediate = session.key?(:setup_needed) ? false : immediate - - if oid.send_redirect?(realm, return_to_uri, immediate) - uri = oid.redirect_url(realm, return_to_uri, immediate) - redirect(uri) - else - confirm_post_params(oid, realm, return_to_uri, immediate) - end - rescue ::OpenID::DiscoveryFailure => e - # thrown from inside OpenID::Consumer#begin by yadis stuff - req.env['rack.errors'].puts([e.message, *e.backtrace]*"\n") - return foreign_server_failure - end - - # This is the final portion of authentication. - # If successful, a redirect to the realm is be returned. - # Data gathered from extensions are stored in session[:openid] with the - # extension's namespace uri as the key. - # - # Any messages from OpenID's response are logged to env['rack.errors'] - # - # env['rack.auth.openid.response'] will contain the openid - # response. - - def finish(consumer, session, req) - oid = consumer.complete(req.GET, req.url) - req.env['rack.auth.openid.response'] = oid - req.env['rack.errors'].puts(oid.message) - p oid if $DEBUG - - raise unless ValidStatus.include?(oid.status) - __send__(oid.status, oid, req, session) - end - - # The first argument should be the main extension module. - # The extension module should contain the constants: - # * class Request, should have OpenID::Extension as an ancestor - # * class Response, should have OpenID::Extension as an ancestor - # * string NS_URI, which defining the namespace of the extension - # - # All trailing arguments will be passed to extension::Request.new in - # #check. - # The openid response will be passed to - # extension::Response#from_success_response, #get_extension_args will be - # called on the result to attain the gathered data. - # - # This method returns the key at which the response data will be found in - # the session, which is the namespace uri by default. - - def add_extension(ext, *args) - raise BadExtension unless valid_extension?(ext) - extensions[ext] = args - return ext::NS_URI - end - - # Checks the validitity, in the context of usage, of a submitted - # extension. - - def valid_extension?(ext) - if not %w[NS_URI Request Response].all?{|c| ext.const_defined?(c) } - raise ArgumentError, 'Extension is missing constants.' - elsif not ext::Response.respond_to?(:from_success_response) - raise ArgumentError, 'Response is missing required method.' - end - return true - rescue - return false - end - - # Checks the provided uri to ensure it'd be considered within the realm. - # is currently not compatible with wildcard realms. - - def within_realm? uri - uri = URI.parse(uri.to_s) - realm = URI.parse(self.realm) - return false unless uri.absolute? - return false unless uri.path[0, realm.path.size] == realm.path - return false unless uri.host == realm.host or realm.host[/^\*\./] - # for wildcard support, is awkward with URI limitations - realm_match = Regexp.escape(realm.host). - sub(/^\*\./,"^#{URI::REGEXP::PATTERN::URIC_NO_SLASH}+.")+'$' - return false unless uri.host.match(realm_match) - return true - end - alias_method :include?, :within_realm? - - protected - - ### These methods define some of the boilerplate responses. - - # Returns an html form page for posting to an Identity Provider if the - # GET request would exceed the upper URI length limit. - - def confirm_post_params(oid, realm, return_to, immediate) - Rack::Response.new.finish do |r| - r.write 'Confirm...' - r.write oid.form_markup(realm, return_to, immediate) - r.write '' - end - end - - # Returns a 303 redirect with the destination of that provided by the - # argument. - - def redirect(uri) - [ 303, {'Content-Length'=>'0', 'Content-Type'=>'text/plain', - 'Location' => uri}, - [] ] - end - - # Returns an empty 400 response. - - def bad_request - [ 400, {'Content-Type'=>'text/plain', 'Content-Length'=>'0'}, - [''] ] - end - - # Returns a basic unauthorized 401 response. - - def unauthorized - [ 401, {'Content-Type' => 'text/plain', 'Content-Length' => '13'}, - ['Unauthorized.'] ] - end - - # Returns a basic access denied 403 response. - - def access_denied - [ 403, {'Content-Type' => 'text/plain', 'Content-Length' => '14'}, - ['Access denied.'] ] - end - - # Returns a 503 response to be used if communication with the remote - # OpenID server fails. - - def foreign_server_failure - [ 503, {'Content-Type'=>'text/plain', 'Content-Length' => '23'}, - ['Foreign server failure.'] ] - end - - private - - ### These methods are called after a transaction is completed, depending - # on its outcome. These should all return a rack compatible response. - # You'd want to override these to provide additional functionality. - - # Called to complete processing on a successful transaction. - # Within the openid session, :openid_identity and :openid_identifier are - # set to the user friendly and the standard representation of the - # validated identity. All other data in the openid session is cleared. - - def success(oid, request, session) - session.clear - session[:openid_identity] = oid.display_identifier - session[:openid_identifier] = oid.identity_url - extensions.keys.each do |ext| - label = ext.name[/[^:]+$/].downcase - response = ext::Response.from_success_response(oid) - session[label] = response.data - end - redirect(realm) - end - - # Called if the Identity Provider indicates further setup by the user is - # required. - # The identifier is retrived from the openid session at :openid_param. - # And :setup_needed is set to true to prevent looping. - - def setup_needed(oid, request, session) - identifier = session[:openid_param] - session[:setup_needed] = true - redirect req.script_name + '?' + openid_param + '=' + identifier - end - - # Called if the user indicates they wish to cancel identification. - # Data within openid session is cleared. - - def cancel(oid, request, session) - session.clear - access_denied - end - - # Called if the Identity Provider indicates the user is unable to confirm - # their identity. Data within the openid session is left alone, in case - # of swarm auth attacks. - - def failure(oid, request, session) - unauthorized - end - end - - # A class developed out of the request to use OpenID as an authentication - # middleware. The request will be sent to the OpenID instance unless the - # block evaluates to true. For example in rackup, you can use it as such: - # - # use Rack::Session::Pool - # use Rack::Auth::OpenIDAuth, realm, openid_options do |env| - # env['rack.session'][:authkey] == a_string - # end - # run RackApp - # - # Or simply: - # - # app = Rack::Auth::OpenIDAuth.new app, realm, openid_options, &auth - - class OpenIDAuth < Rack::Auth::AbstractHandler - attr_reader :oid - def initialize(app, realm, options={}, &auth) - @oid = OpenID.new(realm, options) - super(app, &auth) - end - - def call(env) - to = auth.call(env) ? @app : @oid - to.call env - end - end - end -end diff --git a/vendor/plugins/rack/lib/rack/content_length.rb b/vendor/plugins/rack/lib/rack/content_length.rb index 1e56d438..ba72ef2c 100644 --- a/vendor/plugins/rack/lib/rack/content_length.rb +++ b/vendor/plugins/rack/lib/rack/content_length.rb @@ -13,7 +13,7 @@ module Rack status, headers, body = @app.call(env) headers = HeaderHash.new(headers) - if !STATUS_WITH_NO_ENTITY_BODY.include?(status) && + if !STATUS_WITH_NO_ENTITY_BODY.include?(status.to_i) && !headers['Content-Length'] && !headers['Transfer-Encoding'] && (body.respond_to?(:to_ary) || body.respond_to?(:to_str)) diff --git a/vendor/plugins/rack/lib/rack/etag.rb b/vendor/plugins/rack/lib/rack/etag.rb index 06dbc6aa..cadf214d 100644 --- a/vendor/plugins/rack/lib/rack/etag.rb +++ b/vendor/plugins/rack/lib/rack/etag.rb @@ -11,13 +11,22 @@ module Rack status, headers, body = @app.call(env) if !headers.has_key?('ETag') - parts = [] - body.each { |part| parts << part.to_s } - headers['ETag'] = %("#{Digest::MD5.hexdigest(parts.join(""))}") - [status, headers, parts] - else - [status, headers, body] + digest, body = digest_body(body) + headers['ETag'] = %("#{digest}") end + + [status, headers, body] end + + private + def digest_body(body) + digest = Digest::MD5.new + parts = [] + body.each do |part| + digest << part + parts << part + end + [digest.hexdigest, parts] + end end end diff --git a/vendor/plugins/rack/lib/rack/file.rb b/vendor/plugins/rack/lib/rack/file.rb index 14af7b3b..347955f5 100644 --- a/vendor/plugins/rack/lib/rack/file.rb +++ b/vendor/plugins/rack/lib/rack/file.rb @@ -3,8 +3,10 @@ require 'rack/utils' require 'rack/mime' module Rack - # Rack::File serves files below the +root+ given, according to the + # Rack::File serves files below the +root+ directory given, according to the # path info of the Rack request. + # e.g. when Rack::File.new("/etc") is used, you can access 'passwd' file + # as http://localhost:9292/passwd # # Handlers can detect if bodies are a Rack::File, and use mechanisms # like sendfile on the +path+. diff --git a/vendor/plugins/rack/lib/rack/handler/cgi.rb b/vendor/plugins/rack/lib/rack/handler/cgi.rb index c6903f15..cae7adae 100644 --- a/vendor/plugins/rack/lib/rack/handler/cgi.rb +++ b/vendor/plugins/rack/lib/rack/handler/cgi.rb @@ -1,9 +1,11 @@ require 'rack/content_length' +require 'rack/rewindable_input' module Rack module Handler class CGI def self.run(app, options=nil) + $stdin.binmode serve app end @@ -15,8 +17,8 @@ module Rack env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/" - env.update({"rack.version" => [1,1], - "rack.input" => $stdin, + env.update({"rack.version" => Rack::VERSION, + "rack.input" => Rack::RewindableInput.new($stdin), "rack.errors" => $stderr, "rack.multithread" => false, @@ -40,20 +42,20 @@ module Rack end def self.send_headers(status, headers) - STDOUT.print "Status: #{status}\r\n" + $stdout.print "Status: #{status}\r\n" headers.each { |k, vs| vs.split("\n").each { |v| - STDOUT.print "#{k}: #{v}\r\n" + $stdout.print "#{k}: #{v}\r\n" } } - STDOUT.print "\r\n" - STDOUT.flush + $stdout.print "\r\n" + $stdout.flush end def self.send_body(body) body.each { |part| - STDOUT.print part - STDOUT.flush + $stdout.print part + $stdout.flush } end end diff --git a/vendor/plugins/rack/lib/rack/handler/fastcgi.rb b/vendor/plugins/rack/lib/rack/handler/fastcgi.rb index b992a5f4..1eb47904 100644 --- a/vendor/plugins/rack/lib/rack/handler/fastcgi.rb +++ b/vendor/plugins/rack/lib/rack/handler/fastcgi.rb @@ -36,7 +36,7 @@ module Rack rack_input = RewindableInput.new(request.in) - env.update({"rack.version" => [1,1], + env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, "rack.errors" => request.err, diff --git a/vendor/plugins/rack/lib/rack/handler/lsws.rb b/vendor/plugins/rack/lib/rack/handler/lsws.rb index eabc0bc9..3e699920 100644 --- a/vendor/plugins/rack/lib/rack/handler/lsws.rb +++ b/vendor/plugins/rack/lib/rack/handler/lsws.rb @@ -20,7 +20,7 @@ module Rack rack_input = RewindableInput.new($stdin.read.to_s) env.update( - "rack.version" => [1,1], + "rack.version" => Rack::VERSION, "rack.input" => rack_input, "rack.errors" => $stderr, "rack.multithread" => false, diff --git a/vendor/plugins/rack/lib/rack/handler/mongrel.rb b/vendor/plugins/rack/lib/rack/handler/mongrel.rb index b6b775ea..0d8125a4 100644 --- a/vendor/plugins/rack/lib/rack/handler/mongrel.rb +++ b/vendor/plugins/rack/lib/rack/handler/mongrel.rb @@ -52,7 +52,7 @@ module Rack rack_input = request.body || StringIO.new('') rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env.update({"rack.version" => [1,1], + env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, "rack.errors" => $stderr, diff --git a/vendor/plugins/rack/lib/rack/handler/scgi.rb b/vendor/plugins/rack/lib/rack/handler/scgi.rb index 79a6b2bd..d0384785 100644 --- a/vendor/plugins/rack/lib/rack/handler/scgi.rb +++ b/vendor/plugins/rack/lib/rack/handler/scgi.rb @@ -17,9 +17,6 @@ module Rack def initialize(settings = {}) @app = Rack::Chunked.new(Rack::ContentLength.new(settings[:app])) - @log = Object.new - def @log.info(*args); end - def @log.error(*args); end super(settings) end @@ -36,7 +33,7 @@ module Rack rack_input = StringIO.new(input_body) rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env.update({"rack.version" => [1,1], + env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, "rack.errors" => $stderr, "rack.multithread" => true, diff --git a/vendor/plugins/rack/lib/rack/handler/webrick.rb b/vendor/plugins/rack/lib/rack/handler/webrick.rb index 2240b8d3..bae3f5a7 100644 --- a/vendor/plugins/rack/lib/rack/handler/webrick.rb +++ b/vendor/plugins/rack/lib/rack/handler/webrick.rb @@ -7,12 +7,15 @@ module Rack class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet def self.run(app, options={}) options[:BindAddress] = options.delete(:Host) if options[:Host] - server = ::WEBrick::HTTPServer.new(options) - server.mount "/", Rack::Handler::WEBrick, app - trap(:INT) { server.shutdown } - trap(:TERM) { server.shutdown } - yield server if block_given? - server.start + @server = ::WEBrick::HTTPServer.new(options) + @server.mount "/", Rack::Handler::WEBrick, app + yield @server if block_given? + @server.start + end + + def self.shutdown + @server.shutdown + @server = nil end def initialize(server, app) @@ -27,7 +30,7 @@ module Rack rack_input = StringIO.new(req.body.to_s) rack_input.set_encoding(Encoding::BINARY) if rack_input.respond_to?(:set_encoding) - env.update({"rack.version" => [1,1], + env.update({"rack.version" => Rack::VERSION, "rack.input" => rack_input, "rack.errors" => $stderr, diff --git a/vendor/plugins/rack/lib/rack/lint.rb b/vendor/plugins/rack/lib/rack/lint.rb index 534375b9..32284c8a 100644 --- a/vendor/plugins/rack/lib/rack/lint.rb +++ b/vendor/plugins/rack/lib/rack/lint.rb @@ -7,6 +7,7 @@ module Rack class Lint def initialize(app) @app = app + @content_length = nil end # :stopdoc: @@ -51,15 +52,16 @@ module Rack check_headers headers ## and the *body*. check_content_type status, headers - check_content_length status, headers, env + check_content_length status, headers + @head_request = env["REQUEST_METHOD"] == "HEAD" [status, headers, self] end ## == The Environment def check_env(env) - ## The environment must be an true instance of Hash (no - ## subclassing allowed) that includes CGI-like headers. - ## The application is free to modify the environment. + ## The environment must be an instance of Hash that includes + ## CGI-like headers. The application is free to modify the + ## environment. assert("env #{env.inspect} is not a Hash, but #{env.class}") { env.kind_of? Hash } @@ -288,10 +290,6 @@ module Rack @input = input end - def size - @input.size - end - ## * +gets+ must be called without arguments and return a string, ## or +nil+ on EOF. def gets(*args) @@ -481,7 +479,7 @@ module Rack end ## === The Content-Length - def check_content_length(status, headers, env) + def check_content_length(status, headers) headers.each { |key, value| if key.downcase == 'content-length' ## There must not be a Content-Length header when the @@ -489,49 +487,43 @@ module Rack assert("Content-Length header found in #{status} response, not allowed") { not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.include? status.to_i } - - bytes = 0 - string_body = true - - if @body.respond_to?(:to_ary) - @body.each { |part| - unless part.kind_of?(String) - string_body = false - break - end - - bytes += Rack::Utils.bytesize(part) - } - - if env["REQUEST_METHOD"] == "HEAD" - assert("Response body was given for HEAD request, but should be empty") { - bytes == 0 - } - else - if string_body - assert("Content-Length header was #{value}, but should be #{bytes}") { - value == bytes.to_s - } - end - end - end - - return + @content_length = value end } end + def verify_content_length(bytes) + if @head_request + assert("Response body was given for HEAD request, but should be empty") { + bytes == 0 + } + elsif @content_length + assert("Content-Length header was #{@content_length}, but should be #{bytes}") { + @content_length == bytes.to_s + } + end + end + ## === The Body def each @closed = false + bytes = 0 + ## The Body must respond to +each+ + assert("Response body must respond to each") do + @body.respond_to?(:each) + end + @body.each { |part| ## and must only yield String values. assert("Body yielded non-string value #{part.inspect}") { part.kind_of? String } + bytes += Rack::Utils.bytesize(part) yield part } + verify_content_length(bytes) + ## ## The Body itself should not be an instance of String, as this will ## break in Ruby 1.9. diff --git a/vendor/plugins/rack/lib/rack/mime.rb b/vendor/plugins/rack/lib/rack/mime.rb index 1414d19a..2cf03751 100644 --- a/vendor/plugins/rack/lib/rack/mime.rb +++ b/vendor/plugins/rack/lib/rack/mime.rb @@ -87,6 +87,7 @@ module Rack ".gif" => "image/gif", ".gz" => "application/x-gzip", ".h" => "text/x-c", + ".htc" => "text/x-component", ".hh" => "text/x-c", ".htm" => "text/html", ".html" => "text/html", @@ -186,6 +187,7 @@ module Rack ".vrml" => "model/vrml", ".war" => "application/java-archive", ".wav" => "audio/x-wav", + ".webm" => "video/webm", ".wma" => "audio/x-ms-wma", ".wmv" => "video/x-ms-wmv", ".wmx" => "video/x-ms-wmx", diff --git a/vendor/plugins/rack/lib/rack/mock.rb b/vendor/plugins/rack/lib/rack/mock.rb index 23ecba17..e8bc8e4d 100644 --- a/vendor/plugins/rack/lib/rack/mock.rb +++ b/vendor/plugins/rack/lib/rack/mock.rb @@ -1,5 +1,6 @@ require 'uri' require 'stringio' +require 'rack' require 'rack/lint' require 'rack/utils' require 'rack/response' @@ -40,7 +41,7 @@ module Rack end DEFAULT_ENV = { - "rack.version" => [1,1], + "rack.version" => Rack::VERSION, "rack.input" => StringIO.new, "rack.errors" => StringIO.new, "rack.multithread" => true, diff --git a/vendor/plugins/rack/lib/rack/recursive.rb b/vendor/plugins/rack/lib/rack/recursive.rb index bf8b9659..b431d4dd 100644 --- a/vendor/plugins/rack/lib/rack/recursive.rb +++ b/vendor/plugins/rack/lib/rack/recursive.rb @@ -35,6 +35,10 @@ module Rack end def call(env) + dup._call(env) + end + + def _call(env) @script_name = env["SCRIPT_NAME"] @app.call(env.merge('rack.recursive.include' => method(:include))) rescue ForwardRequest => req diff --git a/vendor/plugins/rack/lib/rack/request.rb b/vendor/plugins/rack/lib/rack/request.rb index b3de1ce4..673caa69 100644 --- a/vendor/plugins/rack/lib/rack/request.rb +++ b/vendor/plugins/rack/lib/rack/request.rb @@ -80,11 +80,13 @@ module Rack def script_name=(s); @env["SCRIPT_NAME"] = s.to_s end def path_info=(s); @env["PATH_INFO"] = s.to_s end - def get?; request_method == "GET" end - def post?; request_method == "POST" end - def put?; request_method == "PUT" end - def delete?; request_method == "DELETE" end - def head?; request_method == "HEAD" end + def delete?; request_method == "DELETE" end + def get?; request_method == "GET" end + def head?; request_method == "HEAD" end + def options?; request_method == "OPTIONS" end + def post?; request_method == "POST" end + def put?; request_method == "PUT" end + def trace?; request_method == "TRACE" end # The set of form-data media-types. Requests that do not indicate # one of the media types presents in this list will not be eligible @@ -253,7 +255,7 @@ module Rack def ip if addr = @env['HTTP_X_FORWARDED_FOR'] - addr.split(',').last.strip + (addr.split(',').grep(/\d\./).first || @env['REMOTE_ADDR']).to_s.strip else @env['REMOTE_ADDR'] end diff --git a/vendor/plugins/rack/lib/rack/response.rb b/vendor/plugins/rack/lib/rack/response.rb index a7f9bf2b..58965566 100644 --- a/vendor/plugins/rack/lib/rack/response.rb +++ b/vendor/plugins/rack/lib/rack/response.rb @@ -1,5 +1,6 @@ require 'rack/request' require 'rack/utils' +require 'time' module Rack # Rack::Response provides a convenient interface to create a Rack diff --git a/vendor/plugins/rack/lib/rack/rewindable_input.rb b/vendor/plugins/rack/lib/rack/rewindable_input.rb index 08764bee..c94943cb 100644 --- a/vendor/plugins/rack/lib/rack/rewindable_input.rb +++ b/vendor/plugins/rack/lib/rack/rewindable_input.rb @@ -1,4 +1,6 @@ +# -*- encoding: binary -*- require 'tempfile' +require 'rack/utils' module Rack # Class which can make any IO object rewindable, including non-rewindable ones. It does @@ -16,27 +18,27 @@ module Rack @rewindable_io = nil @unlinked = false end - + def gets make_rewindable unless @rewindable_io @rewindable_io.gets end - + def read(*args) make_rewindable unless @rewindable_io @rewindable_io.read(*args) end - + def each(&block) make_rewindable unless @rewindable_io @rewindable_io.each(&block) end - + def rewind make_rewindable unless @rewindable_io @rewindable_io.rewind end - + # Closes this RewindableInput object without closing the originally # wrapped IO oject. Cleans up any temporary resources that this RewindableInput # has created. @@ -52,9 +54,9 @@ module Rack @rewindable_io = nil end end - + private - + # Ruby's Tempfile class has a bug. Subclass it and fix it. class Tempfile < ::Tempfile def _close @@ -74,17 +76,18 @@ module Rack @rewindable_io.chmod(0000) @rewindable_io.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding) @rewindable_io.binmode - if filesystem_has_posix_semantics? && !tempfile_unlink_contains_bug? + if filesystem_has_posix_semantics? @rewindable_io.unlink + raise 'Unlink failed. IO closed.' if @rewindable_io.closed? @unlinked = true end - + buffer = "" while @io.read(1024 * 4, buffer) entire_buffer_written_out = false while !entire_buffer_written_out written = @rewindable_io.write(buffer) - entire_buffer_written_out = written == buffer.size + entire_buffer_written_out = written == Rack::Utils.bytesize(buffer) if !entire_buffer_written_out buffer.slice!(0 .. written - 1) end @@ -92,19 +95,9 @@ module Rack end @rewindable_io.rewind end - + def filesystem_has_posix_semantics? RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/ end - - def tempfile_unlink_contains_bug? - # The tempfile library as included in Ruby 1.9.1-p152 and later - # contains a bug: unlinking an open Tempfile object also closes - # it, which breaks our expected POSIX semantics. This problem - # has been fixed in Ruby 1.9.2, but the Ruby team chose not to - # include the bug fix in later versions of the 1.9.1 series. - ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby" - ruby_engine == "ruby" && RUBY_VERSION == "1.9.1" && RUBY_PATCHLEVEL >= 152 - end end end diff --git a/vendor/plugins/rack/lib/rack/sendfile.rb b/vendor/plugins/rack/lib/rack/sendfile.rb index 4fa82946..911ae409 100644 --- a/vendor/plugins/rack/lib/rack/sendfile.rb +++ b/vendor/plugins/rack/lib/rack/sendfile.rb @@ -2,7 +2,9 @@ require 'rack/file' module Rack class File #:nodoc: - alias :to_path :path + unless instance_methods(false).include?('to_path') + alias :to_path :path + end end # = Sendfile @@ -11,7 +13,7 @@ module Rack # served from a file and replaces it with a server specific X-Sendfile # header. The web server is then responsible for writing the file contents # to the client. This can dramatically reduce the amount of work required - # by the Ruby backend and takes advantage of the web servers optimized file + # by the Ruby backend and takes advantage of the web server's optimized file # delivery code. # # In order to take advantage of this middleware, the response body must @@ -31,19 +33,19 @@ module Rack # a private "/files/" area, enable X-Accel-Redirect, and pass the special # X-Sendfile-Type and X-Accel-Mapping headers to the backend: # - # location /files/ { + # location ~ /files/(.*) { # internal; - # alias /var/www/; + # alias /var/www/$1; # } # # location / { - # proxy_redirect false; + # proxy_redirect off; # # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # - # proxy_set_header X-Sendfile-Type X-Accel-Redirect + # proxy_set_header X-Sendfile-Type X-Accel-Redirect; # proxy_set_header X-Accel-Mapping /files/=/var/www/; # # proxy_pass http://127.0.0.1:8080/; diff --git a/vendor/plugins/rack/lib/rack/server.rb b/vendor/plugins/rack/lib/rack/server.rb index 7d0705ad..8ef973ca 100644 --- a/vendor/plugins/rack/lib/rack/server.rb +++ b/vendor/plugins/rack/lib/rack/server.rb @@ -57,7 +57,7 @@ module Rack } opts.on("-P", "--pid FILE", "file to store PID (default: rack.pid)") { |f| - options[:pid] = ::File.expand_path(f) + options[:pid] = f } opts.separator "" @@ -74,17 +74,66 @@ module Rack end end opt_parser.parse! args - options[:rack_file] = args.last if args.last + options[:config] = args.last if args.last options end end - def self.start - new.start + # Start a new rack server (like running rackup). This will parse ARGV and + # provide standard ARGV rackup options, defaulting to load 'config.ru'. + # + # Providing an options hash will prevent ARGV parsing and will not include + # any default options. + # + # This method can be used to very easily launch a CGI application, for + # example: + # + # Rack::Server.start( + # :app => lambda do |e| + # [200, {'Content-Type' => 'text/html'}, ['hello world']] + # end, + # :server => 'cgi' + # ) + # + # Further options available here are documented on Rack::Server#initialize + def self.start(options = nil) + new(options).start end - attr_accessor :options + attr_writer :options + # Options may include: + # * :app + # a rack application to run (overrides :config) + # * :config + # a rackup configuration file path to load (.ru) + # * :environment + # this selects the middleware that will be wrapped around + # your application. Default options available are: + # - development: CommonLogger, ShowExceptions, and Lint + # - deployment: CommonLogger + # - none: no extra middleware + # note: when the server is a cgi server, CommonLogger is not included. + # * :server + # choose a specific Rack::Handler, e.g. cgi, fcgi, webrick + # * :daemonize + # if true, the server will daemonize itself (fork, detach, etc) + # * :pid + # path to write a pid file after daemonize + # * :Host + # the host address to bind to (used by supporting Rack::Handler) + # * :Port + # the port to bind to (used by supporting Rack::Handler) + # * :AccessLog + # webrick acess log options (or supporting Rack::Handler) + # * :debug + # turn on debug output ($DEBUG = true) + # * :warn + # turn on warnings ($-w = true) + # * :include + # add given paths to $LOAD_PATH + # * :require + # require the given libraries def initialize(options = nil) @options = options end @@ -100,17 +149,17 @@ module Rack :Port => 9292, :Host => "0.0.0.0", :AccessLog => [], - :rack_file => ::File.expand_path("config.ru") + :config => "config.ru" } end def app @app ||= begin - if !::File.exist? options[:rack_file] - abort "configuration #{options[:rack_file]} not found" + if !::File.exist? options[:config] + abort "configuration #{options[:config]} not found" end - app, options = Rack::Builder.parse_file(self.options[:rack_file], opt_parser) + app, options = Rack::Builder.parse_file(self.options[:config], opt_parser) self.options.merge! options app end @@ -119,7 +168,7 @@ module Rack def self.middleware @middleware ||= begin m = Hash.new {|h,k| h[k] = []} - m["deployment"].concat [lambda {|server| server.server =~ /CGI/ ? nil : [Rack::CommonLogger, $stderr] }] + m["deployment"].concat [lambda {|server| server.server.name =~ /CGI/ ? nil : [Rack::CommonLogger, $stderr] }] m["development"].concat m["deployment"] + [[Rack::ShowExceptions], [Rack::Lint]] m end @@ -143,7 +192,7 @@ module Rack end if includes = options[:include] - $LOAD_PATH.unshift *includes + $LOAD_PATH.unshift(*includes) end if library = options[:require] @@ -152,11 +201,20 @@ module Rack daemonize_app if options[:daemonize] write_pid if options[:pid] + + trap(:INT) do + if server.respond_to?(:shutdown) + server.shutdown + else + exit + end + end + server.run wrapped_app, options end def server - @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default + @_server ||= Rack::Handler.get(options[:server]) || Rack::Handler.default(options) end private @@ -168,6 +226,7 @@ module Rack args.clear if ENV.include?("REQUEST_METHOD") options.merge! opt_parser.parse! args + ENV["RACK_ENV"] = options[:environment] options end diff --git a/vendor/plugins/rack/lib/rack/session/memcache.rb b/vendor/plugins/rack/lib/rack/session/memcache.rb index 44629da3..85f60cd1 100644 --- a/vendor/plugins/rack/lib/rack/session/memcache.rb +++ b/vendor/plugins/rack/lib/rack/session/memcache.rb @@ -31,7 +31,7 @@ module Rack @mutex = Mutex.new mserv = @default_options[:memcache_server] mopts = @default_options. - reject{|k,v| MemCache::DEFAULT_OPTIONS.include? k } + reject{|k,v| !MemCache::DEFAULT_OPTIONS.include? k } @pool = MemCache.new mserv, mopts unless @pool.active? and @pool.servers.any?{|c| c.alive? } raise 'No memcache servers' diff --git a/vendor/plugins/rack/lib/rack/urlmap.rb b/vendor/plugins/rack/lib/rack/urlmap.rb index b699d35b..73508533 100644 --- a/vendor/plugins/rack/lib/rack/urlmap.rb +++ b/vendor/plugins/rack/lib/rack/urlmap.rb @@ -35,21 +35,20 @@ module Rack end def call(env) - path = env["PATH_INFO"].to_s + path = env["PATH_INFO"] script_name = env['SCRIPT_NAME'] hHost, sName, sPort = env.values_at('HTTP_HOST','SERVER_NAME','SERVER_PORT') @mapping.each { |host, location, match, app| next unless (hHost == host || sName == host \ || (host.nil? && (hHost == sName || hHost == sName+':'+sPort))) - next unless path =~ match && rest = $1 + next unless path.to_s =~ match && rest = $1 next unless rest.empty? || rest[0] == ?/ - - return app.call( - env.merge( - 'SCRIPT_NAME' => (script_name + location), - 'PATH_INFO' => rest)) + env.merge!('SCRIPT_NAME' => (script_name + location), 'PATH_INFO' => rest) + return app.call(env) } [404, {"Content-Type" => "text/plain", "X-Cascade" => "pass"}, ["Not Found: #{path}"]] + ensure + env.merge! 'PATH_INFO' => path, 'SCRIPT_NAME' => script_name end end end diff --git a/vendor/plugins/rack/lib/rack/utils.rb b/vendor/plugins/rack/lib/rack/utils.rb index 68fd6ace..45c1517b 100644 --- a/vendor/plugins/rack/lib/rack/utils.rb +++ b/vendor/plugins/rack/lib/rack/utils.rb @@ -1,5 +1,6 @@ # -*- encoding: binary -*- +require 'fileutils' require 'set' require 'tempfile' @@ -38,9 +39,6 @@ module Rack (qs || '').split(d ? /[#{d}] */n : DEFAULT_SEP).each do |p| k, v = p.split('=', 2).map { |x| unescape(x) } - if v =~ /^("|')(.*)\1$/ - v = $2.gsub('\\'+$1, $1) - end if cur = params[k] if cur.class == Array params[k] << v @@ -69,9 +67,6 @@ module Rack module_function :parse_nested_query def normalize_params(params, name, v = nil) - if v and v =~ /^("|')(.*)\1$/ - v = $2.gsub('\\'+$1, $1) - end name =~ %r(\A[\[\]]*([^\[\]]+)\]*) k = $1 || '' after = $' || '' @@ -133,13 +128,18 @@ module Rack end module_function :build_nested_query + ESCAPE_HTML = { + "&" => "&", + "<" => "<", + ">" => ">", + "'" => "'", + '"' => """, + } + ESCAPE_HTML_PATTERN = Regexp.union(ESCAPE_HTML.keys) + # Escape ampersands, brackets and quotes to their HTML/XML entities. def escape_html(string) - string.to_s.gsub("&", "&"). - gsub("<", "<"). - gsub(">", ">"). - gsub("'", "'"). - gsub('"', """) + string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] } end module_function :escape_html @@ -180,8 +180,8 @@ module Rack path = "; path=" + value[:path] if value[:path] # According to RFC 2109, we need dashes here. # N.B.: cgi.rb uses spaces... - expires = "; expires=" + value[:expires].clone.gmtime. - strftime("%a, %d-%b-%Y %H:%M:%S GMT") if value[:expires] + expires = "; expires=" + + rfc2822(value[:expires].clone.gmtime) if value[:expires] secure = "; secure" if value[:secure] httponly = "; HttpOnly" if value[:httponly] value = value[:value] @@ -192,12 +192,12 @@ module Rack "#{domain}#{path}#{expires}#{secure}#{httponly}" case header["Set-Cookie"] - when Array - header["Set-Cookie"] << cookie - when String - header["Set-Cookie"] = [header["Set-Cookie"], cookie] - when nil + when nil, '' header["Set-Cookie"] = cookie + when String + header["Set-Cookie"] = [header["Set-Cookie"], cookie].join("\n") + when Array + header["Set-Cookie"] = (header["Set-Cookie"] + [cookie]).join("\n") end nil @@ -205,14 +205,25 @@ module Rack module_function :set_cookie_header! def delete_cookie_header!(header, key, value = {}) - unless Array === header["Set-Cookie"] - header["Set-Cookie"] = [header["Set-Cookie"]].compact + case header["Set-Cookie"] + when nil, '' + cookies = [] + when String + cookies = header["Set-Cookie"].split("\n") + when Array + cookies = header["Set-Cookie"] end - header["Set-Cookie"].reject! { |cookie| - cookie =~ /\A#{escape(key)}=/ + cookies.reject! { |cookie| + if value[:domain] + cookie =~ /\A#{escape(key)}=.*domain=#{value[:domain]}/ + else + cookie =~ /\A#{escape(key)}=/ + end } + header["Set-Cookie"] = cookies.join("\n") + set_cookie_header!(header, key, {:value => '', :path => nil, :domain => nil, :expires => Time.at(0) }.merge(value)) @@ -234,6 +245,22 @@ module Rack end module_function :bytesize + # Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead + # of '% %b %Y'. + # It assumes that the time is in GMT to comply to the RFC 2109. + # + # NOTE: I'm not sure the RFC says it requires GMT, but is ambigous enough + # that I'm certain someone implemented only that option. + # Do not use %a and %b from Time.strptime, it would use localized names for + # weekday and month. + # + def rfc2822(time) + wday = Time::RFC2822_DAY_NAME[time.wday] + mon = Time::RFC2822_MONTH_NAME[time.mon - 1] + time.strftime("#{wday}, %d-#{mon}-%Y %T GMT") + end + module_function :rfc2822 + # Context allows the use of a compatible middleware at different points # in a request handling stack. A compatible middleware must define # #context which should take the arguments env and app. The first of which @@ -291,7 +318,8 @@ module Rack end def [](k) - super(@names[k] ||= @names[k.downcase]) + super(@names[k]) if @names[k] + super(@names[k.downcase]) end def []=(k, v) @@ -478,11 +506,31 @@ module Rack head = buf.slice!(0, i+2) # First \r\n buf.slice!(0, 2) # Second \r\n - filename = head[/Content-Disposition:.* filename=(?:"((?:\\.|[^\"])*)"|([^;\s]*))/ni, 1] + token = /[^\s()<>,;:\\"\/\[\]?=]+/ + condisp = /Content-Disposition:\s*#{token}\s*/i + dispparm = /;\s*(#{token})=("(?:\\"|[^"])*"|#{token})*/ + + rfc2183 = /^#{condisp}(#{dispparm})+$/i + broken_quoted = /^#{condisp}.*;\sfilename="(.*?)"(?:\s*$|\s*;\s*#{token}=)/i + broken_unquoted = /^#{condisp}.*;\sfilename=(#{token})/i + + if head =~ rfc2183 + filename = Hash[head.scan(dispparm)]['filename'] + filename = $1 if filename and filename =~ /^"(.*)"$/ + elsif head =~ broken_quoted + filename = $1 + elsif head =~ broken_unquoted + filename = $1 + end + + if filename && filename !~ /\\[^\\"]/ + filename = Utils.unescape(filename).gsub(/\\(.)/, '\1') + end + content_type = head[/Content-Type: (.*)#{EOL}/ni, 1] name = head[/Content-Disposition:.*\s+name="?([^\";]*)"?/ni, 1] || head[/Content-ID:\s*([^#{EOL}]*)/ni, 1] - if content_type || filename + if filename body = Tempfile.new("RackMultipart") body.binmode if body.respond_to?(:binmode) end @@ -519,8 +567,7 @@ module Rack # This handles the full Windows paths given by Internet Explorer # (and perhaps other broken user agents) without affecting # those which give the lone filename. - filename =~ /^(?:.*[:\\\/])?(.*)/m - filename = $1 + filename = filename.split(/[\/\\]/).last data = {:filename => filename, :type => content_type, :name => name, :tempfile => body, :head => head} diff --git a/vendor/plugins/rack/rack.gemspec b/vendor/plugins/rack/rack.gemspec index e28b9bb2..ab142dbc 100644 --- a/vendor/plugins/rack/rack.gemspec +++ b/vendor/plugins/rack/rack.gemspec @@ -1,6 +1,6 @@ Gem::Specification.new do |s| s.name = "rack" - s.version = "1.1.0" + s.version = "1.2.0" s.platform = Gem::Platform::RUBY s.summary = "a modular Ruby webserver interface" @@ -14,23 +14,23 @@ middleware) into a single method call. Also see http://rack.rubyforge.org. EOF - s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*}'] + - %w(COPYING KNOWN-ISSUES rack.gemspec RDOX README SPEC) + s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*,spec/**/*}'] + + %w(COPYING KNOWN-ISSUES rack.gemspec README SPEC) s.bindir = 'bin' s.executables << 'rackup' s.require_path = 'lib' s.has_rdoc = true s.extra_rdoc_files = ['README', 'SPEC', 'KNOWN-ISSUES'] - s.test_files = Dir['test/{test,spec}_*.rb'] + s.test_files = Dir['spec/spec_*.rb'] s.author = 'Christian Neukirchen' s.email = 'chneukirchen@gmail.com' s.homepage = 'http://rack.rubyforge.org' s.rubyforge_project = 'rack' - s.add_development_dependency 'test-spec' + s.add_development_dependency 'bacon' + s.add_development_dependency 'rake' - s.add_development_dependency 'camping' s.add_development_dependency 'fcgi' s.add_development_dependency 'memcache-client' s.add_development_dependency 'mongrel' diff --git a/vendor/plugins/rack/test/cgi/lighttpd.conf b/vendor/plugins/rack/spec/cgi/lighttpd.conf old mode 100644 new mode 100755 similarity index 61% rename from vendor/plugins/rack/test/cgi/lighttpd.conf rename to vendor/plugins/rack/spec/cgi/lighttpd.conf index 889726c6..0d8da250 --- a/vendor/plugins/rack/test/cgi/lighttpd.conf +++ b/vendor/plugins/rack/spec/cgi/lighttpd.conf @@ -1,6 +1,6 @@ server.modules = ("mod_fastcgi", "mod_cgi") server.document-root = "." -server.errorlog = "lighttpd.errors" +server.errorlog = var.CWD + "/lighttpd.errors" server.port = 9203 server.event-handler = "select" @@ -9,7 +9,8 @@ cgi.assign = ("/test" => "", # ".ru" => "" ) -fastcgi.server = ("test.fcgi" => ("localhost" => +fastcgi.server = ( + "test.fcgi" => ("localhost" => ("min-procs" => 1, "socket" => "/tmp/rack-test-fcgi", "bin-path" => "test.fcgi")), @@ -17,4 +18,8 @@ fastcgi.server = ("test.fcgi" => ("localhost" => ("min-procs" => 1, "socket" => "/tmp/rack-test-ru-fcgi", "bin-path" => "test.ru")), + "sample_rackup.ru" => ("localhost" => + ("min-procs" => 1, + "socket" => "/tmp/rack-test-rackup-fcgi", + "bin-path" => CWD + "/rackup_stub.rb sample_rackup.ru")), ) diff --git a/vendor/plugins/rack/spec/cgi/rackup_stub.rb b/vendor/plugins/rack/spec/cgi/rackup_stub.rb new file mode 100755 index 00000000..a216cdc3 --- /dev/null +++ b/vendor/plugins/rack/spec/cgi/rackup_stub.rb @@ -0,0 +1,6 @@ +#!/usr/bin/env ruby +# -*- ruby -*- + +$:.unshift '../../lib' +require 'rack' +Rack::Server.start diff --git a/vendor/plugins/rack/spec/cgi/sample_rackup.ru b/vendor/plugins/rack/spec/cgi/sample_rackup.ru new file mode 100755 index 00000000..86d99e69 --- /dev/null +++ b/vendor/plugins/rack/spec/cgi/sample_rackup.ru @@ -0,0 +1,5 @@ +# -*- ruby -*- + +require '../testrequest' + +run TestRequest.new diff --git a/vendor/plugins/rack/test/cgi/test b/vendor/plugins/rack/spec/cgi/test similarity index 100% rename from vendor/plugins/rack/test/cgi/test rename to vendor/plugins/rack/spec/cgi/test diff --git a/vendor/plugins/rack/test/cgi/test.fcgi b/vendor/plugins/rack/spec/cgi/test.fcgi similarity index 100% rename from vendor/plugins/rack/test/cgi/test.fcgi rename to vendor/plugins/rack/spec/cgi/test.fcgi diff --git a/vendor/plugins/rack/spec/cgi/test.ru b/vendor/plugins/rack/spec/cgi/test.ru new file mode 100755 index 00000000..bd3ee725 --- /dev/null +++ b/vendor/plugins/rack/spec/cgi/test.ru @@ -0,0 +1,5 @@ +#!../../bin/rackup +# -*- ruby -*- + +require '../testrequest' +run TestRequest.new diff --git a/vendor/plugins/rack/test/multipart/bad_robots b/vendor/plugins/rack/spec/multipart/bad_robots similarity index 100% rename from vendor/plugins/rack/test/multipart/bad_robots rename to vendor/plugins/rack/spec/multipart/bad_robots diff --git a/vendor/plugins/rack/test/multipart/binary b/vendor/plugins/rack/spec/multipart/binary similarity index 100% rename from vendor/plugins/rack/test/multipart/binary rename to vendor/plugins/rack/spec/multipart/binary diff --git a/vendor/plugins/rack/test/multipart/empty b/vendor/plugins/rack/spec/multipart/empty similarity index 100% rename from vendor/plugins/rack/test/multipart/empty rename to vendor/plugins/rack/spec/multipart/empty diff --git a/vendor/plugins/rack/test/multipart/fail_16384_nofile b/vendor/plugins/rack/spec/multipart/fail_16384_nofile similarity index 100% rename from vendor/plugins/rack/test/multipart/fail_16384_nofile rename to vendor/plugins/rack/spec/multipart/fail_16384_nofile diff --git a/vendor/plugins/rack/test/multipart/file1.txt b/vendor/plugins/rack/spec/multipart/file1.txt similarity index 100% rename from vendor/plugins/rack/test/multipart/file1.txt rename to vendor/plugins/rack/spec/multipart/file1.txt diff --git a/vendor/plugins/rack/spec/multipart/filename_and_modification_param b/vendor/plugins/rack/spec/multipart/filename_and_modification_param new file mode 100644 index 00000000..20893f42 --- /dev/null +++ b/vendor/plugins/rack/spec/multipart/filename_and_modification_param @@ -0,0 +1,7 @@ +--AaB03x +Content-Type: image/jpeg +Content-Disposition: attachment; name="files"; filename=genome.jpeg; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"; +Content-Description: a complete map of the human genome + +contents +--AaB03x-- diff --git a/vendor/plugins/rack/spec/multipart/filename_with_escaped_quotes b/vendor/plugins/rack/spec/multipart/filename_with_escaped_quotes new file mode 100644 index 00000000..0a332df7 --- /dev/null +++ b/vendor/plugins/rack/spec/multipart/filename_with_escaped_quotes @@ -0,0 +1,6 @@ +--AaB03x +Content-Disposition: form-data; name="files"; filename="escape \"quotes" +Content-Type: application/octet-stream + +contents +--AaB03x-- diff --git a/vendor/plugins/rack/spec/multipart/filename_with_escaped_quotes_and_modification_param b/vendor/plugins/rack/spec/multipart/filename_with_escaped_quotes_and_modification_param new file mode 100644 index 00000000..7619bd50 --- /dev/null +++ b/vendor/plugins/rack/spec/multipart/filename_with_escaped_quotes_and_modification_param @@ -0,0 +1,7 @@ +--AaB03x +Content-Type: image/jpeg +Content-Disposition: attachment; name="files"; filename=""human" genome.jpeg"; modification-date="Wed, 12 Feb 1997 16:29:51 -0500"; +Content-Description: a complete map of the human genome + +contents +--AaB03x-- diff --git a/vendor/plugins/rack/spec/multipart/filename_with_percent_escaped_quotes b/vendor/plugins/rack/spec/multipart/filename_with_percent_escaped_quotes new file mode 100644 index 00000000..7db06413 --- /dev/null +++ b/vendor/plugins/rack/spec/multipart/filename_with_percent_escaped_quotes @@ -0,0 +1,6 @@ +--AaB03x +Content-Disposition: form-data; name="files"; filename="escape %22quotes" +Content-Type: application/octet-stream + +contents +--AaB03x-- diff --git a/vendor/plugins/rack/spec/multipart/filename_with_unescaped_quotes b/vendor/plugins/rack/spec/multipart/filename_with_unescaped_quotes new file mode 100644 index 00000000..9a291e8e --- /dev/null +++ b/vendor/plugins/rack/spec/multipart/filename_with_unescaped_quotes @@ -0,0 +1,6 @@ +--AaB03x +Content-Disposition: form-data; name="files"; filename="escape "quotes" +Content-Type: application/octet-stream + +contents +--AaB03x-- diff --git a/vendor/plugins/rack/test/multipart/ie b/vendor/plugins/rack/spec/multipart/ie similarity index 100% rename from vendor/plugins/rack/test/multipart/ie rename to vendor/plugins/rack/spec/multipart/ie diff --git a/vendor/plugins/rack/test/multipart/nested b/vendor/plugins/rack/spec/multipart/nested similarity index 100% rename from vendor/plugins/rack/test/multipart/nested rename to vendor/plugins/rack/spec/multipart/nested diff --git a/vendor/plugins/rack/test/multipart/none b/vendor/plugins/rack/spec/multipart/none similarity index 100% rename from vendor/plugins/rack/test/multipart/none rename to vendor/plugins/rack/spec/multipart/none diff --git a/vendor/plugins/rack/test/multipart/semicolon b/vendor/plugins/rack/spec/multipart/semicolon similarity index 100% rename from vendor/plugins/rack/test/multipart/semicolon rename to vendor/plugins/rack/spec/multipart/semicolon diff --git a/vendor/plugins/rack/test/multipart/text b/vendor/plugins/rack/spec/multipart/text similarity index 100% rename from vendor/plugins/rack/test/multipart/text rename to vendor/plugins/rack/spec/multipart/text diff --git a/vendor/plugins/rack/test/rackup/.gitignore b/vendor/plugins/rack/spec/rackup/.gitignore similarity index 100% rename from vendor/plugins/rack/test/rackup/.gitignore rename to vendor/plugins/rack/spec/rackup/.gitignore diff --git a/vendor/plugins/rack/test/rackup/config.ru b/vendor/plugins/rack/spec/rackup/config.ru similarity index 100% rename from vendor/plugins/rack/test/rackup/config.ru rename to vendor/plugins/rack/spec/rackup/config.ru diff --git a/vendor/plugins/rack/test/spec_rack_auth_basic.rb b/vendor/plugins/rack/spec/spec_auth_basic.rb similarity index 77% rename from vendor/plugins/rack/test/spec_rack_auth_basic.rb rename to vendor/plugins/rack/spec/spec_auth_basic.rb index 0176efc8..5ef2643b 100644 --- a/vendor/plugins/rack/test/spec_rack_auth_basic.rb +++ b/vendor/plugins/rack/spec/spec_auth_basic.rb @@ -1,25 +1,22 @@ -require 'test/spec' - require 'rack/auth/basic' require 'rack/mock' -context 'Rack::Auth::Basic' do - +describe Rack::Auth::Basic do def realm 'WallysWorld' end - + def unprotected_app lambda { |env| [ 200, {'Content-Type' => 'text/plain'}, ["Hi #{env['REMOTE_USER']}"] ] } end - + def protected_app app = Rack::Auth::Basic.new(unprotected_app) { |username, password| 'Boss' == username } app.realm = realm app end - setup do + before do @request = Rack::MockRequest.new(protected_app) end @@ -39,26 +36,26 @@ context 'Rack::Auth::Basic' do response.body.should.be.empty end - specify 'should challenge correctly when no credentials are specified' do + should 'challenge correctly when no credentials are specified' do request do |response| assert_basic_auth_challenge response end end - specify 'should rechallenge if incorrect credentials are specified' do + should 'rechallenge if incorrect credentials are specified' do request_with_basic_auth 'joe', 'password' do |response| assert_basic_auth_challenge response end end - specify 'should return application output if correct credentials are specified' do + should 'return application output if correct credentials are specified' do request_with_basic_auth 'Boss', 'password' do |response| response.status.should.equal 200 response.body.to_s.should.equal 'Hi Boss' end end - - specify 'should return 400 Bad Request if different auth scheme used' do + + should 'return 400 Bad Request if different auth scheme used' do request 'HTTP_AUTHORIZATION' => 'Digest params' do |response| response.should.be.a.client_error response.status.should.equal 400 @@ -66,8 +63,8 @@ context 'Rack::Auth::Basic' do end end - specify 'realm as optional constructor arg' do + it 'takes realm as optional constructor arg' do app = Rack::Auth::Basic.new(unprotected_app, realm) { true } - assert_equal realm, app.realm + realm.should == app.realm end end diff --git a/vendor/plugins/rack/test/spec_rack_auth_digest.rb b/vendor/plugins/rack/spec/spec_auth_digest.rb similarity index 81% rename from vendor/plugins/rack/test/spec_rack_auth_digest.rb rename to vendor/plugins/rack/spec/spec_auth_digest.rb index a980acc8..75b61b15 100644 --- a/vendor/plugins/rack/test/spec_rack_auth_digest.rb +++ b/vendor/plugins/rack/spec/spec_auth_digest.rb @@ -1,10 +1,7 @@ -require 'test/spec' - require 'rack/auth/digest/md5' require 'rack/mock' -context 'Rack::Auth::Digest::MD5' do - +describe Rack::Auth::Digest::MD5 do def realm 'WallysWorld' end @@ -45,7 +42,7 @@ context 'Rack::Auth::Digest::MD5' do Rack::MethodOverride.new(protected_app) end - setup do + before do @request = Rack::MockRequest.new(protected_app) end @@ -117,20 +114,20 @@ context 'Rack::Auth::Digest::MD5' do response.should.not.include 'WWW-Authenticate' end - specify 'should challenge when no credentials are specified' do + should 'challenge when no credentials are specified' do request 'GET', '/' do |response| assert_digest_auth_challenge response end end - specify 'should return application output if correct credentials given' do + should 'return application output if correct credentials given' do request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response| response.status.should.equal 200 response.body.to_s.should.equal 'Hi Alice' end end - specify 'should return application output if correct credentials given (hashed passwords)' do + should 'return application output if correct credentials given (hashed passwords)' do @request = Rack::MockRequest.new(protected_app_with_hashed_passwords) request_with_digest_auth 'GET', '/', 'Alice', 'correct-password' do |response| @@ -139,19 +136,19 @@ context 'Rack::Auth::Digest::MD5' do end end - specify 'should rechallenge if incorrect username given' do + should 'rechallenge if incorrect username given' do request_with_digest_auth 'GET', '/', 'Bob', 'correct-password' do |response| assert_digest_auth_challenge response end end - specify 'should rechallenge if incorrect password given' do + should 'rechallenge if incorrect password given' do request_with_digest_auth 'GET', '/', 'Alice', 'wrong-password' do |response| assert_digest_auth_challenge response end end - specify 'should rechallenge with stale parameter if nonce is stale' do + should 'rechallenge with stale parameter if nonce is stale' do begin Rack::Auth::Digest::Nonce.time_limit = 1 @@ -164,39 +161,39 @@ context 'Rack::Auth::Digest::MD5' do end end - specify 'should return 400 Bad Request if incorrect qop given' do + should 'return 400 Bad Request if incorrect qop given' do request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'qop' => 'auth-int' do |response| assert_bad_request response end end - specify 'should return 400 Bad Request if incorrect uri given' do + should 'return 400 Bad Request if incorrect uri given' do request_with_digest_auth 'GET', '/', 'Alice', 'correct-password', 'uri' => '/foo' do |response| assert_bad_request response end end - specify 'should return 400 Bad Request if different auth scheme used' do + should 'return 400 Bad Request if different auth scheme used' do request 'GET', '/', 'HTTP_AUTHORIZATION' => 'Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==' do |response| assert_bad_request response end end - specify 'should not require credentials for unprotected path' do + should 'not require credentials for unprotected path' do @request = Rack::MockRequest.new(partially_protected_app) request 'GET', '/' do |response| response.should.be.ok end end - specify 'should challenge when no credentials are specified for protected path' do + should 'challenge when no credentials are specified for protected path' do @request = Rack::MockRequest.new(partially_protected_app) request 'GET', '/protected' do |response| assert_digest_auth_challenge response end end - specify 'should return application output if correct credentials given for protected path' do + should 'return application output if correct credentials given for protected path' do @request = Rack::MockRequest.new(partially_protected_app) request_with_digest_auth 'GET', '/protected', 'Alice', 'correct-password' do |response| response.status.should.equal 200 @@ -204,14 +201,14 @@ context 'Rack::Auth::Digest::MD5' do end end - specify 'should return application output if correct credentials given for POST' do + should 'return application output if correct credentials given for POST' do request_with_digest_auth 'POST', '/', 'Alice', 'correct-password' do |response| response.status.should.equal 200 response.body.to_s.should.equal 'Hi Alice' end end - specify 'should return application output if correct credentials given for PUT (using method override of POST)' do + should 'return application output if correct credentials given for PUT (using method override of POST)' do @request = Rack::MockRequest.new(protected_app_with_method_override) request_with_digest_auth 'POST', '/', 'Alice', 'correct-password', :input => "_method=put" do |response| response.status.should.equal 200 @@ -219,8 +216,8 @@ context 'Rack::Auth::Digest::MD5' do end end - specify 'realm as optional constructor arg' do + it 'takes realm as optional constructor arg' do app = Rack::Auth::Digest::MD5.new(unprotected_app, realm) { true } - assert_equal realm, app.realm + realm.should == app.realm end end diff --git a/vendor/plugins/rack/test/spec_rack_builder.rb b/vendor/plugins/rack/spec/spec_builder.rb similarity index 61% rename from vendor/plugins/rack/test/spec_rack_builder.rb rename to vendor/plugins/rack/spec/spec_builder.rb index 3fad9810..9839eaa5 100644 --- a/vendor/plugins/rack/test/spec_rack_builder.rb +++ b/vendor/plugins/rack/spec/spec_builder.rb @@ -1,12 +1,51 @@ -require 'test/spec' - require 'rack/builder' require 'rack/mock' require 'rack/showexceptions' -require 'rack/auth/basic' +require 'rack/urlmap' -context "Rack::Builder" do - specify "chains apps by default" do +class NothingMiddleware + def initialize(app) + @app = app + end + def call(env) + @@env = env + response = @app.call(env) + response + end + def self.env + @@env + end +end + +describe Rack::Builder do + it "supports mapping" do + app = Rack::Builder.new do + map '/' do |outer_env| + run lambda { |inner_env| [200, {}, ['root']] } + end + map '/sub' do + run lambda { |inner_env| [200, {}, ['sub']] } + end + end.to_app + Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root' + Rack::MockRequest.new(app).get("/sub").body.to_s.should.equal 'sub' + end + + it "doesn't dupe env even when mapping" do + app = Rack::Builder.new do + use NothingMiddleware + map '/' do |outer_env| + run lambda { |inner_env| + inner_env['new_key'] = 'new_value' + [200, {}, ['root']] + } + end + end.to_app + Rack::MockRequest.new(app).get("/").body.to_s.should.equal 'root' + NothingMiddleware.env['new_key'].should.equal 'new_value' + end + + it "chains apps by default" do app = Rack::Builder.new do use Rack::ShowExceptions run lambda { |env| raise "bzzzt" } @@ -17,7 +56,7 @@ context "Rack::Builder" do Rack::MockRequest.new(app).get("/").should.be.server_error end - specify "has implicit #to_app" do + it "has implicit #to_app" do app = Rack::Builder.new do use Rack::ShowExceptions run lambda { |env| raise "bzzzt" } @@ -28,7 +67,7 @@ context "Rack::Builder" do Rack::MockRequest.new(app).get("/").should.be.server_error end - specify "supports blocks on use" do + it "supports blocks on use" do app = Rack::Builder.new do use Rack::ShowExceptions use Rack::Auth::Basic do |username, password| @@ -43,13 +82,13 @@ context "Rack::Builder" do response.status.should.equal 401 # with auth... - response = Rack::MockRequest.new(app).get("/", + response = Rack::MockRequest.new(app).get("/", 'HTTP_AUTHORIZATION' => 'Basic ' + ["joe:secret"].pack("m*")) response.status.should.equal 200 response.body.to_s.should.equal 'Hi Boss' end - specify "has explicit #to_app" do + it "has explicit #to_app" do app = Rack::Builder.app do use Rack::ShowExceptions run lambda { |env| raise "bzzzt" } @@ -60,7 +99,7 @@ context "Rack::Builder" do Rack::MockRequest.new(app).get("/").should.be.server_error end - specify "apps are initialized once" do + should "initialize apps once" do app = Rack::Builder.new do class AppClass def initialize diff --git a/vendor/plugins/rack/test/spec_rack_cascade.rb b/vendor/plugins/rack/spec/spec_cascade.rb similarity index 86% rename from vendor/plugins/rack/test/spec_rack_cascade.rb rename to vendor/plugins/rack/spec/spec_cascade.rb index cf3c29b4..c2c49200 100644 --- a/vendor/plugins/rack/test/spec_rack_cascade.rb +++ b/vendor/plugins/rack/spec/spec_cascade.rb @@ -1,12 +1,9 @@ -require 'test/spec' - require 'rack/cascade' +require 'rack/file' +require 'rack/urlmap' require 'rack/mock' -require 'rack/urlmap' -require 'rack/file' - -context "Rack::Cascade" do +describe Rack::Cascade do docroot = File.expand_path(File.dirname(__FILE__)) app1 = Rack::File.new(docroot) @@ -15,7 +12,7 @@ context "Rack::Cascade" do app3 = Rack::URLMap.new("/foo" => lambda { |env| [200, { "Content-Type" => "text/plain"}, [""]]}) - specify "should dispatch onward on 404 by default" do + should "dispatch onward on 404 by default" do cascade = Rack::Cascade.new([app1, app2, app3]) Rack::MockRequest.new(cascade).get("/cgi/test").should.be.ok Rack::MockRequest.new(cascade).get("/foo").should.be.ok @@ -23,16 +20,16 @@ context "Rack::Cascade" do Rack::MockRequest.new(cascade).get("/cgi/../bla").should.be.forbidden end - specify "should dispatch onward on whatever is passed" do + should "dispatch onward on whatever is passed" do cascade = Rack::Cascade.new([app1, app2, app3], [404, 403]) Rack::MockRequest.new(cascade).get("/cgi/../bla").should.be.not_found end - specify "should return 404 if empty" do + should "return 404 if empty" do Rack::MockRequest.new(Rack::Cascade.new([])).get('/').should.be.not_found end - specify "should append new app" do + should "append new app" do cascade = Rack::Cascade.new([], [404, 403]) Rack::MockRequest.new(cascade).get('/').should.be.not_found cascade << app2 diff --git a/vendor/plugins/rack/test/spec_rack_cgi.rb b/vendor/plugins/rack/spec/spec_cgi.rb similarity index 60% rename from vendor/plugins/rack/test/spec_rack_cgi.rb rename to vendor/plugins/rack/spec/spec_cgi.rb index 59500cd7..e820d3ff 100644 --- a/vendor/plugins/rack/test/spec_rack_cgi.rb +++ b/vendor/plugins/rack/spec/spec_cgi.rb @@ -1,53 +1,55 @@ -require 'test/spec' -require 'testrequest' +require File.expand_path('../testrequest', __FILE__) +require 'rack/handler/cgi' -context "Rack::Handler::CGI" do - include TestRequest::Helpers +describe Rack::Handler::CGI do + extend TestRequest::Helpers - setup do - @host = '0.0.0.0' - @port = 9203 - end + @host = '0.0.0.0' + @port = 9203 # Keep this first. - specify "startup" do - $pid = fork { - Dir.chdir(File.join(File.dirname(__FILE__), "..", "test", "cgi")) + $pid = fork { + ENV['RACK_ENV'] = 'deployment' + ENV['RUBYLIB'] = [ + File.expand_path('../../lib', __FILE__), + ENV['RUBYLIB'], + ].compact.join(':') + + Dir.chdir(File.expand_path("../cgi", __FILE__)) do exec "lighttpd -D -f lighttpd.conf" - } - end + end + } - specify "should respond" do + should "respond" do sleep 1 - lambda { - GET("/test") - }.should.not.raise + GET("/test") + response.should.not.be.nil end - specify "should be a lighttpd" do + should "be a lighttpd" do GET("/test") - status.should.be 200 + status.should.equal 200 response["SERVER_SOFTWARE"].should =~ /lighttpd/ response["HTTP_VERSION"].should.equal "HTTP/1.1" response["SERVER_PROTOCOL"].should.equal "HTTP/1.1" response["SERVER_PORT"].should.equal @port.to_s - response["SERVER_NAME"].should =~ @host + response["SERVER_NAME"].should.equal @host end - specify "should have rack headers" do + should "have rack headers" do GET("/test") - response["rack.version"].should.equal [1,1] - response["rack.multithread"].should.be false - response["rack.multiprocess"].should.be true - response["rack.run_once"].should.be true + response["rack.version"].should.equal([1,1]) + response["rack.multithread"].should.be.false + response["rack.multiprocess"].should.be.true + response["rack.run_once"].should.be.true end - specify "should have CGI headers on GET" do + should "have CGI headers on GET" do GET("/test") response["REQUEST_METHOD"].should.equal "GET" response["SCRIPT_NAME"].should.equal "/test" response["REQUEST_PATH"].should.equal "/" - response["PATH_INFO"].should.equal "" + response["PATH_INFO"].should.be.nil response["QUERY_STRING"].should.equal "" response["test.postdata"].should.equal "" @@ -59,7 +61,7 @@ context "Rack::Handler::CGI" do response["QUERY_STRING"].should.equal "quux=1" end - specify "should have CGI headers on POST" do + should "have CGI headers on POST" do POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'}) status.should.equal 200 response["REQUEST_METHOD"].should.equal "POST" @@ -70,20 +72,20 @@ context "Rack::Handler::CGI" do response["test.postdata"].should.equal "rack-form-data=23" end - specify "should support HTTP auth" do + should "support HTTP auth" do GET("/test", {:user => "ruth", :passwd => "secret"}) response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ=" end - specify "should set status" do + should "set status" do GET("/test?secret") status.should.equal 403 response["rack.url_scheme"].should.equal "http" end # Keep this last. - specify "shutdown" do + should "shutdown" do Process.kill 15, $pid - Process.wait($pid).should.equal $pid + Process.wait($pid).should == $pid end end diff --git a/vendor/plugins/rack/test/spec_rack_chunked.rb b/vendor/plugins/rack/spec/spec_chunked.rb similarity index 81% rename from vendor/plugins/rack/test/spec_rack_chunked.rb rename to vendor/plugins/rack/spec/spec_chunked.rb index 39eea482..ac53c4a4 100644 --- a/vendor/plugins/rack/test/spec_rack_chunked.rb +++ b/vendor/plugins/rack/spec/spec_chunked.rb @@ -1,15 +1,13 @@ -require 'rack/mock' require 'rack/chunked' -require 'rack/utils' - -context "Rack::Chunked" do +require 'rack/mock' +describe Rack::Chunked do before do @env = Rack::MockRequest. env_for('/', 'HTTP_VERSION' => '1.1', 'REQUEST_METHOD' => 'GET') end - specify 'chunks responses with no Content-Length' do + should 'chunk responses with no Content-Length' do app = lambda { |env| [200, {}, ['Hello', ' ', 'World!']] } response = Rack::MockResponse.new(*Rack::Chunked.new(app).call(@env)) response.headers.should.not.include 'Content-Length' @@ -17,7 +15,7 @@ context "Rack::Chunked" do response.body.should.equal "5\r\nHello\r\n1\r\n \r\n6\r\nWorld!\r\n0\r\n\r\n" end - specify 'chunks empty bodies properly' do + should 'chunks empty bodies properly' do app = lambda { |env| [200, {}, []] } response = Rack::MockResponse.new(*Rack::Chunked.new(app).call(@env)) response.headers.should.not.include 'Content-Length' @@ -25,7 +23,7 @@ context "Rack::Chunked" do response.body.should.equal "0\r\n\r\n" end - specify 'does not modify response when Content-Length header present' do + should 'not modify response when Content-Length header present' do app = lambda { |env| [200, {'Content-Length'=>'12'}, ['Hello', ' ', 'World!']] } status, headers, body = Rack::Chunked.new(app).call(@env) status.should.equal 200 @@ -34,7 +32,7 @@ context "Rack::Chunked" do body.join.should.equal 'Hello World!' end - specify 'does not modify response when client is HTTP/1.0' do + should 'not modify response when client is HTTP/1.0' do app = lambda { |env| [200, {}, ['Hello', ' ', 'World!']] } @env['HTTP_VERSION'] = 'HTTP/1.0' status, headers, body = Rack::Chunked.new(app).call(@env) @@ -43,7 +41,7 @@ context "Rack::Chunked" do body.join.should.equal 'Hello World!' end - specify 'does not modify response when Transfer-Encoding header already present' do + should 'not modify response when Transfer-Encoding header already present' do app = lambda { |env| [200, {'Transfer-Encoding' => 'identity'}, ['Hello', ' ', 'World!']] } status, headers, body = Rack::Chunked.new(app).call(@env) status.should.equal 200 @@ -52,7 +50,7 @@ context "Rack::Chunked" do end [100, 204, 304].each do |status_code| - specify "does not modify response when status code is #{status_code}" do + should "not modify response when status code is #{status_code}" do app = lambda { |env| [status_code, {}, []] } status, headers, body = Rack::Chunked.new(app).call(@env) status.should.equal status_code diff --git a/vendor/plugins/rack/test/spec_rack_commonlogger.rb b/vendor/plugins/rack/spec/spec_commonlogger.rb similarity index 74% rename from vendor/plugins/rack/test/spec_rack_commonlogger.rb rename to vendor/plugins/rack/spec/spec_commonlogger.rb index 46a72e86..446e70e1 100644 --- a/vendor/plugins/rack/test/spec_rack_commonlogger.rb +++ b/vendor/plugins/rack/spec/spec_commonlogger.rb @@ -1,11 +1,10 @@ -require 'test/spec' -require 'stringio' - require 'rack/commonlogger' -require 'rack/lobster' require 'rack/mock' -context "Rack::CommonLogger" do +describe Rack::CommonLogger do + obj = 'foobar' + length = obj.size + app = lambda { |env| [200, {"Content-Type" => "text/html", "Content-Length" => length.to_s}, @@ -19,42 +18,38 @@ context "Rack::CommonLogger" do {"Content-Type" => "text/html", "Content-Length" => "0"}, []]} - specify "should log to rack.errors by default" do + should "log to rack.errors by default" do res = Rack::MockRequest.new(Rack::CommonLogger.new(app)).get("/") res.errors.should.not.be.empty res.errors.should =~ /"GET \/ " 200 #{length} / end - specify "should log to anything with +write+" do + should "log to anything with +write+" do log = StringIO.new res = Rack::MockRequest.new(Rack::CommonLogger.new(app, log)).get("/") log.string.should =~ /"GET \/ " 200 #{length} / end - specify "should log - content length if header is missing" do + should "log - content length if header is missing" do res = Rack::MockRequest.new(Rack::CommonLogger.new(app_without_length)).get("/") res.errors.should.not.be.empty res.errors.should =~ /"GET \/ " 200 - / end - specify "should log - content length if header is zero" do + should "log - content length if header is zero" do res = Rack::MockRequest.new(Rack::CommonLogger.new(app_with_zero_length)).get("/") res.errors.should.not.be.empty res.errors.should =~ /"GET \/ " 200 - / end - + def length - self.class.length - end - - def self.length 123 end - + def self.obj "hello world" end diff --git a/vendor/plugins/rack/test/spec_rack_conditionalget.rb b/vendor/plugins/rack/spec/spec_conditionalget.rb similarity index 76% rename from vendor/plugins/rack/test/spec_rack_conditionalget.rb rename to vendor/plugins/rack/spec/spec_conditionalget.rb index ca34cc92..c6a5b16e 100644 --- a/vendor/plugins/rack/test/spec_rack_conditionalget.rb +++ b/vendor/plugins/rack/spec/spec_conditionalget.rb @@ -1,11 +1,9 @@ -require 'test/spec' require 'time' - -require 'rack/mock' require 'rack/conditionalget' +require 'rack/mock' -context "Rack::ConditionalGet" do - specify "should set a 304 status and truncate body when If-Modified-Since hits" do +describe Rack::ConditionalGet do + should "set a 304 status and truncate body when If-Modified-Since hits" do timestamp = Time.now.httpdate app = Rack::ConditionalGet.new(lambda { |env| [200, {'Last-Modified'=>timestamp}, ['TEST']] }) @@ -17,7 +15,7 @@ context "Rack::ConditionalGet" do response.body.should.be.empty end - specify "should set a 304 status and truncate body when If-None-Match hits" do + should "set a 304 status and truncate body when If-None-Match hits" do app = Rack::ConditionalGet.new(lambda { |env| [200, {'Etag'=>'1234'}, ['TEST']] }) @@ -28,7 +26,7 @@ context "Rack::ConditionalGet" do response.body.should.be.empty end - specify "should not affect non-GET/HEAD requests" do + should "not affect non-GET/HEAD requests" do app = Rack::ConditionalGet.new(lambda { |env| [200, {'Etag'=>'1234'}, ['TEST']] }) diff --git a/vendor/plugins/rack/test/spec_rack_config.rb b/vendor/plugins/rack/spec/spec_config.rb similarity index 80% rename from vendor/plugins/rack/test/spec_rack_config.rb rename to vendor/plugins/rack/spec/spec_config.rb index a508ea4b..21425dd2 100644 --- a/vendor/plugins/rack/test/spec_rack_config.rb +++ b/vendor/plugins/rack/spec/spec_config.rb @@ -1,12 +1,11 @@ -require 'test/spec' -require 'rack/mock' require 'rack/builder' -require 'rack/content_length' require 'rack/config' +require 'rack/content_length' +require 'rack/lint' +require 'rack/mock' -context "Rack::Config" do - - specify "should accept a block that modifies the environment" do +describe Rack::Config do + should "accept a block that modifies the environment" do app = Rack::Builder.new do use Rack::Lint use Rack::ContentLength @@ -17,8 +16,8 @@ context "Rack::Config" do [200, {'Content-Type' => 'text/plain'}, [env['greeting'] || '']] } end + response = Rack::MockRequest.new(app).get('/') response.body.should.equal('hello') end - end diff --git a/vendor/plugins/rack/test/spec_rack_content_length.rb b/vendor/plugins/rack/spec/spec_content_length.rb similarity index 73% rename from vendor/plugins/rack/test/spec_rack_content_length.rb rename to vendor/plugins/rack/spec/spec_content_length.rb index 7db9345f..904992ff 100644 --- a/vendor/plugins/rack/test/spec_rack_content_length.rb +++ b/vendor/plugins/rack/spec/spec_content_length.rb @@ -1,20 +1,19 @@ -require 'rack/mock' require 'rack/content_length' -context "Rack::ContentLength" do - specify "sets Content-Length on String bodies if none is set" do +describe Rack::ContentLength do + should "set Content-Length on String bodies if none is set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] } response = Rack::ContentLength.new(app).call({}) response[1]['Content-Length'].should.equal '13' end - specify "sets Content-Length on Array bodies if none is set" do + should "set Content-Length on Array bodies if none is set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] } response = Rack::ContentLength.new(app).call({}) response[1]['Content-Length'].should.equal '13' end - specify "does not set Content-Length on variable length bodies" do + should "not set Content-Length on variable length bodies" do body = lambda { "Hello World!" } def body.each ; yield call ; end @@ -23,19 +22,19 @@ context "Rack::ContentLength" do response[1]['Content-Length'].should.be.nil end - specify "does not change Content-Length if it is already set" do + should "not change Content-Length if it is already set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'Content-Length' => '1'}, "Hello, World!"] } response = Rack::ContentLength.new(app).call({}) response[1]['Content-Length'].should.equal '1' end - specify "does not set Content-Length on 304 responses" do + should "not set Content-Length on 304 responses" do app = lambda { |env| [304, {'Content-Type' => 'text/plain'}, []] } response = Rack::ContentLength.new(app).call({}) response[1]['Content-Length'].should.equal nil end - specify "does not set Content-Length when Transfer-Encoding is chunked" do + should "not set Content-Length when Transfer-Encoding is chunked" do app = lambda { |env| [200, {'Transfer-Encoding' => 'chunked'}, []] } response = Rack::ContentLength.new(app).call({}) response[1]['Content-Length'].should.equal nil diff --git a/vendor/plugins/rack/test/spec_rack_content_type.rb b/vendor/plugins/rack/spec/spec_content_type.rb similarity index 74% rename from vendor/plugins/rack/test/spec_rack_content_type.rb rename to vendor/plugins/rack/spec/spec_content_type.rb index 9975b94d..8eb9f150 100644 --- a/vendor/plugins/rack/test/spec_rack_content_type.rb +++ b/vendor/plugins/rack/spec/spec_content_type.rb @@ -1,27 +1,26 @@ -require 'rack/mock' require 'rack/content_type' -context "Rack::ContentType" do - specify "sets Content-Type to default text/html if none is set" do +describe Rack::ContentType do + should "set Content-Type to default text/html if none is set" do app = lambda { |env| [200, {}, "Hello, World!"] } status, headers, body = Rack::ContentType.new(app).call({}) headers['Content-Type'].should.equal 'text/html' end - specify "sets Content-Type to chosen default if none is set" do + should "set Content-Type to chosen default if none is set" do app = lambda { |env| [200, {}, "Hello, World!"] } status, headers, body = Rack::ContentType.new(app, 'application/octet-stream').call({}) headers['Content-Type'].should.equal 'application/octet-stream' end - specify "does not change Content-Type if it is already set" do + should "not change Content-Type if it is already set" do app = lambda { |env| [200, {'Content-Type' => 'foo/bar'}, "Hello, World!"] } status, headers, body = Rack::ContentType.new(app).call({}) headers['Content-Type'].should.equal 'foo/bar' end - specify "case insensitive detection of Content-Type" do + should "detect Content-Type case insensitive" do app = lambda { |env| [200, {'CONTENT-Type' => 'foo/bar'}, "Hello, World!"] } status, headers, body = Rack::ContentType.new(app).call({}) headers.to_a.select { |k,v| k.downcase == "content-type" }. diff --git a/vendor/plugins/rack/test/spec_rack_deflater.rb b/vendor/plugins/rack/spec/spec_deflater.rb similarity index 86% rename from vendor/plugins/rack/test/spec_rack_deflater.rb rename to vendor/plugins/rack/spec/spec_deflater.rb index c9bb3189..f2e462af 100644 --- a/vendor/plugins/rack/test/spec_rack_deflater.rb +++ b/vendor/plugins/rack/spec/spec_deflater.rb @@ -1,11 +1,9 @@ -require 'test/spec' - -require 'rack/mock' -require 'rack/deflater' require 'stringio' require 'time' # for Time#httpdate +require 'rack/deflater' +require 'rack/mock' -context "Rack::Deflater" do +describe Rack::Deflater do def build_response(status, body, accept_encoding, headers = {}) body = [body] if body.respond_to? :to_str app = lambda { |env| [status, {}, body] } @@ -15,7 +13,7 @@ context "Rack::Deflater" do return response end - specify "should be able to deflate bodies that respond to each" do + should "be able to deflate bodies that respond to each" do body = Object.new class << body; def each; yield("foo"); yield("bar"); end; end @@ -32,7 +30,7 @@ context "Rack::Deflater" do end # TODO: This is really just a special case of the above... - specify "should be able to deflate String bodies" do + should "be able to deflate String bodies" do response = build_response(200, "Hello world!", "deflate") response[0].should.equal(200) @@ -45,7 +43,7 @@ context "Rack::Deflater" do buf.should.equal("\363H\315\311\311W(\317/\312IQ\004\000") end - specify "should be able to gzip bodies that respond to each" do + should "be able to gzip bodies that respond to each" do body = Object.new class << body; def each; yield("foo"); yield("bar"); end; end @@ -65,7 +63,7 @@ context "Rack::Deflater" do gz.close end - specify "should be able to fallback to no deflation" do + should "be able to fallback to no deflation" do response = build_response(200, "Hello world!", "superzip") response[0].should.equal(200) @@ -73,7 +71,7 @@ context "Rack::Deflater" do response[2].should.equal(["Hello world!"]) end - specify "should be able to skip when there is no response entity body" do + should "be able to skip when there is no response entity body" do response = build_response(304, [], "gzip") response[0].should.equal(304) @@ -81,7 +79,7 @@ context "Rack::Deflater" do response[2].should.equal([]) end - specify "should handle the lack of an acceptable encoding" do + should "handle the lack of an acceptable encoding" do response1 = build_response(200, "Hello world!", "identity;q=0", "PATH_INFO" => "/") response1[0].should.equal(406) response1[1].should.equal({"Content-Type" => "text/plain", "Content-Length" => "71"}) @@ -93,7 +91,7 @@ context "Rack::Deflater" do response2[2].should.equal(["An acceptable encoding for the requested resource /foo/bar could not be found."]) end - specify "should handle gzip response with Last-Modified header" do + should "handle gzip response with Last-Modified header" do last_modified = Time.now.httpdate app = lambda { |env| [200, { "Last-Modified" => last_modified }, ["Hello World!"]] } @@ -115,7 +113,7 @@ context "Rack::Deflater" do gz.close end - specify "should do nothing when no-transform Cache-Control directive present" do + should "do nothing when no-transform Cache-Control directive present" do app = lambda { |env| [200, {'Cache-Control' => 'no-transform'}, ['Hello World!']] } request = Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => "gzip") response = Rack::Deflater.new(app).call(request) diff --git a/vendor/plugins/rack/test/spec_rack_directory.rb b/vendor/plugins/rack/spec/spec_directory.rb similarity index 79% rename from vendor/plugins/rack/test/spec_rack_directory.rb rename to vendor/plugins/rack/spec/spec_directory.rb index d255c91d..a45ba23f 100644 --- a/vendor/plugins/rack/test/spec_rack_directory.rb +++ b/vendor/plugins/rack/spec/spec_directory.rb @@ -1,16 +1,12 @@ -require 'test/spec' - require 'rack/directory' -require 'rack/lint' - require 'rack/mock' -context "Rack::Directory" do +describe Rack::Directory do DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT FILE_CATCH = proc{|env| [200, {'Content-Type'=>'text/plain', "Content-Length" => "7"}, ['passed!']] } app = Rack::Directory.new DOCROOT, FILE_CATCH - specify "serves directory indices" do + should "serve directory indices" do res = Rack::MockRequest.new(Rack::Lint.new(app)). get("/cgi/") @@ -18,7 +14,7 @@ context "Rack::Directory" do res.should =~ // end - specify "passes to app if file found" do + should "pass to app if file found" do res = Rack::MockRequest.new(Rack::Lint.new(app)). get("/cgi/test") @@ -26,7 +22,7 @@ context "Rack::Directory" do res.should =~ /passed!/ end - specify "serves uri with URL encoded filenames" do + should "serve uri with URL encoded filenames" do res = Rack::MockRequest.new(Rack::Lint.new(app)). get("/%63%67%69/") # "/cgi/test" @@ -40,7 +36,7 @@ context "Rack::Directory" do res.should =~ /passed!/ end - specify "does not allow directory traversal" do + should "not allow directory traversal" do res = Rack::MockRequest.new(Rack::Lint.new(app)). get("/cgi/../test") @@ -52,7 +48,7 @@ context "Rack::Directory" do res.should.be.forbidden end - specify "404s if it can't find the file" do + should "404 if it can't find the file" do res = Rack::MockRequest.new(Rack::Lint.new(app)). get("/cgi/blubb") diff --git a/vendor/plugins/rack/test/spec_rack_etag.rb b/vendor/plugins/rack/spec/spec_etag.rb similarity index 73% rename from vendor/plugins/rack/test/spec_rack_etag.rb rename to vendor/plugins/rack/spec/spec_etag.rb index 73cd31ac..18bc8400 100644 --- a/vendor/plugins/rack/test/spec_rack_etag.rb +++ b/vendor/plugins/rack/spec/spec_etag.rb @@ -1,15 +1,13 @@ -require 'test/spec' -require 'rack/mock' require 'rack/etag' -context "Rack::ETag" do - specify "sets ETag if none is set" do +describe Rack::ETag do + should "set ETag if none is set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] } response = Rack::ETag.new(app).call({}) response[1]['ETag'].should.equal "\"65a8e27d8879283831b664bd8b7f0ad4\"" end - specify "does not change ETag if it is already set" do + should "not change ETag if it is already set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain', 'ETag' => '"abc"'}, ["Hello, World!"]] } response = Rack::ETag.new(app).call({}) response[1]['ETag'].should.equal "\"abc\"" diff --git a/vendor/plugins/rack/test/spec_rack_fastcgi.rb b/vendor/plugins/rack/spec/spec_fastcgi.rb similarity index 63% rename from vendor/plugins/rack/test/spec_rack_fastcgi.rb rename to vendor/plugins/rack/spec/spec_fastcgi.rb index 1ae55ace..0e56bf53 100644 --- a/vendor/plugins/rack/test/spec_rack_fastcgi.rb +++ b/vendor/plugins/rack/spec/spec_fastcgi.rb @@ -1,48 +1,55 @@ -require 'test/spec' -require 'testrequest' +require File.expand_path('../testrequest', __FILE__) +require 'rack/handler/fastcgi' -context "Rack::Handler::FastCGI" do - include TestRequest::Helpers +describe Rack::Handler::FastCGI do + extend TestRequest::Helpers - setup do - @host = '0.0.0.0' - @port = 9203 - end + @host = '0.0.0.0' + @port = 9203 # Keep this first. - specify "startup" do - $pid = fork { - Dir.chdir(File.join(File.dirname(__FILE__), "..", "test", "cgi")) + $pid = fork { + ENV['RACK_ENV'] = 'deployment' + ENV['RUBYLIB'] = [ + File.expand_path('../../lib', __FILE__), + ENV['RUBYLIB'], + ].compact.join(':') + + Dir.chdir(File.expand_path("../cgi", __FILE__)) do exec "lighttpd -D -f lighttpd.conf" - } - end + end + } - specify "should respond" do + should "respond" do sleep 1 - lambda { - GET("/test.fcgi") - }.should.not.raise + GET("/test") + response.should.not.be.nil end - specify "should be a lighttpd" do + should "respond via rackup server" do + GET("/sample_rackup.ru") + status.should.equal 200 + end + + should "be a lighttpd" do GET("/test.fcgi") - status.should.be 200 + status.should.equal 200 response["SERVER_SOFTWARE"].should =~ /lighttpd/ response["HTTP_VERSION"].should.equal "HTTP/1.1" response["SERVER_PROTOCOL"].should.equal "HTTP/1.1" response["SERVER_PORT"].should.equal @port.to_s - response["SERVER_NAME"].should =~ @host + response["SERVER_NAME"].should.equal @host end - specify "should have rack headers" do + should "have rack headers" do GET("/test.fcgi") response["rack.version"].should.equal [1,1] - response["rack.multithread"].should.be false - response["rack.multiprocess"].should.be true - response["rack.run_once"].should.be false + response["rack.multithread"].should.be.false + response["rack.multiprocess"].should.be.true + response["rack.run_once"].should.be.false end - specify "should have CGI headers on GET" do + should "have CGI headers on GET" do GET("/test.fcgi") response["REQUEST_METHOD"].should.equal "GET" response["SCRIPT_NAME"].should.equal "/test.fcgi" @@ -59,7 +66,7 @@ context "Rack::Handler::FastCGI" do response["QUERY_STRING"].should.equal "quux=1" end - specify "should have CGI headers on POST" do + should "have CGI headers on POST" do POST("/test.fcgi", {"rack-form-data" => "23"}, {'X-test-header' => '42'}) status.should.equal 200 response["REQUEST_METHOD"].should.equal "POST" @@ -70,19 +77,19 @@ context "Rack::Handler::FastCGI" do response["test.postdata"].should.equal "rack-form-data=23" end - specify "should support HTTP auth" do + should "support HTTP auth" do GET("/test.fcgi", {:user => "ruth", :passwd => "secret"}) response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ=" end - specify "should set status" do + should "set status" do GET("/test.fcgi?secret") status.should.equal 403 response["rack.url_scheme"].should.equal "http" end # Keep this last. - specify "shutdown" do + should "shutdown" do Process.kill 15, $pid Process.wait($pid).should.equal $pid end diff --git a/vendor/plugins/rack/test/spec_rack_file.rb b/vendor/plugins/rack/spec/spec_file.rb similarity index 76% rename from vendor/plugins/rack/test/spec_rack_file.rb rename to vendor/plugins/rack/spec/spec_file.rb index 0a2f8ee8..f191aa03 100644 --- a/vendor/plugins/rack/test/spec_rack_file.rb +++ b/vendor/plugins/rack/spec/spec_file.rb @@ -1,14 +1,10 @@ -require 'test/spec' - require 'rack/file' -require 'rack/lint' - require 'rack/mock' -context "Rack::File" do +describe Rack::File do DOCROOT = File.expand_path(File.dirname(__FILE__)) unless defined? DOCROOT - specify "serves files" do + should "serve files" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/cgi/test") @@ -16,7 +12,7 @@ context "Rack::File" do res.should =~ /ruby/ end - specify "sets Last-Modified header" do + should "set Last-Modified header" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/cgi/test") @@ -26,7 +22,7 @@ context "Rack::File" do res["Last-Modified"].should.equal File.mtime(path).httpdate end - specify "serves files with URL encoded filenames" do + should "serve files with URL encoded filenames" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/cgi/%74%65%73%74") # "/cgi/test" @@ -34,35 +30,35 @@ context "Rack::File" do res.should =~ /ruby/ end - specify "does not allow directory traversal" do + should "not allow directory traversal" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/cgi/../test") res.should.be.forbidden end - specify "does not allow directory traversal with encoded periods" do + should "not allow directory traversal with encoded periods" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/%2E%2E/README") res.should.be.forbidden end - specify "404s if it can't find the file" do + should "404 if it can't find the file" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/cgi/blubb") res.should.be.not_found end - specify "detects SystemCallErrors" do + should "detect SystemCallErrors" do res = Rack::MockRequest.new(Rack::Lint.new(Rack::File.new(DOCROOT))). get("/cgi") res.should.be.not_found end - specify "returns bodies that respond to #to_path" do + should "return bodies that respond to #to_path" do env = Rack::MockRequest.env_for("/cgi/test") status, headers, body = Rack::File.new(DOCROOT).call(env) diff --git a/vendor/plugins/rack/test/spec_rack_handler.rb b/vendor/plugins/rack/spec/spec_handler.rb similarity index 66% rename from vendor/plugins/rack/test/spec_rack_handler.rb rename to vendor/plugins/rack/spec/spec_handler.rb index fcf19b78..4f05efcf 100644 --- a/vendor/plugins/rack/test/spec_rack_handler.rb +++ b/vendor/plugins/rack/spec/spec_handler.rb @@ -1,43 +1,41 @@ -require 'test/spec' - require 'rack/handler' class Rack::Handler::Lobster; end class RockLobster; end -context "Rack::Handler" do - specify "has registered default handlers" do +describe Rack::Handler do + it "has registered default handlers" do Rack::Handler.get('cgi').should.equal Rack::Handler::CGI Rack::Handler.get('fastcgi').should.equal Rack::Handler::FastCGI Rack::Handler.get('mongrel').should.equal Rack::Handler::Mongrel Rack::Handler.get('webrick').should.equal Rack::Handler::WEBrick end - - specify "handler that doesn't exist should raise a NameError" do + + should "raise NameError if handler doesn't exist" do lambda { Rack::Handler.get('boom') }.should.raise(NameError) end - specify "should get unregistered, but already required, handler by name" do + should "get unregistered, but already required, handler by name" do Rack::Handler.get('Lobster').should.equal Rack::Handler::Lobster end - specify "should register custom handler" do + should "register custom handler" do Rack::Handler.register('rock_lobster', 'RockLobster') Rack::Handler.get('rock_lobster').should.equal RockLobster end - - specify "should not need registration for properly coded handlers even if not already required" do + + should "not need registration for properly coded handlers even if not already required" do begin - $:.push "test/unregistered_handler" + $LOAD_PATH.push File.expand_path('../unregistered_handler', __FILE__) Rack::Handler.get('Unregistered').should.equal Rack::Handler::Unregistered lambda { Rack::Handler.get('UnRegistered') }.should.raise(NameError) Rack::Handler.get('UnregisteredLongOne').should.equal Rack::Handler::UnregisteredLongOne ensure - $:.delete "test/unregistered_handler" + $LOAD_PATH.delete File.expand_path('../unregistered_handler', __FILE__) end end end diff --git a/vendor/plugins/rack/test/spec_rack_head.rb b/vendor/plugins/rack/spec/spec_head.rb similarity index 84% rename from vendor/plugins/rack/test/spec_rack_head.rb rename to vendor/plugins/rack/spec/spec_head.rb index 48d3f81f..f81392ad 100644 --- a/vendor/plugins/rack/test/spec_rack_head.rb +++ b/vendor/plugins/rack/spec/spec_head.rb @@ -1,7 +1,7 @@ require 'rack/head' require 'rack/mock' -context "Rack::Head" do +describe Rack::Head do def test_response(headers = {}) app = lambda { |env| [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]] } request = Rack::MockRequest.env_for("/", headers) @@ -10,7 +10,7 @@ context "Rack::Head" do return response end - specify "passes GET, POST, PUT, DELETE, OPTIONS, TRACE requests" do + should "pass GET, POST, PUT, DELETE, OPTIONS, TRACE requests" do %w[GET POST PUT DELETE OPTIONS TRACE].each do |type| resp = test_response("REQUEST_METHOD" => type) @@ -20,7 +20,7 @@ context "Rack::Head" do end end - specify "removes body from HEAD requests" do + should "remove body from HEAD requests" do resp = test_response("REQUEST_METHOD" => "HEAD") resp[0].should.equal(200) diff --git a/vendor/plugins/rack/test/spec_rack_lint.rb b/vendor/plugins/rack/spec/spec_lint.rb similarity index 94% rename from vendor/plugins/rack/test/spec_rack_lint.rb rename to vendor/plugins/rack/spec/spec_lint.rb index bbf75c17..792670b0 100644 --- a/vendor/plugins/rack/test/spec_rack_lint.rb +++ b/vendor/plugins/rack/spec/spec_lint.rb @@ -1,15 +1,13 @@ -require 'test/spec' require 'stringio' - require 'rack/lint' require 'rack/mock' -context "Rack::Lint" do +describe Rack::Lint do def env(*args) Rack::MockRequest.env_for("/", *args) end - specify "passes valid request" do + should "pass valid request" do lambda { Rack::Lint.new(lambda { |env| [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]] @@ -17,12 +15,12 @@ context "Rack::Lint" do }.should.not.raise end - specify "notices fatal errors" do + should "notice fatal errors" do lambda { Rack::Lint.new(nil).call }.should.raise(Rack::Lint::LintError). message.should.match(/No env given/) end - specify "notices environment errors" do + should "notice environment errors" do lambda { Rack::Lint.new(nil).call 5 }.should.raise(Rack::Lint::LintError). message.should.match(/not a Hash/) @@ -110,7 +108,7 @@ context "Rack::Lint" do message.should.match(/cannot be .* make it ''/) end - specify "notices input errors" do + should "notice input errors" do lambda { Rack::Lint.new(nil).call(env("rack.input" => "")) }.should.raise(Rack::Lint::LintError). @@ -139,14 +137,14 @@ context "Rack::Lint" do message.should.match(/does not have ASCII-8BIT as its external encoding/) end - specify "notices error errors" do + should "notice error errors" do lambda { Rack::Lint.new(nil).call(env("rack.errors" => "")) }.should.raise(Rack::Lint::LintError). message.should.match(/does not respond to #puts/) end - specify "notices status errors" do + should "notice status errors" do lambda { Rack::Lint.new(lambda { |env| ["cc", {}, ""] @@ -162,7 +160,7 @@ context "Rack::Lint" do message.should.match(/must be >=100 seen as integer/) end - specify "notices header errors" do + should "notice header errors" do lambda { Rack::Lint.new(lambda { |env| [200, Object.new, []] @@ -235,7 +233,7 @@ context "Rack::Lint" do }.should.not.raise(Rack::Lint::LintError) end - specify "notices content-type errors" do + should "notice content-type errors" do lambda { Rack::Lint.new(lambda { |env| [200, {"Content-length" => "0"}, []] @@ -253,7 +251,7 @@ context "Rack::Lint" do end end - specify "notices content-length errors" do + should "notice content-length errors" do [100, 101, 204, 304].each do |status| lambda { Rack::Lint.new(lambda { |env| @@ -266,12 +264,12 @@ context "Rack::Lint" do lambda { Rack::Lint.new(lambda { |env| [200, {"Content-type" => "text/plain", "Content-Length" => "1"}, []] - }).call(env({})) + }).call(env({}))[2].each { } }.should.raise(Rack::Lint::LintError). message.should.match(/Content-Length header was 1, but should be 0/) end - specify "notices body errors" do + should "notice body errors" do lambda { status, header, body = Rack::Lint.new(lambda { |env| [200, {"Content-type" => "text/plain","Content-length" => "3"}, [1,2,3]] @@ -281,7 +279,7 @@ context "Rack::Lint" do message.should.match(/yielded non-string/) end - specify "notices input handling errors" do + should "notice input handling errors" do lambda { Rack::Lint.new(lambda { |env| env["rack.input"].gets("\r\n") @@ -425,7 +423,7 @@ context "Rack::Lint" do message.should.match(/close must not be called/) end - specify "notices error handling errors" do + should "notice error handling errors" do lambda { Rack::Lint.new(lambda { |env| env["rack.errors"].write(42) @@ -443,7 +441,7 @@ context "Rack::Lint" do message.should.match(/close must not be called/) end - specify "notices HEAD errors" do + should "notice HEAD errors" do lambda { Rack::Lint.new(lambda { |env| [200, {"Content-type" => "test/plain", "Content-length" => "3"}, []] @@ -453,12 +451,12 @@ context "Rack::Lint" do lambda { Rack::Lint.new(lambda { |env| [200, {"Content-type" => "test/plain", "Content-length" => "3"}, ["foo"]] - }).call(env({"REQUEST_METHOD" => "HEAD"})) + }).call(env({"REQUEST_METHOD" => "HEAD"}))[2].each { } }.should.raise(Rack::Lint::LintError). message.should.match(/body was given for HEAD/) end - specify "passes valid read calls" do + should "pass valid read calls" do hello_str = "hello world" hello_str.force_encoding("ASCII-8BIT") if hello_str.respond_to? :force_encoding lambda { @@ -505,19 +503,8 @@ context "Rack::Lint" do end end -context "Rack::Lint::InputWrapper" do - specify "delegates :size to underlying IO object" do - class IOMock - def size - 101 - end - end - - wrapper = Rack::Lint::InputWrapper.new(IOMock.new) - wrapper.size.should == 101 - end - - specify "delegates :rewind to underlying IO object" do +describe "Rack::Lint::InputWrapper" do + should "delegate :rewind to underlying IO object" do io = StringIO.new("123") wrapper = Rack::Lint::InputWrapper.new(io) wrapper.read.should.equal "123" diff --git a/vendor/plugins/rack/test/spec_rack_lobster.rb b/vendor/plugins/rack/spec/spec_lobster.rb similarity index 71% rename from vendor/plugins/rack/test/spec_rack_lobster.rb rename to vendor/plugins/rack/spec/spec_lobster.rb index 7be267a2..6a610409 100644 --- a/vendor/plugins/rack/test/spec_rack_lobster.rb +++ b/vendor/plugins/rack/spec/spec_lobster.rb @@ -1,29 +1,27 @@ -require 'test/spec' - require 'rack/lobster' require 'rack/mock' -context "Rack::Lobster::LambdaLobster" do - specify "should be a single lambda" do +describe Rack::Lobster::LambdaLobster do + should "be a single lambda" do Rack::Lobster::LambdaLobster.should.be.kind_of Proc end - - specify "should look like a lobster" do + + should "look like a lobster" do res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/") res.should.be.ok res.body.should.include "(,(,,(,,,(" res.body.should.include "?flip" end - specify "should be flippable" do + should "be flippable" do res = Rack::MockRequest.new(Rack::Lobster::LambdaLobster).get("/?flip") res.should.be.ok res.body.should.include "(,,,(,,(,(" end end -context "Rack::Lobster" do - specify "should look like a lobster" do +describe Rack::Lobster do + should "look like a lobster" do res = Rack::MockRequest.new(Rack::Lobster.new).get("/") res.should.be.ok res.body.should.include "(,(,,(,,,(" @@ -31,13 +29,13 @@ context "Rack::Lobster" do res.body.should.include "crash" end - specify "should be flippable" do + should "be flippable" do res = Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=left") res.should.be.ok res.body.should.include "(,,,(,,(,(" end - specify "should provide crashing for testing purposes" do + should "provide crashing for testing purposes" do lambda { Rack::MockRequest.new(Rack::Lobster.new).get("/?flip=crash") }.should.raise diff --git a/vendor/plugins/rack/test/spec_rack_lock.rb b/vendor/plugins/rack/spec/spec_lock.rb similarity index 53% rename from vendor/plugins/rack/test/spec_rack_lock.rb rename to vendor/plugins/rack/spec/spec_lock.rb index 18af2b23..3b3fd45e 100644 --- a/vendor/plugins/rack/test/spec_rack_lock.rb +++ b/vendor/plugins/rack/spec/spec_lock.rb @@ -1,37 +1,35 @@ -require 'test/spec' - -require 'rack/mock' require 'rack/lock' +require 'rack/mock' -context "Rack::Lock" do - class Lock - attr_reader :synchronized +class Lock + attr_reader :synchronized - def initialize - @synchronized = false - end - - def synchronize - @synchronized = true - yield - end + def initialize + @synchronized = false end - specify "should call synchronize on lock" do + def synchronize + @synchronized = true + yield + end +end + +describe Rack::Lock do + should "call synchronize on lock" do lock = Lock.new env = Rack::MockRequest.env_for("/") - app = Rack::Lock.new(lambda { |env| }, lock) + app = Rack::Lock.new(lambda { |inner_env| }, lock) lock.synchronized.should.equal false app.call(env) lock.synchronized.should.equal true end - specify "should set multithread flag to false" do + should "set multithread flag to false" do app = Rack::Lock.new(lambda { |env| env['rack.multithread'] }) app.call(Rack::MockRequest.env_for("/")).should.equal false end - specify "should reset original multithread flag when exiting lock" do + should "reset original multithread flag when exiting lock" do app = Rack::Lock.new(lambda { |env| env }) app.call(Rack::MockRequest.env_for("/"))['rack.multithread'].should.equal true end diff --git a/vendor/plugins/rack/test/spec_rack_logger.rb b/vendor/plugins/rack/spec/spec_logger.rb similarity index 54% rename from vendor/plugins/rack/test/spec_rack_logger.rb rename to vendor/plugins/rack/spec/spec_logger.rb index d55b9c77..f1952273 100644 --- a/vendor/plugins/rack/test/spec_rack_logger.rb +++ b/vendor/plugins/rack/spec/spec_logger.rb @@ -1,9 +1,8 @@ -require 'rack/logger' -require 'rack/lint' require 'stringio' +require 'rack/logger' -context "Rack::Logger" do - specify "logs to rack.errors" do +describe Rack::Logger do + should "log to rack.errors" do app = lambda { |env| log = env['rack.logger'] log.debug("Created logger") @@ -14,8 +13,8 @@ context "Rack::Logger" do } errors = StringIO.new - Rack::Logger.new(app).call({'rack.errors' => errors}) - errors.string.should.match "INFO -- : Program started" - errors.string.should.match "WARN -- : Nothing to do" + Rack::Logger.new(app).call('rack.errors' => errors) + errors.string.should.match(/INFO -- : Program started/) + errors.string.should.match(/WARN -- : Nothing to do/) end end diff --git a/vendor/plugins/rack/test/spec_rack_methodoverride.rb b/vendor/plugins/rack/spec/spec_methodoverride.rb similarity index 55% rename from vendor/plugins/rack/test/spec_rack_methodoverride.rb rename to vendor/plugins/rack/spec/spec_methodoverride.rb index 57452394..853991d9 100644 --- a/vendor/plugins/rack/test/spec_rack_methodoverride.rb +++ b/vendor/plugins/rack/spec/spec_methodoverride.rb @@ -1,58 +1,56 @@ -require 'test/spec' - -require 'rack/mock' -require 'rack/methodoverride' require 'stringio' +require 'rack/methodoverride' +require 'rack/mock' -context "Rack::MethodOverride" do - specify "should not affect GET requests" do +describe Rack::MethodOverride do + should "not affect GET requests" do env = Rack::MockRequest.env_for("/?_method=delete", :method => "GET") - app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) }) + app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) }) req = app.call(env) req.env["REQUEST_METHOD"].should.equal "GET" end - specify "_method parameter should modify REQUEST_METHOD for POST requests" do + should "modify REQUEST_METHOD for POST requests when _method parameter is set" do env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=put") - app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) }) + app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) }) req = app.call(env) req.env["REQUEST_METHOD"].should.equal "PUT" end - specify "X-HTTP-Method-Override header should modify REQUEST_METHOD for POST requests" do + should "modify REQUEST_METHOD for POST requests when X-HTTP-Method-Override is set" do env = Rack::MockRequest.env_for("/", :method => "POST", "HTTP_X_HTTP_METHOD_OVERRIDE" => "PUT" ) - app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) }) + app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) }) req = app.call(env) req.env["REQUEST_METHOD"].should.equal "PUT" end - specify "should not modify REQUEST_METHOD if the method is unknown" do + should "not modify REQUEST_METHOD if the method is unknown" do env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=foo") - app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) }) + app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) }) req = app.call(env) req.env["REQUEST_METHOD"].should.equal "POST" end - specify "should not modify REQUEST_METHOD when _method is nil" do + should "not modify REQUEST_METHOD when _method is nil" do env = Rack::MockRequest.env_for("/", :method => "POST", :input => "foo=bar") - app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) }) + app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) }) req = app.call(env) req.env["REQUEST_METHOD"].should.equal "POST" end - specify "should store the original REQUEST_METHOD prior to overriding" do + should "store the original REQUEST_METHOD prior to overriding" do env = Rack::MockRequest.env_for("/", :method => "POST", :input => "_method=options") - app = Rack::MethodOverride.new(lambda { |env| Rack::Request.new(env) }) + app = Rack::MethodOverride.new(lambda{|envx| Rack::Request.new(envx) }) req = app.call(env) req.env["rack.methodoverride.original_method"].should.equal "POST" diff --git a/vendor/plugins/rack/test/spec_rack_mock.rb b/vendor/plugins/rack/spec/spec_mock.rb similarity index 81% rename from vendor/plugins/rack/test/spec_rack_mock.rb rename to vendor/plugins/rack/spec/spec_mock.rb index a03bedc2..eaec655a 100644 --- a/vendor/plugins/rack/test/spec_rack_mock.rb +++ b/vendor/plugins/rack/spec/spec_mock.rb @@ -1,35 +1,33 @@ require 'yaml' require 'rack/mock' -require 'rack/request' -require 'rack/response' app = lambda { |env| req = Rack::Request.new(env) - + env["mock.postdata"] = env["rack.input"].read if req.GET["error"] env["rack.errors"].puts req.GET["error"] env["rack.errors"].flush end - + Rack::Response.new(env.to_yaml, req.GET["status"] || 200, "Content-Type" => "text/yaml").finish } -context "Rack::MockRequest" do - specify "should return a MockResponse" do +describe Rack::MockRequest do + should "return a MockResponse" do res = Rack::MockRequest.new(app).get("") res.should.be.kind_of Rack::MockResponse end - specify "should be able to only return the environment" do + should "be able to only return the environment" do env = Rack::MockRequest.env_for("") env.should.be.kind_of Hash env.should.include "rack.version" end - specify "should provide sensible defaults" do + should "provide sensible defaults" do res = Rack::MockRequest.new(app).request env = YAML.load(res.body) @@ -43,7 +41,7 @@ context "Rack::MockRequest" do env["mock.postdata"].should.be.empty end - specify "should allow GET/POST/PUT/DELETE" do + should "allow GET/POST/PUT/DELETE" do res = Rack::MockRequest.new(app).get("", :input => "foo") env = YAML.load(res.body) env["REQUEST_METHOD"].should.equal "GET" @@ -64,12 +62,12 @@ context "Rack::MockRequest" do should.equal "OPTIONS" end - specify "should set content length" do + should "set content length" do env = Rack::MockRequest.env_for("/", :input => "foo") env["CONTENT_LENGTH"].should.equal "3" end - specify "should allow posting" do + should "allow posting" do res = Rack::MockRequest.new(app).get("", :input => "foo") env = YAML.load(res.body) env["mock.postdata"].should.equal "foo" @@ -79,7 +77,7 @@ context "Rack::MockRequest" do env["mock.postdata"].should.equal "foo" end - specify "should use all parts of an URL" do + should "use all parts of an URL" do res = Rack::MockRequest.new(app). get("https://bla.example.org:9292/meh/foo?bar") res.should.be.kind_of Rack::MockResponse @@ -93,7 +91,7 @@ context "Rack::MockRequest" do env["rack.url_scheme"].should.equal "https" end - specify "should set SSL port and HTTP flag on when using https" do + should "set SSL port and HTTP flag on when using https" do res = Rack::MockRequest.new(app). get("https://example.org/foo") res.should.be.kind_of Rack::MockResponse @@ -108,7 +106,7 @@ context "Rack::MockRequest" do env["HTTPS"].should.equal "on" end - specify "should prepend slash to uri path" do + should "prepend slash to uri path" do res = Rack::MockRequest.new(app). get("foo") res.should.be.kind_of Rack::MockResponse @@ -122,33 +120,33 @@ context "Rack::MockRequest" do env["rack.url_scheme"].should.equal "http" end - specify "should properly convert method name to an uppercase string" do + should "properly convert method name to an uppercase string" do res = Rack::MockRequest.new(app).request(:get) env = YAML.load(res.body) env["REQUEST_METHOD"].should.equal "GET" end - specify "should accept params and build query string for GET requests" do + should "accept params and build query string for GET requests" do res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => {:foo => {:bar => "1"}}) env = YAML.load(res.body) env["REQUEST_METHOD"].should.equal "GET" - env["QUERY_STRING"].should.match "baz=2" - env["QUERY_STRING"].should.match "foo[bar]=1" + env["QUERY_STRING"].should.include "baz=2" + env["QUERY_STRING"].should.include "foo[bar]=1" env["PATH_INFO"].should.equal "/foo" env["mock.postdata"].should.equal "" end - specify "should accept raw input in params for GET requests" do + should "accept raw input in params for GET requests" do res = Rack::MockRequest.new(app).get("/foo?baz=2", :params => "foo[bar]=1") env = YAML.load(res.body) env["REQUEST_METHOD"].should.equal "GET" - env["QUERY_STRING"].should.match "baz=2" - env["QUERY_STRING"].should.match "foo[bar]=1" + env["QUERY_STRING"].should.include "baz=2" + env["QUERY_STRING"].should.include "foo[bar]=1" env["PATH_INFO"].should.equal "/foo" env["mock.postdata"].should.equal "" end - specify "should accept params and build url encoded params for POST requests" do + should "accept params and build url encoded params for POST requests" do res = Rack::MockRequest.new(app).post("/foo", :params => {:foo => {:bar => "1"}}) env = YAML.load(res.body) env["REQUEST_METHOD"].should.equal "POST" @@ -158,7 +156,7 @@ context "Rack::MockRequest" do env["mock.postdata"].should.equal "foo[bar]=1" end - specify "should accept raw input in params for POST requests" do + should "accept raw input in params for POST requests" do res = Rack::MockRequest.new(app).post("/foo", :params => "foo[bar]=1") env = YAML.load(res.body) env["REQUEST_METHOD"].should.equal "POST" @@ -168,7 +166,7 @@ context "Rack::MockRequest" do env["mock.postdata"].should.equal "foo[bar]=1" end - specify "should accept params and build multipart encoded params for POST requests" do + should "accept params and build multipart encoded params for POST requests" do files = Rack::Utils::Multipart::UploadedFile.new(File.join(File.dirname(__FILE__), "multipart", "file1.txt")) res = Rack::MockRequest.new(app).post("/foo", :params => { "submit-name" => "Larry", "files" => files }) env = YAML.load(res.body) @@ -179,7 +177,7 @@ context "Rack::MockRequest" do env["mock.postdata"].length.should.equal 206 end - specify "should behave valid according to the Rack spec" do + should "behave valid according to the Rack spec" do lambda { res = Rack::MockRequest.new(app). get("https://bla.example.org:9292/meh/foo?bar", :lint => true) @@ -187,8 +185,8 @@ context "Rack::MockRequest" do end end -context "Rack::MockResponse" do - specify "should provide access to the HTTP status" do +describe Rack::MockResponse do + should "provide access to the HTTP status" do res = Rack::MockRequest.new(app).get("") res.should.be.successful res.should.be.ok @@ -209,18 +207,18 @@ context "Rack::MockResponse" do res.should.be.empty end - specify "should provide access to the HTTP headers" do + should "provide access to the HTTP headers" do res = Rack::MockRequest.new(app).get("") res.should.include "Content-Type" res.headers["Content-Type"].should.equal "text/yaml" res.original_headers["Content-Type"].should.equal "text/yaml" res["Content-Type"].should.equal "text/yaml" res.content_type.should.equal "text/yaml" - res.content_length.should.be 414 # needs change often. + res.content_length.should.be > 0 res.location.should.be.nil end - specify "should provide access to the HTTP body" do + should "provide access to the HTTP body" do res = Rack::MockRequest.new(app).get("") res.body.should =~ /rack/ res.should =~ /rack/ @@ -228,14 +226,14 @@ context "Rack::MockResponse" do res.should.satisfy { |r| r.match(/rack/) } end - specify "should provide access to the Rack errors" do + should "provide access to the Rack errors" do res = Rack::MockRequest.new(app).get("/?error=foo", :lint => true) res.should.be.ok res.errors.should.not.be.empty res.errors.should.include "foo" end - specify "should optionally make Rack errors fatal" do + should "optionally make Rack errors fatal" do lambda { Rack::MockRequest.new(app).get("/?error=foo", :fatal => true) }.should.raise(Rack::MockRequest::FatalWarning) diff --git a/vendor/plugins/rack/test/spec_rack_mongrel.rb b/vendor/plugins/rack/spec/spec_mongrel.rb similarity index 69% rename from vendor/plugins/rack/test/spec_rack_mongrel.rb rename to vendor/plugins/rack/spec/spec_mongrel.rb index 4b386891..ac0e825a 100644 --- a/vendor/plugins/rack/test/spec_rack_mongrel.rb +++ b/vendor/plugins/rack/spec/spec_mongrel.rb @@ -1,37 +1,32 @@ -require 'test/spec' - begin +require 'rack' require 'rack/handler/mongrel' -require 'rack/urlmap' -require 'rack/lint' -require 'testrequest' +require File.expand_path('../testrequest', __FILE__) require 'timeout' Thread.abort_on_exception = true $tcp_defer_accept_opts = nil $tcp_cork_opts = nil -context "Rack::Handler::Mongrel" do - include TestRequest::Helpers +describe Rack::Handler::Mongrel do + extend TestRequest::Helpers - setup do - server = Mongrel::HttpServer.new(@host='0.0.0.0', @port=9201) - server.register('/test', - Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new))) - server.register('/stream', - Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest))) - @acc = server.run - end + @server = Mongrel::HttpServer.new(@host='0.0.0.0', @port=9201) + @server.register('/test', + Rack::Handler::Mongrel.new(Rack::Lint.new(TestRequest.new))) + @server.register('/stream', + Rack::Handler::Mongrel.new(Rack::Lint.new(StreamingRequest))) + @acc = @server.run - specify "should respond" do + should "respond" do lambda { GET("/test") }.should.not.raise end - specify "should be a Mongrel" do + should "be a Mongrel" do GET("/test") - status.should.be 200 + status.should.equal 200 response["SERVER_SOFTWARE"].should =~ /Mongrel/ response["HTTP_VERSION"].should.equal "HTTP/1.1" response["SERVER_PROTOCOL"].should.equal "HTTP/1.1" @@ -39,15 +34,15 @@ context "Rack::Handler::Mongrel" do response["SERVER_NAME"].should.equal "0.0.0.0" end - specify "should have rack headers" do + should "have rack headers" do GET("/test") response["rack.version"].should.equal [1,1] - response["rack.multithread"].should.be true - response["rack.multiprocess"].should.be false - response["rack.run_once"].should.be false + response["rack.multithread"].should.be.true + response["rack.multiprocess"].should.be.false + response["rack.run_once"].should.be.false end - specify "should have CGI headers on GET" do + should "have CGI headers on GET" do GET("/test") response["REQUEST_METHOD"].should.equal "GET" response["SCRIPT_NAME"].should.equal "/test" @@ -64,7 +59,7 @@ context "Rack::Handler::Mongrel" do response["QUERY_STRING"].should.equal "quux=1" end - specify "should have CGI headers on POST" do + should "have CGI headers on POST" do POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'}) status.should.equal 200 response["REQUEST_METHOD"].should.equal "POST" @@ -75,18 +70,18 @@ context "Rack::Handler::Mongrel" do response["test.postdata"].should.equal "rack-form-data=23" end - specify "should support HTTP auth" do + should "support HTTP auth" do GET("/test", {:user => "ruth", :passwd => "secret"}) response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ=" end - specify "should set status" do + should "set status" do GET("/test?secret") status.should.equal 403 response["rack.url_scheme"].should.equal "http" end - specify "should provide a .run" do + should "provide a .run" do block_ran = false Thread.new { Rack::Handler::Mongrel.run(lambda {}, {:Port => 9211}) { |server| @@ -95,16 +90,16 @@ context "Rack::Handler::Mongrel" do } } sleep 1 - block_ran.should.be true + block_ran.should.be.true end - specify "should provide a .run that maps a hash" do + should "provide a .run that maps a hash" do block_ran = false Thread.new { map = {'/'=>lambda{},'/foo'=>lambda{}} Rack::Handler::Mongrel.run(map, :map => true, :Port => 9221) { |server| server.should.be.kind_of Mongrel::HttpServer - server.classifier.uris.size.should.be 2 + server.classifier.uris.size.should.equal 2 server.classifier.uris.should.not.include '/arf' server.classifier.uris.should.include '/' server.classifier.uris.should.include '/foo' @@ -112,16 +107,16 @@ context "Rack::Handler::Mongrel" do } } sleep 1 - block_ran.should.be true + block_ran.should.be.true end - specify "should provide a .run that maps a urlmap" do + should "provide a .run that maps a urlmap" do block_ran = false Thread.new { map = Rack::URLMap.new({'/'=>lambda{},'/bar'=>lambda{}}) Rack::Handler::Mongrel.run(map, {:map => true, :Port => 9231}) { |server| server.should.be.kind_of Mongrel::HttpServer - server.classifier.uris.size.should.be 2 + server.classifier.uris.size.should.equal 2 server.classifier.uris.should.not.include '/arf' server.classifier.uris.should.include '/' server.classifier.uris.should.include '/bar' @@ -129,10 +124,10 @@ context "Rack::Handler::Mongrel" do } } sleep 1 - block_ran.should.be true + block_ran.should.be.true end - specify "should provide a .run that maps a urlmap restricting by host" do + should "provide a .run that maps a urlmap restricting by host" do block_ran = false Thread.new { map = Rack::URLMap.new({ @@ -148,22 +143,22 @@ context "Rack::Handler::Mongrel" do Rack::Handler::Mongrel.run(map, opt) { |server| server.should.be.kind_of Mongrel::HttpServer server.classifier.uris.should.include '/' - server.classifier.handler_map['/'].size.should.be 2 + server.classifier.handler_map['/'].size.should.equal 2 server.classifier.uris.should.include '/foo' - server.classifier.handler_map['/foo'].size.should.be 1 + server.classifier.handler_map['/foo'].size.should.equal 1 server.classifier.uris.should.include '/bar' - server.classifier.handler_map['/bar'].size.should.be 2 + server.classifier.handler_map['/bar'].size.should.equal 2 server.classifier.uris.should.not.include '/qux' server.classifier.uris.should.not.include '/arf' - server.classifier.uris.size.should.be 3 + server.classifier.uris.size.should.equal 3 block_ran = true } } sleep 1 - block_ran.should.be true + block_ran.should.be.true end - specify "should stream #each part of the response" do + should "stream #each part of the response" do body = '' begin Timeout.timeout(1) do @@ -179,11 +174,10 @@ context "Rack::Handler::Mongrel" do body.should.not.be.empty end - teardown do - @acc.raise Mongrel::StopServer - end + @acc.raise Mongrel::StopServer end -rescue LoadError - $stderr.puts "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again." +rescue LoadError => ex + warn ex + warn "Skipping Rack::Handler::Mongrel tests (Mongrel is required). `gem install mongrel` and try again." end diff --git a/vendor/plugins/rack/test/spec_rack_nulllogger.rb b/vendor/plugins/rack/spec/spec_nulllogger.rb similarity index 53% rename from vendor/plugins/rack/test/spec_rack_nulllogger.rb rename to vendor/plugins/rack/spec/spec_nulllogger.rb index b3c2bc9c..7c1968e5 100644 --- a/vendor/plugins/rack/test/spec_rack_nulllogger.rb +++ b/vendor/plugins/rack/spec/spec_nulllogger.rb @@ -1,13 +1,12 @@ require 'rack/nulllogger' -require 'rack/lint' -require 'rack/mock' -context "Rack::NullLogger" do - specify "acks as a nop logger" do +describe Rack::NullLogger do + should "act as a noop logger" do app = lambda { |env| env['rack.logger'].warn "b00m" [200, {'Content-Type' => 'text/plain'}, ["Hello, World!"]] } - Rack::NullLogger.new(app).call({}) + logger = Rack::NullLogger.new(app) + lambda{ logger.call({}) }.should.not.raise end end diff --git a/vendor/plugins/rack/test/spec_rack_recursive.rb b/vendor/plugins/rack/spec/spec_recursive.rb similarity index 55% rename from vendor/plugins/rack/test/spec_rack_recursive.rb rename to vendor/plugins/rack/spec/spec_recursive.rb index afc1a0d9..592b2631 100644 --- a/vendor/plugins/rack/test/spec_rack_recursive.rb +++ b/vendor/plugins/rack/spec/spec_recursive.rb @@ -1,53 +1,45 @@ -require 'test/spec' - require 'rack/recursive' -require 'rack/urlmap' -require 'rack/response' require 'rack/mock' -context "Rack::Recursive" do - setup do +describe Rack::Recursive do + @app1 = lambda { |env| + res = Rack::Response.new + res["X-Path-Info"] = env["PATH_INFO"] + res["X-Query-String"] = env["QUERY_STRING"] + res.finish do |inner_res| + inner_res.write "App1" + end + } - @app1 = lambda { |env| - res = Rack::Response.new - res["X-Path-Info"] = env["PATH_INFO"] - res["X-Query-String"] = env["QUERY_STRING"] - res.finish do |res| - res.write "App1" - end - } + @app2 = lambda { |env| + Rack::Response.new.finish do |res| + res.write "App2" + _, _, body = env['rack.recursive.include'].call(env, "/app1") + body.each { |b| + res.write b + } + end + } - @app2 = lambda { |env| - Rack::Response.new.finish do |res| - res.write "App2" - _, _, body = env['rack.recursive.include'].call(env, "/app1") - body.each { |b| - res.write b - } - end - } + @app3 = lambda { |env| + raise Rack::ForwardRequest.new("/app1") + } - @app3 = lambda { |env| - raise Rack::ForwardRequest.new("/app1") - } + @app4 = lambda { |env| + raise Rack::ForwardRequest.new("http://example.org/app1/quux?meh") + } - @app4 = lambda { |env| - raise Rack::ForwardRequest.new("http://example.org/app1/quux?meh") - } - - end - - specify "should allow for subrequests" do + should "allow for subrequests" do res = Rack::MockRequest.new(Rack::Recursive.new( Rack::URLMap.new("/app1" => @app1, "/app2" => @app2))). get("/app2") res.should.be.ok - res.body.should.equal "App2App1" + res.body.should.equal "App2App1" end - specify "should raise error on requests not below the app" do + should "raise error on requests not below the app" do app = Rack::URLMap.new("/app1" => @app1, "/app" => Rack::Recursive.new( Rack::URLMap.new("/1" => @app1, @@ -59,7 +51,7 @@ context "Rack::Recursive" do message.should =~ /can only include below/ end - specify "should support forwarding" do + should "support forwarding" do app = Rack::Recursive.new(Rack::URLMap.new("/app1" => @app1, "/app3" => @app3, "/app4" => @app4)) diff --git a/vendor/plugins/rack/test/spec_rack_request.rb b/vendor/plugins/rack/spec/spec_request.rb similarity index 83% rename from vendor/plugins/rack/test/spec_rack_request.rb rename to vendor/plugins/rack/spec/spec_request.rb index fcdeb484..914ce350 100644 --- a/vendor/plugins/rack/test/spec_rack_request.rb +++ b/vendor/plugins/rack/spec/spec_request.rb @@ -1,11 +1,10 @@ -require 'test/spec' require 'stringio' - +require 'cgi' require 'rack/request' require 'rack/mock' -context "Rack::Request" do - specify "wraps the rack variables" do +describe Rack::Request do + should "wrap the rack variables" do req = Rack::Request.new(Rack::MockRequest.env_for("http://example.com:8080/")) req.body.should.respond_to? :gets @@ -29,7 +28,7 @@ context "Rack::Request" do req.content_type.should.be.nil end - specify "can figure out the correct host" do + should "figure out the correct host" do req = Rack::Request.new \ Rack::MockRequest.env_for("/", "HTTP_HOST" => "www2.example.org") req.host.should.equal "www2.example.org" @@ -53,7 +52,7 @@ context "Rack::Request" do req.host.should.equal "" end - specify "can parse the query string" do + should "parse the query string" do req = Rack::Request.new(Rack::MockRequest.env_for("/?foo=bar&quux=bla")) req.query_string.should.equal "foo=bar&quux=bla" req.GET.should.equal "foo" => "bar", "quux" => "bla" @@ -61,12 +60,12 @@ context "Rack::Request" do req.params.should.equal "foo" => "bar", "quux" => "bla" end - specify "raises if rack.input is missing" do + should "raise if rack.input is missing" do req = Rack::Request.new({}) lambda { req.POST }.should.raise(RuntimeError) end - specify "can parse POST data when method is POST and no Content-Type given" do + should "parse POST data when method is POST and no Content-Type given" do req = Rack::Request.new \ Rack::MockRequest.env_for("/?foo=quux", "REQUEST_METHOD" => 'POST', @@ -79,7 +78,7 @@ context "Rack::Request" do req.params.should.equal "foo" => "bar", "quux" => "bla" end - specify "can parse POST data with explicit content type regardless of method" do + should "parse POST data with explicit content type regardless of method" do req = Rack::Request.new \ Rack::MockRequest.env_for("/", "CONTENT_TYPE" => 'application/x-www-form-urlencoded;foo=bar', @@ -91,7 +90,7 @@ context "Rack::Request" do req.params.should.equal "foo" => "bar", "quux" => "bla" end - specify "does not parse POST data when media type is not form-data" do + should "not parse POST data when media type is not form-data" do req = Rack::Request.new \ Rack::MockRequest.env_for("/?foo=quux", "REQUEST_METHOD" => 'POST', @@ -105,7 +104,7 @@ context "Rack::Request" do req.body.read.should.equal "foo=bar&quux=bla" end - specify "can parse POST data on PUT when media type is form-data" do + should "parse POST data on PUT when media type is form-data" do req = Rack::Request.new \ Rack::MockRequest.env_for("/?foo=quux", "REQUEST_METHOD" => 'PUT', @@ -115,7 +114,7 @@ context "Rack::Request" do req.body.read.should.equal "foo=bar&quux=bla" end - specify "rewinds input after parsing POST data" do + should "rewind input after parsing POST data" do input = StringIO.new("foo=bar&quux=bla") req = Rack::Request.new \ Rack::MockRequest.env_for("/", @@ -125,21 +124,21 @@ context "Rack::Request" do input.read.should.equal "foo=bar&quux=bla" end - specify "cleans up Safari's ajax POST body" do + should "clean up Safari's ajax POST body" do req = Rack::Request.new \ Rack::MockRequest.env_for("/", 'REQUEST_METHOD' => 'POST', :input => "foo=bar&quux=bla\0") req.POST.should.equal "foo" => "bar", "quux" => "bla" end - specify "can get value by key from params with #[]" do + should "get value by key from params with #[]" do req = Rack::Request.new \ Rack::MockRequest.env_for("?foo=quux") req['foo'].should.equal 'quux' req[:foo].should.equal 'quux' end - specify "can set value to key on params with #[]=" do + should "set value to key on params with #[]=" do req = Rack::Request.new \ Rack::MockRequest.env_for("?foo=duh") req['foo'].should.equal 'duh' @@ -157,7 +156,7 @@ context "Rack::Request" do req[:foo].should.equal 'jaz' end - specify "values_at answers values by keys in order given" do + should "return values for the keys in the order given from values_at" do req = Rack::Request.new \ Rack::MockRequest.env_for("?foo=baz&wun=der&bar=ful") req.values_at('foo').should.equal ['baz'] @@ -165,7 +164,7 @@ context "Rack::Request" do req.values_at('bar', 'foo', 'wun').should.equal ['ful', 'baz', 'der'] end - specify "referrer should be extracted correct" do + should "extract referrer correctly" do req = Rack::Request.new \ Rack::MockRequest.env_for("/", "HTTP_REFERER" => "/some/path") req.referer.should.equal "/some/path" @@ -175,7 +174,7 @@ context "Rack::Request" do req.referer.should.equal "/" end - specify "user agent should be extracted correct" do + should "extract user agent correctly" do req = Rack::Request.new \ Rack::MockRequest.env_for("/", "HTTP_USER_AGENT" => "Mozilla/4.0 (compatible)") req.user_agent.should.equal "Mozilla/4.0 (compatible)" @@ -185,7 +184,7 @@ context "Rack::Request" do req.user_agent.should.equal nil end - specify "can cache, but invalidates the cache" do + should "cache, but invalidates the cache" do req = Rack::Request.new \ Rack::MockRequest.env_for("/?foo=quux", "CONTENT_TYPE" => "application/x-www-form-urlencoded", @@ -203,7 +202,7 @@ context "Rack::Request" do req.POST.should.equal "foo" => "bla", "quux" => "bar" end - specify "can figure out if called via XHR" do + should "figure out if called via XHR" do req = Rack::Request.new(Rack::MockRequest.env_for("")) req.should.not.be.xhr @@ -212,7 +211,7 @@ context "Rack::Request" do req.should.be.xhr end - specify "can parse cookies" do + should "parse cookies" do req = Rack::Request.new \ Rack::MockRequest.env_for("", "HTTP_COOKIE" => "foo=bar;quux=h&m") req.cookies.should.equal "foo" => "bar", "quux" => "h&m" @@ -221,13 +220,13 @@ context "Rack::Request" do req.cookies.should.equal({}) end - specify "parses cookies according to RFC 2109" do + should "parse cookies according to RFC 2109" do req = Rack::Request.new \ Rack::MockRequest.env_for('', 'HTTP_COOKIE' => 'foo=bar;foo=car') req.cookies.should.equal 'foo' => 'bar' end - specify "provides setters" do + should "provide setters" do req = Rack::Request.new(e=Rack::MockRequest.env_for("")) req.script_name.should.equal "" req.script_name = "/foo" @@ -240,12 +239,12 @@ context "Rack::Request" do e["PATH_INFO"].should.equal "/foo" end - specify "provides the original env" do - req = Rack::Request.new(e=Rack::MockRequest.env_for("")) - req.env.should.be e + should "provide the original env" do + req = Rack::Request.new(e = Rack::MockRequest.env_for("")) + req.env.should == e end - specify "can restore the URL" do + should "restore the URL" do Rack::Request.new(Rack::MockRequest.env_for("")).url. should.equal "http://example.org/" Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).url. @@ -263,7 +262,7 @@ context "Rack::Request" do should.equal "https://example.com:8080/foo?foo" end - specify "can restore the full path" do + should "restore the full path" do Rack::Request.new(Rack::MockRequest.env_for("")).fullpath. should.equal "/" Rack::Request.new(Rack::MockRequest.env_for("", "SCRIPT_NAME" => "/foo")).fullpath. @@ -281,7 +280,7 @@ context "Rack::Request" do should.equal "/foo?foo" end - specify "can handle multiple media type parameters" do + should "handle multiple media type parameters" do req = Rack::Request.new \ Rack::MockRequest.env_for("/", "CONTENT_TYPE" => 'text/plain; foo=BAR,baz=bizzle dizzle;BLING=bam') @@ -295,7 +294,7 @@ context "Rack::Request" do req.media_type_params['bling'].should.equal 'bam' end - specify "can parse multipart form data" do + should "parse multipart form data" do # Adapted from RFC 1867. input = < "multipart/form-data, boundary=AaB03x", + "CONTENT_LENGTH" => input.size, + :input => input) + + lambda{req.POST}.should.not.raise(EOFError) + req.POST["fileupload"][:tempfile].size.should.equal 4 + ensure + $KCODE = original_kcode + end + else # >= 1.9 + input = < input.size, :input => rack_input) - lambda {req.POST}.should.not.raise - lambda {req.POST}.should.blaming("input re-processed!").not.raise + lambda{ req.POST }.should.not.raise + lambda{ req.POST }.should.not.raise("input re-processed!") end - specify "does conform to the Rack spec" do + should "conform to the Rack spec" do app = lambda { |env| content = Rack::Request.new(env).POST["file"].inspect size = content.respond_to?(:bytesize) ? content.bytesize : content.size @@ -472,7 +489,7 @@ EOF res.should.be.ok end - specify "should parse Accept-Encoding correctly" do + should "parse Accept-Encoding correctly" do parser = lambda do |x| Rack::Request.new(Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => x)).accept_encoding end @@ -488,7 +505,7 @@ EOF lambda { parser.call("gzip ; q=1.0") }.should.raise(RuntimeError) end - specify 'should provide ip information' do + should 'provide ip information' do app = lambda { |env| request = Rack::Request.new(env) response = Rack::Response.new @@ -510,7 +527,13 @@ EOF 'REMOTE_ADDR' => '123.123.123.123', 'HTTP_X_FORWARDED_FOR' => '234.234.234.234,212.212.212.212' - res.body.should.equal '212.212.212.212' + res.body.should.equal '234.234.234.234' + + res = mock.get '/', + 'REMOTE_ADDR' => '123.123.123.123', + 'HTTP_X_FORWARDED_FOR' => 'unknown,234.234.234.234,212.212.212.212' + + res.body.should.equal '234.234.234.234' end class MyRequest < Rack::Request @@ -519,7 +542,7 @@ EOF end end - specify "should allow subclass request to be instantiated after parent request" do + should "allow subclass request to be instantiated after parent request" do env = Rack::MockRequest.env_for("/?foo=bar") req1 = Rack::Request.new(env) @@ -531,7 +554,7 @@ EOF req2.params.should.equal :foo => "bar" end - specify "should allow parent request to be instantiated after subclass request" do + should "allow parent request to be instantiated after subclass request" do env = Rack::MockRequest.env_for("/?foo=bar") req1 = MyRequest.new(env) @@ -542,4 +565,16 @@ EOF req2.GET.should.equal "foo" => "bar" req2.params.should.equal "foo" => "bar" end + + (0x20...0x7E).collect { |a| + b = a.chr + c = CGI.escape(b) + should "not strip '#{a}' => '#{c}' => '#{b}' escaped character from parameters when accessed as string" do + url = "/?foo=#{c}bar#{c}" + env = Rack::MockRequest.env_for(url) + req2 = Rack::Request.new(env) + req2.GET.should.equal "foo" => "#{b}bar#{b}" + req2.params.should.equal "foo" => "#{b}bar#{b}" + end + } end diff --git a/vendor/plugins/rack/test/spec_rack_response.rb b/vendor/plugins/rack/spec/spec_response.rb similarity index 69% rename from vendor/plugins/rack/test/spec_rack_response.rb rename to vendor/plugins/rack/spec/spec_response.rb index 7989013d..28121130 100644 --- a/vendor/plugins/rack/test/spec_rack_response.rb +++ b/vendor/plugins/rack/spec/spec_response.rb @@ -1,10 +1,8 @@ -require 'test/spec' require 'set' - require 'rack/response' -context "Rack::Response" do - specify "has sensible default values" do +describe Rack::Response do + should "have sensible default values" do response = Rack::Response.new status, header, body = response.finish status.should.equal 200 @@ -22,7 +20,7 @@ context "Rack::Response" do } end - specify "can be written to" do + it "can be written to" do response = Rack::Response.new status, header, body = response.finish do @@ -30,61 +28,82 @@ context "Rack::Response" do response.write "bar" response.write "baz" end - + parts = [] body.each { |part| parts << part } - + parts.should.equal ["foo", "bar", "baz"] end - specify "can set and read headers" do + it "can set and read headers" do response = Rack::Response.new response["Content-Type"].should.equal "text/html" response["Content-Type"] = "text/plain" response["Content-Type"].should.equal "text/plain" end - specify "can set cookies" do + it "can set cookies" do response = Rack::Response.new - + response.set_cookie "foo", "bar" response["Set-Cookie"].should.equal "foo=bar" response.set_cookie "foo2", "bar2" - response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2"] + response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2"].join("\n") response.set_cookie "foo3", "bar3" - response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"] + response["Set-Cookie"].should.equal ["foo=bar", "foo2=bar2", "foo3=bar3"].join("\n") end - specify "formats the Cookie expiration date accordingly to RFC 2109" do + it "can set cookies with the same name for multiple domains" do response = Rack::Response.new - + response.set_cookie "foo", {:value => "bar", :domain => "sample.example.com"} + response.set_cookie "foo", {:value => "bar", :domain => ".example.com"} + response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=bar; domain=.example.com"].join("\n") + end + + it "formats the Cookie expiration date accordingly to RFC 2109" do + response = Rack::Response.new + response.set_cookie "foo", {:value => "bar", :expires => Time.now+10} response["Set-Cookie"].should.match( /expires=..., \d\d-...-\d\d\d\d \d\d:\d\d:\d\d .../) end - specify "can set secure cookies" do + it "can set secure cookies" do response = Rack::Response.new response.set_cookie "foo", {:value => "bar", :secure => true} response["Set-Cookie"].should.equal "foo=bar; secure" end - specify "can set http only cookies" do + it "can set http only cookies" do response = Rack::Response.new response.set_cookie "foo", {:value => "bar", :httponly => true} response["Set-Cookie"].should.equal "foo=bar; HttpOnly" end - specify "can delete cookies" do + it "can delete cookies" do response = Rack::Response.new response.set_cookie "foo", "bar" response.set_cookie "foo2", "bar2" response.delete_cookie "foo" - response["Set-Cookie"].should.equal ["foo2=bar2", - "foo=; expires=Thu, 01-Jan-1970 00:00:00 GMT"] + response["Set-Cookie"].should.equal [ + "foo2=bar2", + "foo=; expires=Thu, 01-Jan-1970 00:00:00 GMT" + ].join("\n") end - specify "can do redirects" do + it "can delete cookies with the same name from multiple domains" do + response = Rack::Response.new + response.set_cookie "foo", {:value => "bar", :domain => "sample.example.com"} + response.set_cookie "foo", {:value => "bar", :domain => ".example.com"} + response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=bar; domain=.example.com"].join("\n") + response.delete_cookie "foo", :domain => ".example.com" + response["Set-Cookie"].should.equal ["foo=bar; domain=sample.example.com", "foo=; domain=.example.com; expires=Thu, 01-Jan-1970 00:00:00 GMT"].join("\n") + response.delete_cookie "foo", :domain => "sample.example.com" + response["Set-Cookie"].should.equal ["foo=; domain=.example.com; expires=Thu, 01-Jan-1970 00:00:00 GMT", + "foo=; domain=sample.example.com; expires=Thu, 01-Jan-1970 00:00:00 GMT"].join("\n") + end + + it "can do redirects" do response = Rack::Response.new response.redirect "/foo" status, header, body = response.finish @@ -99,7 +118,7 @@ context "Rack::Response" do status.should.equal 307 end - specify "has a useful constructor" do + it "has a useful constructor" do r = Rack::Response.new("foo") status, header, body = r.finish str = ""; body.each { |part| str << part } @@ -123,7 +142,7 @@ context "Rack::Response" do r.status.should.equal 200 end - specify "has a constructor that can take a block" do + it "has a constructor that can take a block" do r = Rack::Response.new { |res| res.status = 404 res.write "foo" @@ -133,8 +152,8 @@ context "Rack::Response" do str.should.equal "foo" status.should.equal 404 end - - specify "doesn't return invalid responses" do + + it "doesn't return invalid responses" do r = Rack::Response.new(["foo", "bar"], 204) status, header, body = r.finish str = ""; body.each { |part| str << part } @@ -147,7 +166,7 @@ context "Rack::Response" do message.should =~ /stringable or iterable required/ end - specify "knows if it's empty" do + it "knows if it's empty" do r = Rack::Response.new r.should.be.empty r.write "foo" @@ -164,7 +183,7 @@ context "Rack::Response" do r.should.not.be.empty end - specify "should provide access to the HTTP status" do + should "provide access to the HTTP status" do res = Rack::Response.new res.status = 200 res.should.be.successful @@ -183,7 +202,7 @@ context "Rack::Response" do res.should.be.redirect end - specify "should provide access to the HTTP headers" do + should "provide access to the HTTP headers" do res = Rack::Response.new res["Content-Type"] = "text/yaml" @@ -195,7 +214,7 @@ context "Rack::Response" do res.location.should.be.nil end - specify "does not add or change Content-Length when #finish()ing" do + it "does not add or change Content-Length when #finish()ing" do res = Rack::Response.new res.status = 200 res.finish @@ -208,7 +227,7 @@ context "Rack::Response" do res.headers["Content-Length"].should.equal "10" end - specify "updates Content-Length when body appended to using #write" do + it "updates Content-Length when body appended to using #write" do res = Rack::Response.new res.status = 200 res.headers["Content-Length"].should.be.nil diff --git a/vendor/plugins/rack/spec/spec_rewindable_input.rb b/vendor/plugins/rack/spec/spec_rewindable_input.rb new file mode 100644 index 00000000..025d830d --- /dev/null +++ b/vendor/plugins/rack/spec/spec_rewindable_input.rb @@ -0,0 +1,118 @@ +require 'stringio' +require 'rack/rewindable_input' + +shared "a rewindable IO object" do + before do + @rio = Rack::RewindableInput.new(@io) + end + + should "be able to handle to read()" do + @rio.read.should.equal "hello world" + end + + should "be able to handle to read(nil)" do + @rio.read(nil).should.equal "hello world" + end + + should "be able to handle to read(length)" do + @rio.read(1).should.equal "h" + end + + should "be able to handle to read(length, buffer)" do + buffer = "" + result = @rio.read(1, buffer) + result.should.equal "h" + result.object_id.should.equal buffer.object_id + end + + should "be able to handle to read(nil, buffer)" do + buffer = "" + result = @rio.read(nil, buffer) + result.should.equal "hello world" + result.object_id.should.equal buffer.object_id + end + + should "rewind to the beginning when #rewind is called" do + @rio.read(1) + @rio.rewind + @rio.read.should.equal "hello world" + end + + should "be able to handle gets" do + @rio.gets.should == "hello world" + end + + should "be able to handle each" do + array = [] + @rio.each do |data| + array << data + end + array.should.equal(["hello world"]) + end + + should "not buffer into a Tempfile if no data has been read yet" do + @rio.instance_variable_get(:@rewindable_io).should.be.nil + end + + should "buffer into a Tempfile when data has been consumed for the first time" do + @rio.read(1) + tempfile = @rio.instance_variable_get(:@rewindable_io) + tempfile.should.not.be.nil + @rio.read(1) + tempfile2 = @rio.instance_variable_get(:@rewindable_io) + tempfile2.path.should == tempfile.path + end + + should "close the underlying tempfile upon calling #close" do + @rio.read(1) + tempfile = @rio.instance_variable_get(:@rewindable_io) + @rio.close + tempfile.should.be.closed + end + + should "be possible to call #close when no data has been buffered yet" do + lambda{ @rio.close }.should.not.raise + end + + should "be possible to call #close multiple times" do + lambda{ + @rio.close + @rio.close + }.should.not.raise + end + + @rio.close + @rio = nil +end + +describe Rack::RewindableInput do + describe "given an IO object that is already rewindable" do + before do + @io = StringIO.new("hello world") + end + + behaves_like "a rewindable IO object" + end + + describe "given an IO object that is not rewindable" do + before do + @io = StringIO.new("hello world") + @io.instance_eval do + undef :rewind + end + end + + behaves_like "a rewindable IO object" + end + + describe "given an IO object whose rewind method raises Errno::ESPIPE" do + before do + @io = StringIO.new("hello world") + def @io.rewind + raise Errno::ESPIPE, "You can't rewind this!" + end + end + + behaves_like "a rewindable IO object" + end +end diff --git a/vendor/plugins/rack/test/spec_rack_runtime.rb b/vendor/plugins/rack/spec/spec_runtime.rb similarity index 59% rename from vendor/plugins/rack/test/spec_rack_runtime.rb rename to vendor/plugins/rack/spec/spec_runtime.rb index 62d80956..547a32ec 100644 --- a/vendor/plugins/rack/test/spec_rack_runtime.rb +++ b/vendor/plugins/rack/spec/spec_runtime.rb @@ -1,31 +1,35 @@ -require 'test/spec' -require 'rack/mock' require 'rack/runtime' -context "Rack::Runtime" do - specify "sets X-Runtime is none is set" do +describe Rack::Runtime do + it "sets X-Runtime is none is set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] } response = Rack::Runtime.new(app).call({}) response[1]['X-Runtime'].should =~ /[\d\.]+/ end - specify "does not set the X-Runtime if it is already set" do + it "doesn't set the X-Runtime if it is already set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain', "X-Runtime" => "foobar"}, "Hello, World!"] } response = Rack::Runtime.new(app).call({}) response[1]['X-Runtime'].should == "foobar" end - specify "should allow a suffix to be set" do + should "allow a suffix to be set" do app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] } response = Rack::Runtime.new(app, "Test").call({}) response[1]['X-Runtime-Test'].should =~ /[\d\.]+/ end - specify "should allow multiple timers to be set" do - app = lambda { |env| [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] } - runtime1 = Rack::Runtime.new(app, "App") - runtime2 = Rack::Runtime.new(runtime1, "All") - response = runtime2.call({}) + should "allow multiple timers to be set" do + app = lambda { |env| sleep 0.1; [200, {'Content-Type' => 'text/plain'}, "Hello, World!"] } + runtime = Rack::Runtime.new(app, "App") + + # wrap many times to guarantee a measurable difference + 100.times do |i| + runtime = Rack::Runtime.new(runtime, i.to_s) + end + runtime = Rack::Runtime.new(runtime, "All") + + response = runtime.call({}) response[1]['X-Runtime-App'].should =~ /[\d\.]+/ response[1]['X-Runtime-All'].should =~ /[\d\.]+/ diff --git a/vendor/plugins/rack/test/spec_rack_sendfile.rb b/vendor/plugins/rack/spec/spec_sendfile.rb similarity index 76% rename from vendor/plugins/rack/test/spec_rack_sendfile.rb rename to vendor/plugins/rack/spec/spec_sendfile.rb index 8cfe2017..84517e7e 100644 --- a/vendor/plugins/rack/test/spec_rack_sendfile.rb +++ b/vendor/plugins/rack/spec/spec_sendfile.rb @@ -1,14 +1,13 @@ -require 'test/spec' -require 'rack/mock' require 'rack/sendfile' +require 'rack/mock' -context "Rack::File" do - specify "should respond to #to_path" do +describe Rack::File do + should "respond to #to_path" do Rack::File.new(Dir.pwd).should.respond_to :to_path end end -context "Rack::Sendfile" do +describe Rack::Sendfile do def sendfile_body res = ['Hello World'] def res.to_path ; "/tmp/hello.txt" ; end @@ -23,15 +22,13 @@ context "Rack::Sendfile" do Rack::Sendfile.new(simple_app(body)) end - setup do - @request = Rack::MockRequest.new(sendfile_app) - end + @request = Rack::MockRequest.new(sendfile_app) def request(headers={}) yield @request.get('/', headers) end - specify "does nothing when no X-Sendfile-Type header present" do + it "does nothing when no X-Sendfile-Type header present" do request do |response| response.should.be.ok response.body.should.equal 'Hello World' @@ -39,7 +36,7 @@ context "Rack::Sendfile" do end end - specify "sets X-Sendfile response header and discards body" do + it "sets X-Sendfile response header and discards body" do request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response| response.should.be.ok response.body.should.be.empty @@ -47,7 +44,7 @@ context "Rack::Sendfile" do end end - specify "sets X-Lighttpd-Send-File response header and discards body" do + it "sets X-Lighttpd-Send-File response header and discards body" do request 'HTTP_X_SENDFILE_TYPE' => 'X-Lighttpd-Send-File' do |response| response.should.be.ok response.body.should.be.empty @@ -55,7 +52,7 @@ context "Rack::Sendfile" do end end - specify "sets X-Accel-Redirect response header and discards body" do + it "sets X-Accel-Redirect response header and discards body" do headers = { 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect', 'HTTP_X_ACCEL_MAPPING' => '/tmp/=/foo/bar/' @@ -67,7 +64,7 @@ context "Rack::Sendfile" do end end - specify 'writes to rack.error when no X-Accel-Mapping is specified' do + it 'writes to rack.error when no X-Accel-Mapping is specified' do request 'HTTP_X_SENDFILE_TYPE' => 'X-Accel-Redirect' do |response| response.should.be.ok response.body.should.equal 'Hello World' @@ -76,7 +73,7 @@ context "Rack::Sendfile" do end end - specify 'does nothing when body does not respond to #to_path' do + it 'does nothing when body does not respond to #to_path' do @request = Rack::MockRequest.new(sendfile_app(['Not a file...'])) request 'HTTP_X_SENDFILE_TYPE' => 'X-Sendfile' do |response| response.body.should.equal 'Not a file...' diff --git a/vendor/plugins/rack/test/spec_rack_session_cookie.rb b/vendor/plugins/rack/spec/spec_session_cookie.rb similarity index 70% rename from vendor/plugins/rack/test/spec_rack_session_cookie.rb rename to vendor/plugins/rack/spec/spec_session_cookie.rb index 3be88b43..fda40cc4 100644 --- a/vendor/plugins/rack/test/spec_rack_session_cookie.rb +++ b/vendor/plugins/rack/spec/spec_session_cookie.rb @@ -1,23 +1,20 @@ -require 'test/spec' - require 'rack/session/cookie' require 'rack/mock' -require 'rack/response' -context "Rack::Session::Cookie" do - incrementor = lambda { |env| +describe Rack::Session::Cookie do + incrementor = lambda do |env| env["rack.session"]["counter"] ||= 0 env["rack.session"]["counter"] += 1 Rack::Response.new(env["rack.session"].inspect).to_a - } + end - specify "creates a new cookie" do + it "creates a new cookie" do res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor)).get("/") - res["Set-Cookie"].should.match("rack.session=") + res["Set-Cookie"].should.include("rack.session=") res.body.should.equal '{"counter"=>1}' end - specify "loads from a cookie" do + it "loads from a cookie" do res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor)).get("/") cookie = res["Set-Cookie"] res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor)). @@ -29,34 +26,25 @@ context "Rack::Session::Cookie" do res.body.should.equal '{"counter"=>3}' end - specify "survives broken cookies" do + it "survives broken cookies" do res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor)). get("/", "HTTP_COOKIE" => "rack.session=blarghfasel") res.body.should.equal '{"counter"=>1}' end - bigcookie = lambda { |env| + bigcookie = lambda do |env| env["rack.session"]["cookie"] = "big" * 3000 Rack::Response.new(env["rack.session"].inspect).to_a - } + end - specify "barks on too big cookies" do - lambda { + it "barks on too big cookies" do + lambda{ Rack::MockRequest.new(Rack::Session::Cookie.new(bigcookie)). get("/", :fatal => true) }.should.raise(Rack::MockRequest::FatalWarning) end - - specify "creates a new cookie with integrity hash" do - res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor, :secret => 'test')).get("/") - if RUBY_VERSION < "1.9" - res["Set-Cookie"].should.match("rack.session=BAh7BiIMY291bnRlcmkG%0A--1439b4d37b9d4b04c603848382f712d6fcd31088") - else - res["Set-Cookie"].should.match("rack.session=BAh7BkkiDGNvdW50ZXIGOg1lbmNvZGluZyINVVMtQVNDSUlpBg%3D%3D%0A--d7a6637b94d2728194a96c18484e1f7ed9074a83") - end - end - - specify "loads from a cookie wih integrity hash" do + + it "loads from a cookie wih integrity hash" do res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor, :secret => 'test')).get("/") cookie = res["Set-Cookie"] res = Rack::MockRequest.new(Rack::Session::Cookie.new(incrementor, :secret => 'test')). @@ -67,15 +55,15 @@ context "Rack::Session::Cookie" do get("/", "HTTP_COOKIE" => cookie) res.body.should.equal '{"counter"=>3}' end - - specify "ignores tampered with session cookies" do + + it "ignores tampered with session cookies" do app = Rack::Session::Cookie.new(incrementor, :secret => 'test') response1 = Rack::MockRequest.new(app).get("/") _, digest = response1["Set-Cookie"].split("--") tampered_with_cookie = "hackerman-was-here" + "--" + digest response2 = Rack::MockRequest.new(app).get("/", "HTTP_COOKIE" => tampered_with_cookie) - + # The tampered-with cookie is ignored, so we get back an identical Set-Cookie response2["Set-Cookie"].should.equal(response1["Set-Cookie"]) end diff --git a/vendor/plugins/rack/test/spec_rack_session_memcache.rb b/vendor/plugins/rack/spec/spec_session_memcache.rb similarity index 86% rename from vendor/plugins/rack/test/spec_rack_session_memcache.rb rename to vendor/plugins/rack/spec/spec_session_memcache.rb index faac796e..eb2c5a39 100644 --- a/vendor/plugins/rack/test/spec_rack_session_memcache.rb +++ b/vendor/plugins/rack/spec/spec_session_memcache.rb @@ -1,12 +1,9 @@ -require 'test/spec' - begin require 'rack/session/memcache' require 'rack/mock' - require 'rack/response' require 'thread' - context "Rack::Session::Memcache" do + describe Rack::Session::Memcache do session_key = Rack::Session::Memcache::DEFAULT_OPTIONS[:key] session_match = /#{session_key}=([0-9a-fA-F]+);/ incrementor = lambda do |env| @@ -27,30 +24,36 @@ begin incrementor.call(env) end - specify "faults on no connection" do + it "faults on no connection" do if RUBY_VERSION < "1.9" - lambda do - Rack::Session::Memcache.new incrementor, :memcache_server => 'nosuchserver' - end.should.raise + lambda{ + Rack::Session::Memcache.new(incrementor, :memcache_server => 'nosuchserver') + }.should.raise else - lambda do - Rack::Session::Memcache.new incrementor, :memcache_server => 'nosuchserver' - end.should.raise ArgumentError + lambda{ + Rack::Session::Memcache.new(incrementor, :memcache_server => 'nosuchserver') + }.should.raise ArgumentError end end - specify "connect to existing server" do - test_pool = MemCache.new incrementor, :namespace => 'test:rack:session' + it "connects to existing server" do + test_pool = MemCache.new(incrementor, :namespace => 'test:rack:session') + test_pool.namespace.should.equal 'test:rack:session' end - specify "creates a new cookie" do + it "passes options to MemCache" do + pool = Rack::Session::Memcache.new(incrementor, :namespace => 'test:rack:session') + pool.pool.namespace.should.equal 'test:rack:session' + end + + it "creates a new cookie" do pool = Rack::Session::Memcache.new(incrementor) res = Rack::MockRequest.new(pool).get("/") - res["Set-Cookie"].should.match("#{session_key}=") + res["Set-Cookie"].should.include("#{session_key}=") res.body.should.equal '{"counter"=>1}' end - specify "determines session from a cookie" do + it "determines session from a cookie" do pool = Rack::Session::Memcache.new(incrementor) req = Rack::MockRequest.new(pool) res = req.get("/") @@ -61,7 +64,7 @@ begin body.should.equal '{"counter"=>3}' end - specify "survives nonexistant cookies" do + it "survives nonexistant cookies" do bad_cookie = "rack.session=blarghfasel" pool = Rack::Session::Memcache.new(incrementor) res = Rack::MockRequest.new(pool). @@ -71,7 +74,7 @@ begin cookie.should.not.match(/#{bad_cookie}/) end - specify "maintains freshness" do + it "maintains freshness" do pool = Rack::Session::Memcache.new(incrementor, :expire_after => 3) res = Rack::MockRequest.new(pool).get('/') res.body.should.include '"counter"=>1' @@ -86,7 +89,7 @@ begin res.body.should.include '"counter"=>1' end - specify "deletes cookies with :drop option" do + it "deletes cookies with :drop option" do pool = Rack::Session::Memcache.new(incrementor) req = Rack::MockRequest.new(pool) drop = Rack::Utils::Context.new(pool, drop_session) @@ -109,7 +112,7 @@ begin res3.body.should.equal '{"counter"=>1}' end - specify "provides new session id with :renew option" do + it "provides new session id with :renew option" do pool = Rack::Session::Memcache.new(incrementor) req = Rack::MockRequest.new(pool) renew = Rack::Utils::Context.new(pool, renew_session) @@ -134,7 +137,7 @@ begin res3.body.should.equal '{"counter"=>4}' end - specify "omits cookie with :defer option" do + it "omits cookie with :defer option" do pool = Rack::Session::Memcache.new(incrementor) req = Rack::MockRequest.new(pool) defer = Rack::Utils::Context.new(pool, defer_session) @@ -157,7 +160,7 @@ begin res3.body.should.equal '{"counter"=>4}' end - specify "deep hashes are correctly updated" do + it "updates deep hashes correctly" do store = nil hash_check = proc do |env| session = env['rack.session'] @@ -183,8 +186,11 @@ begin end # anyone know how to do this better? - specify "multithread: should cleanly merge sessions" do - next unless $DEBUG + it "cleanly merges sessions when multithreaded" do + unless $DEBUG + 1.should.equal 1 # fake assertion to appease the mighty bacon + next + end warn 'Running multithread test for Session::Memcache' pool = Rack::Session::Memcache.new(incrementor) req = Rack::MockRequest.new(pool) @@ -215,8 +221,8 @@ begin end session = pool.pool.get(session_id) - session.size.should.be tnum+1 # counter - session['counter'].should.be 2 # meeeh + session.size.should.equal tnum+1 # counter + session['counter'].should.equal 2 # meeeh tnum = rand(7).to_i+5 r = Array.new(tnum) do |i| diff --git a/vendor/plugins/rack/test/spec_rack_session_pool.rb b/vendor/plugins/rack/spec/spec_session_pool.rb similarity index 82% rename from vendor/plugins/rack/test/spec_rack_session_pool.rb rename to vendor/plugins/rack/spec/spec_session_pool.rb index 6be382ec..904b5f22 100644 --- a/vendor/plugins/rack/test/spec_rack_session_pool.rb +++ b/vendor/plugins/rack/spec/spec_session_pool.rb @@ -1,39 +1,40 @@ -require 'test/spec' - -require 'rack/session/pool' -require 'rack/mock' -require 'rack/response' require 'thread' +require 'rack/mock' +require 'rack/session/pool' -context "Rack::Session::Pool" do +describe Rack::Session::Pool do session_key = Rack::Session::Pool::DEFAULT_OPTIONS[:key] session_match = /#{session_key}=[0-9a-fA-F]+;/ + incrementor = lambda do |env| env["rack.session"]["counter"] ||= 0 env["rack.session"]["counter"] += 1 Rack::Response.new(env["rack.session"].inspect).to_a end - drop_session = proc do |env| + + drop_session = lambda do |env| env['rack.session.options'][:drop] = true incrementor.call(env) end - renew_session = proc do |env| + + renew_session = lambda do |env| env['rack.session.options'][:renew] = true incrementor.call(env) end - defer_session = proc do |env| + + defer_session = lambda do |env| env['rack.session.options'][:defer] = true incrementor.call(env) end - specify "creates a new cookie" do + it "creates a new cookie" do pool = Rack::Session::Pool.new(incrementor) res = Rack::MockRequest.new(pool).get("/") res["Set-Cookie"].should.match session_match res.body.should.equal '{"counter"=>1}' end - specify "determines session from a cookie" do + it "determines session from a cookie" do pool = Rack::Session::Pool.new(incrementor) req = Rack::MockRequest.new(pool) cookie = req.get("/")["Set-Cookie"] @@ -43,14 +44,14 @@ context "Rack::Session::Pool" do body.should.equal '{"counter"=>3}' end - specify "survives nonexistant cookies" do + it "survives nonexistant cookies" do pool = Rack::Session::Pool.new(incrementor) res = Rack::MockRequest.new(pool). get("/", "HTTP_COOKIE" => "#{session_key}=blarghfasel") res.body.should.equal '{"counter"=>1}' end - specify "deletes cookies with :drop option" do + it "deletes cookies with :drop option" do pool = Rack::Session::Pool.new(incrementor) req = Rack::MockRequest.new(pool) drop = Rack::Utils::Context.new(pool, drop_session) @@ -59,25 +60,25 @@ context "Rack::Session::Pool" do res0 = req.get("/") session = (cookie = res0["Set-Cookie"])[session_match] res0.body.should.equal '{"counter"=>1}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res1 = req.get("/", "HTTP_COOKIE" => cookie) res1["Set-Cookie"][session_match].should.equal session res1.body.should.equal '{"counter"=>2}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res2 = dreq.get("/", "HTTP_COOKIE" => cookie) res2["Set-Cookie"].should.equal nil res2.body.should.equal '{"counter"=>3}' - pool.pool.size.should.be 0 + pool.pool.size.should.equal 0 res3 = req.get("/", "HTTP_COOKIE" => cookie) res3["Set-Cookie"][session_match].should.not.equal session res3.body.should.equal '{"counter"=>1}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 end - specify "provides new session id with :renew option" do + it "provides new session id with :renew option" do pool = Rack::Session::Pool.new(incrementor) req = Rack::MockRequest.new(pool) renew = Rack::Utils::Context.new(pool, renew_session) @@ -86,27 +87,27 @@ context "Rack::Session::Pool" do res0 = req.get("/") session = (cookie = res0["Set-Cookie"])[session_match] res0.body.should.equal '{"counter"=>1}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res1 = req.get("/", "HTTP_COOKIE" => cookie) res1["Set-Cookie"][session_match].should.equal session res1.body.should.equal '{"counter"=>2}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res2 = rreq.get("/", "HTTP_COOKIE" => cookie) new_cookie = res2["Set-Cookie"] new_session = new_cookie[session_match] new_session.should.not.equal session res2.body.should.equal '{"counter"=>3}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res3 = req.get("/", "HTTP_COOKIE" => new_cookie) res3["Set-Cookie"][session_match].should.equal new_session res3.body.should.equal '{"counter"=>4}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 end - specify "omits cookie with :defer option" do + it "omits cookie with :defer option" do pool = Rack::Session::Pool.new(incrementor) req = Rack::MockRequest.new(pool) defer = Rack::Utils::Context.new(pool, defer_session) @@ -115,27 +116,31 @@ context "Rack::Session::Pool" do res0 = req.get("/") session = (cookie = res0["Set-Cookie"])[session_match] res0.body.should.equal '{"counter"=>1}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res1 = req.get("/", "HTTP_COOKIE" => cookie) res1["Set-Cookie"][session_match].should.equal session res1.body.should.equal '{"counter"=>2}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res2 = dreq.get("/", "HTTP_COOKIE" => cookie) res2["Set-Cookie"].should.equal nil res2.body.should.equal '{"counter"=>3}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 res3 = req.get("/", "HTTP_COOKIE" => cookie) res3["Set-Cookie"][session_match].should.equal session res3.body.should.equal '{"counter"=>4}' - pool.pool.size.should.be 1 + pool.pool.size.should.equal 1 end # anyone know how to do this better? - specify "multithread: should merge sessions" do - next unless $DEBUG + it "should merge sessions when multithreaded" do + unless $DEBUG + 1.should.equal 1 + next + end + warn 'Running multithread tests for Session::Pool' pool = Rack::Session::Pool.new(incrementor) req = Rack::MockRequest.new(pool) @@ -166,7 +171,7 @@ context "Rack::Session::Pool" do end session = pool.pool[sess_id] - session.size.should.be tnum+1 # counter - session['counter'].should.be 2 # meeeh + session.size.should.equal tnum+1 # counter + session['counter'].should.equal 2 # meeeh end end diff --git a/vendor/plugins/rack/spec/spec_showexceptions.rb b/vendor/plugins/rack/spec/spec_showexceptions.rb new file mode 100644 index 00000000..82ac9184 --- /dev/null +++ b/vendor/plugins/rack/spec/spec_showexceptions.rb @@ -0,0 +1,23 @@ +require 'rack/showexceptions' +require 'rack/mock' + +describe Rack::ShowExceptions do + it "catches exceptions" do + res = nil + + req = Rack::MockRequest.new( + Rack::ShowExceptions.new( + lambda{|env| raise RuntimeError } + )) + + lambda{ + res = req.get("/") + }.should.not.raise + + res.should.be.a.server_error + res.status.should.equal 500 + + res.should =~ /RuntimeError/ + res.should =~ /ShowExceptions/ + end +end diff --git a/vendor/plugins/rack/spec/spec_showstatus.rb b/vendor/plugins/rack/spec/spec_showstatus.rb new file mode 100644 index 00000000..210a2f49 --- /dev/null +++ b/vendor/plugins/rack/spec/spec_showstatus.rb @@ -0,0 +1,79 @@ +require 'rack/showstatus' +require 'rack/mock' + +describe Rack::ShowStatus do + should "provide a default status message" do + req = Rack::MockRequest.new( + Rack::ShowStatus.new(lambda{|env| + [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []] + })) + + res = req.get("/", :lint => true) + res.should.be.not_found + res.should.be.not.empty + + res["Content-Type"].should.equal("text/html") + res.should =~ /404/ + res.should =~ /Not Found/ + end + + should "let the app provide additional information" do + req = Rack::MockRequest.new( + Rack::ShowStatus.new( + lambda{|env| + env["rack.showstatus.detail"] = "gone too meta." + [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []] + })) + + res = req.get("/", :lint => true) + res.should.be.not_found + res.should.be.not.empty + + res["Content-Type"].should.equal("text/html") + res.should =~ /404/ + res.should =~ /Not Found/ + res.should =~ /too meta/ + end + + should "not replace existing messages" do + req = Rack::MockRequest.new( + Rack::ShowStatus.new( + lambda{|env| + [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]] + })) + + res = req.get("/", :lint => true) + res.should.be.not_found + + res.body.should == "foo!" + end + + should "pass on original headers" do + headers = {"WWW-Authenticate" => "Basic blah"} + + req = Rack::MockRequest.new( + Rack::ShowStatus.new(lambda{|env| [401, headers, []] })) + res = req.get("/", :lint => true) + + res["WWW-Authenticate"].should.equal("Basic blah") + end + + should "replace existing messages if there is detail" do + req = Rack::MockRequest.new( + Rack::ShowStatus.new( + lambda{|env| + env["rack.showstatus.detail"] = "gone too meta." + [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]] + })) + + res = req.get("/", :lint => true) + res.should.be.not_found + res.should.be.not.empty + + res["Content-Type"].should.equal("text/html") + res["Content-Length"].should.not.equal("4") + res.should =~ /404/ + res.should =~ /too meta/ + res.body.should.not =~ /foo/ + end +end diff --git a/vendor/plugins/rack/test/spec_rack_static.rb b/vendor/plugins/rack/spec/spec_static.rb similarity index 62% rename from vendor/plugins/rack/test/spec_rack_static.rb rename to vendor/plugins/rack/spec/spec_static.rb index 19d2ecb7..fe03058d 100644 --- a/vendor/plugins/rack/test/spec_rack_static.rb +++ b/vendor/plugins/rack/spec/spec_static.rb @@ -1,5 +1,3 @@ -require 'test/spec' - require 'rack/static' require 'rack/mock' @@ -9,26 +7,24 @@ class DummyApp end end -context "Rack::Static" do +describe Rack::Static do root = File.expand_path(File.dirname(__FILE__)) OPTIONS = {:urls => ["/cgi"], :root => root} - setup do - @request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, OPTIONS)) - end + @request = Rack::MockRequest.new(Rack::Static.new(DummyApp.new, OPTIONS)) - specify "serves files" do + it "serves files" do res = @request.get("/cgi/test") res.should.be.ok res.body.should =~ /ruby/ end - specify "404s if url root is known but it can't find the file" do + it "404s if url root is known but it can't find the file" do res = @request.get("/cgi/foo") res.should.be.not_found end - specify "calls down the chain if url root is not known" do + it "calls down the chain if url root is not known" do res = @request.get("/something/else") res.should.be.ok res.body.should == "Hello World" diff --git a/vendor/plugins/rack/test/spec_rack_thin.rb b/vendor/plugins/rack/spec/spec_thin.rb similarity index 61% rename from vendor/plugins/rack/test/spec_rack_thin.rb rename to vendor/plugins/rack/spec/spec_thin.rb index 324f6498..94039647 100644 --- a/vendor/plugins/rack/test/spec_rack_thin.rb +++ b/vendor/plugins/rack/spec/spec_thin.rb @@ -1,34 +1,31 @@ -require 'test/spec' - begin require 'rack/handler/thin' -require 'testrequest' +require File.expand_path('../testrequest', __FILE__) require 'timeout' - -context "Rack::Handler::Thin" do - include TestRequest::Helpers - - setup do - @app = Rack::Lint.new(TestRequest.new) - @server = nil - Thin::Logging.silent = true - @thread = Thread.new do - Rack::Handler::Thin.run(@app, :Host => @host='0.0.0.0', :Port => @port=9204) do |server| - @server = server - end + +describe Rack::Handler::Thin do + extend TestRequest::Helpers + + @app = Rack::Lint.new(TestRequest.new) + @server = nil + Thin::Logging.silent = true + + @thread = Thread.new do + Rack::Handler::Thin.run(@app, :Host => @host='0.0.0.0', :Port => @port=9204) do |server| + @server = server end - Thread.pass until @server && @server.running? end - specify "should respond" do - lambda { - GET("/") - }.should.not.raise - end + Thread.pass until @server && @server.running? - specify "should be a Thin" do + should "respond" do GET("/") - status.should.be 200 + response.should.not.be.nil + end + + should "be a Thin" do + GET("/") + status.should.equal 200 response["SERVER_SOFTWARE"].should =~ /thin/ response["HTTP_VERSION"].should.equal "HTTP/1.1" response["SERVER_PROTOCOL"].should.equal "HTTP/1.1" @@ -36,15 +33,15 @@ context "Rack::Handler::Thin" do response["SERVER_NAME"].should.equal "0.0.0.0" end - specify "should have rack headers" do + should "have rack headers" do GET("/") - response["rack.version"].should.equal [0,3] - response["rack.multithread"].should.be false - response["rack.multiprocess"].should.be false - response["rack.run_once"].should.be false + response["rack.version"].should.equal [1,0] + response["rack.multithread"].should.equal false + response["rack.multiprocess"].should.equal false + response["rack.run_once"].should.equal false end - specify "should have CGI headers on GET" do + should "have CGI headers on GET" do GET("/") response["REQUEST_METHOD"].should.equal "GET" response["REQUEST_PATH"].should.equal "/" @@ -59,7 +56,7 @@ context "Rack::Handler::Thin" do response["QUERY_STRING"].should.equal "quux=1" end - specify "should have CGI headers on POST" do + should "have CGI headers on POST" do POST("/", {"rack-form-data" => "23"}, {'X-test-header' => '42'}) status.should.equal 200 response["REQUEST_METHOD"].should.equal "POST" @@ -69,21 +66,19 @@ context "Rack::Handler::Thin" do response["test.postdata"].should.equal "rack-form-data=23" end - specify "should support HTTP auth" do + should "support HTTP auth" do GET("/test", {:user => "ruth", :passwd => "secret"}) response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ=" end - specify "should set status" do + should "set status" do GET("/test?secret") status.should.equal 403 response["rack.url_scheme"].should.equal "http" end - teardown do - @server.stop! - @thread.kill - end + @server.stop! + @thread.kill end rescue LoadError diff --git a/vendor/plugins/rack/test/spec_rack_urlmap.rb b/vendor/plugins/rack/spec/spec_urlmap.rb similarity index 96% rename from vendor/plugins/rack/test/spec_rack_urlmap.rb rename to vendor/plugins/rack/spec/spec_urlmap.rb index 3d8fe605..fdaf129a 100644 --- a/vendor/plugins/rack/test/spec_rack_urlmap.rb +++ b/vendor/plugins/rack/spec/spec_urlmap.rb @@ -1,10 +1,8 @@ -require 'test/spec' - require 'rack/urlmap' require 'rack/mock' -context "Rack::URLMap" do - specify "dispatches paths correctly" do +describe Rack::URLMap do + it "dispatches paths correctly" do app = lambda { |env| [200, { 'X-ScriptName' => env['SCRIPT_NAME'], @@ -67,7 +65,7 @@ context "Rack::URLMap" do end - specify "dispatches hosts correctly" do + it "dispatches hosts correctly" do map = Rack::URLMap.new("http://foo.org/" => lambda { |env| [200, { "Content-Type" => "text/plain", @@ -125,7 +123,7 @@ context "Rack::URLMap" do res["X-Position"].should.equal "default.org" end - specify "should be nestable" do + should "be nestable" do map = Rack::URLMap.new("/foo" => Rack::URLMap.new("/bar" => Rack::URLMap.new("/quux" => lambda { |env| @@ -147,7 +145,7 @@ context "Rack::URLMap" do res["X-ScriptName"].should.equal "/foo/bar/quux" end - specify "should route root apps correctly" do + should "route root apps correctly" do map = Rack::URLMap.new("/" => lambda { |env| [200, { "Content-Type" => "text/plain", @@ -189,7 +187,7 @@ context "Rack::URLMap" do res["X-ScriptName"].should.equal "" end - specify "should not squeeze slashes" do + should "not squeeze slashes" do map = Rack::URLMap.new("/" => lambda { |env| [200, { "Content-Type" => "text/plain", diff --git a/vendor/plugins/rack/test/spec_rack_utils.rb b/vendor/plugins/rack/spec/spec_utils.rb similarity index 74% rename from vendor/plugins/rack/test/spec_rack_utils.rb rename to vendor/plugins/rack/spec/spec_utils.rb index 269a52bd..822058bb 100644 --- a/vendor/plugins/rack/test/spec_rack_utils.rb +++ b/vendor/plugins/rack/spec/spec_utils.rb @@ -1,18 +1,15 @@ -require 'test/spec' - require 'rack/utils' -require 'rack/lint' require 'rack/mock' -context "Rack::Utils" do - specify "should escape correctly" do +describe Rack::Utils do + should "escape correctly" do Rack::Utils.escape("fobar").should.equal "fo%3Co%3Ebar" Rack::Utils.escape("a space").should.equal "a+space" Rack::Utils.escape("q1!2\"'w$5&7/z8)?\\"). should.equal "q1%212%22%27w%245%267%2Fz8%29%3F%5C" end - specify "should escape correctly for multibyte characters" do + should "escape correctly for multibyte characters" do matz_name = "\xE3\x81\xBE\xE3\x81\xA4\xE3\x82\x82\xE3\x81\xA8".unpack("a*")[0] # Matsumoto matz_name.force_encoding("UTF-8") if matz_name.respond_to? :force_encoding Rack::Utils.escape(matz_name).should.equal '%E3%81%BE%E3%81%A4%E3%82%82%E3%81%A8' @@ -21,7 +18,7 @@ context "Rack::Utils" do Rack::Utils.escape(matz_name_sep).should.equal '%E3%81%BE%E3%81%A4+%E3%82%82%E3%81%A8' end - specify "should unescape correctly" do + should "unescape correctly" do Rack::Utils.unescape("fo%3Co%3Ebar").should.equal "fobar" Rack::Utils.unescape("a+space").should.equal "a space" Rack::Utils.unescape("a%20space").should.equal "a space" @@ -29,11 +26,11 @@ context "Rack::Utils" do should.equal "q1!2\"'w$5&7/z8)?\\" end - specify "should parse query strings correctly" do + should "parse query strings correctly" do Rack::Utils.parse_query("foo=bar"). should.equal "foo" => "bar" Rack::Utils.parse_query("foo=\"bar\""). - should.equal "foo" => "bar" + should.equal "foo" => "\"bar\"" Rack::Utils.parse_query("foo=bar&foo=quux"). should.equal "foo" => ["bar", "quux"] Rack::Utils.parse_query("foo=1&bar=2"). @@ -43,7 +40,7 @@ context "Rack::Utils" do Rack::Utils.parse_query("foo%3Dbaz=bar").should.equal "foo=baz" => "bar" end - specify "should parse nested query strings correctly" do + should "parse nested query strings correctly" do Rack::Utils.parse_nested_query("foo"). should.equal "foo" => nil Rack::Utils.parse_nested_query("foo="). @@ -51,7 +48,7 @@ context "Rack::Utils" do Rack::Utils.parse_nested_query("foo=bar"). should.equal "foo" => "bar" Rack::Utils.parse_nested_query("foo=\"bar\""). - should.equal "foo" => "bar" + should.equal "foo" => "\"bar\"" Rack::Utils.parse_nested_query("foo=bar&foo=quux"). should.equal "foo" => "quux" @@ -121,7 +118,7 @@ context "Rack::Utils" do message.should.equal "expected Array (got String) for param `y'" end - specify "should build query strings correctly" do + should "build query strings correctly" do Rack::Utils.build_query("foo" => "bar").should.equal "foo=bar" Rack::Utils.build_query("foo" => ["bar", "quux"]). should.equal "foo=bar&foo=quux" @@ -131,7 +128,7 @@ context "Rack::Utils" do should.equal "my+weird+field=q1%212%22%27w%245%267%2Fz8%29%3F" end - specify "should build nested query strings correctly" do + should "build nested query strings correctly" do Rack::Utils.build_nested_query("foo" => nil).should.equal "foo" Rack::Utils.build_nested_query("foo" => "").should.equal "foo=" Rack::Utils.build_nested_query("foo" => "bar").should.equal "foo=bar" @@ -178,7 +175,7 @@ context "Rack::Utils" do message.should.equal "value must be a Hash" end - specify "should figure out which encodings are acceptable" do + should "figure out which encodings are acceptable" do helper = lambda do |a, b| request = Rack::Request.new(Rack::MockRequest.env_for("", "HTTP_ACCEPT_ENCODING" => a)) Rack::Utils.select_best_encoding(a, b) @@ -201,43 +198,43 @@ context "Rack::Utils" do helper.call(%w(foo bar baz identity), [["*", 0], ["identity", 0.1]]).should.equal("identity") end - specify "should return the bytesize of String" do + should "return the bytesize of String" do Rack::Utils.bytesize("FOO\xE2\x82\xAC").should.equal 6 end - specify "should return status code for integer" do + should "return status code for integer" do Rack::Utils.status_code(200).should.equal 200 end - specify "should return status code for string" do + should "return status code for string" do Rack::Utils.status_code("200").should.equal 200 end - specify "should return status code for symbol" do + should "return status code for symbol" do Rack::Utils.status_code(:ok).should.equal 200 end end -context "Rack::Utils::HeaderHash" do - specify "should retain header case" do +describe Rack::Utils::HeaderHash do + should "retain header case" do h = Rack::Utils::HeaderHash.new("Content-MD5" => "d5ff4e2a0 ...") h['ETag'] = 'Boo!' h.to_hash.should.equal "Content-MD5" => "d5ff4e2a0 ...", "ETag" => 'Boo!' end - specify "should check existence of keys case insensitively" do + should "check existence of keys case insensitively" do h = Rack::Utils::HeaderHash.new("Content-MD5" => "d5ff4e2a0 ...") h.should.include 'content-md5' h.should.not.include 'ETag' end - specify "should merge case-insensitively" do + should "merge case-insensitively" do h = Rack::Utils::HeaderHash.new("ETag" => 'HELLO', "content-length" => '123') merged = h.merge("Etag" => 'WORLD', 'Content-Length' => '321', "Foo" => 'BAR') merged.should.equal "Etag"=>'WORLD', "Content-Length"=>'321', "Foo"=>'BAR' end - specify "should overwrite case insensitively and assume the new key's case" do + should "overwrite case insensitively and assume the new key's case" do h = Rack::Utils::HeaderHash.new("Foo-Bar" => "baz") h["foo-bar"] = "bizzle" h["FOO-BAR"].should.equal "bizzle" @@ -245,55 +242,55 @@ context "Rack::Utils::HeaderHash" do h.to_hash.should.equal "foo-bar" => "bizzle" end - specify "should be converted to real Hash" do + should "be converted to real Hash" do h = Rack::Utils::HeaderHash.new("foo" => "bar") h.to_hash.should.be.instance_of Hash end - specify "should convert Array values to Strings when converting to Hash" do + should "convert Array values to Strings when converting to Hash" do h = Rack::Utils::HeaderHash.new("foo" => ["bar", "baz"]) h.to_hash.should.equal({ "foo" => "bar\nbaz" }) end - specify "should replace hashes correctly" do + should "replace hashes correctly" do h = Rack::Utils::HeaderHash.new("Foo-Bar" => "baz") j = {"foo" => "bar"} h.replace(j) h["foo"].should.equal "bar" end - specify "should be able to delete the given key case-sensitively" do + should "be able to delete the given key case-sensitively" do h = Rack::Utils::HeaderHash.new("foo" => "bar") h.delete("foo") h["foo"].should.be.nil h["FOO"].should.be.nil end - specify "should be able to delete the given key case-insensitively" do + should "be able to delete the given key case-insensitively" do h = Rack::Utils::HeaderHash.new("foo" => "bar") h.delete("FOO") h["foo"].should.be.nil h["FOO"].should.be.nil end - specify "should return the deleted value when #delete is called on an existing key" do + should "return the deleted value when #delete is called on an existing key" do h = Rack::Utils::HeaderHash.new("foo" => "bar") h.delete("Foo").should.equal("bar") end - specify "should return nil when #delete is called on a non-existant key" do + should "return nil when #delete is called on a non-existant key" do h = Rack::Utils::HeaderHash.new("foo" => "bar") h.delete("Hello").should.be.nil end - specify "should avoid unnecessary object creation if possible" do + should "avoid unnecessary object creation if possible" do a = Rack::Utils::HeaderHash.new("foo" => "bar") b = Rack::Utils::HeaderHash.new(a) b.object_id.should.equal(a.object_id) b.should.equal(a) end - specify "should convert Array values to Strings when responding to #each" do + should "convert Array values to Strings when responding to #each" do h = Rack::Utils::HeaderHash.new("foo" => ["bar", "baz"]) h.each do |k,v| k.should.equal("foo") @@ -303,7 +300,7 @@ context "Rack::Utils::HeaderHash" do end -context "Rack::Utils::Context" do +describe Rack::Utils::Context do class ContextTest attr_reader :app def initialize app; @app=app; end @@ -316,7 +313,7 @@ context "Rack::Utils::Context" do test_target4 = proc{|e| [200,{'Content-Type'=>'text/plain', 'Content-Length'=>'0'},['']] } test_app = ContextTest.new test_target4 - specify "should set context correctly" do + should "set context correctly" do test_app.app.should.equal test_target4 c1 = Rack::Utils::Context.new(test_app, test_target1) c1.for.should.equal test_app @@ -326,7 +323,7 @@ context "Rack::Utils::Context" do c2.app.should.equal test_target2 end - specify "should alter app on recontexting" do + should "alter app on recontexting" do c1 = Rack::Utils::Context.new(test_app, test_target1) c2 = c1.recontext(test_target2) c2.for.should.equal test_app @@ -336,7 +333,7 @@ context "Rack::Utils::Context" do c3.app.should.equal test_target3 end - specify "should run different apps" do + should "run different apps" do c1 = Rack::Utils::Context.new test_app, test_target1 c2 = c1.recontext test_target2 c3 = c2.recontext test_target3 @@ -350,21 +347,37 @@ context "Rack::Utils::Context" do r3 = c3.call(:misc_symbol) r3.should.be.nil r4 = Rack::MockRequest.new(a4).get('/') - r4.status.should.be 200 + r4.status.should.equal 200 r5 = Rack::MockRequest.new(a5).get('/') - r5.status.should.be 200 + r5.status.should.equal 200 r4.body.should.equal r5.body end end -context "Rack::Utils::Multipart" do - specify "should return nil if content type is not multipart" do +describe Rack::Utils::Multipart do + def multipart_fixture(name) + file = multipart_file(name) + data = File.open(file, 'rb') { |io| io.read } + + type = "multipart/form-data; boundary=AaB03x" + length = data.respond_to?(:bytesize) ? data.bytesize : data.size + + { "CONTENT_TYPE" => type, + "CONTENT_LENGTH" => length.to_s, + :input => StringIO.new(data) } + end + + def multipart_file(name) + File.join(File.dirname(__FILE__), "multipart", name.to_s) + end + + should "return nil if content type is not multipart" do env = Rack::MockRequest.env_for("/", "CONTENT_TYPE" => 'application/x-www-form-urlencoded') Rack::Utils::Multipart.parse_multipart(env).should.equal nil end - specify "should parse multipart upload with text file" do + should "parse multipart upload with text file" do env = Rack::MockRequest.env_for("/", multipart_fixture(:text)) params = Rack::Utils::Multipart.parse_multipart(env) params["submit-name"].should.equal "Larry" @@ -377,7 +390,7 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.should.equal "contents" end - specify "should parse multipart upload with nested parameters" do + should "parse multipart upload with nested parameters" do env = Rack::MockRequest.env_for("/", multipart_fixture(:nested)) params = Rack::Utils::Multipart.parse_multipart(env) params["foo"]["submit-name"].should.equal "Larry" @@ -390,7 +403,7 @@ context "Rack::Utils::Multipart" do params["foo"]["files"][:tempfile].read.should.equal "contents" end - specify "should parse multipart upload with binary file" do + should "parse multipart upload with binary file" do env = Rack::MockRequest.env_for("/", multipart_fixture(:binary)) params = Rack::Utils::Multipart.parse_multipart(env) params["submit-name"].should.equal "Larry" @@ -403,7 +416,7 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.length.should.equal 26473 end - specify "should parse multipart upload with empty file" do + should "parse multipart upload with empty file" do env = Rack::MockRequest.env_for("/", multipart_fixture(:empty)) params = Rack::Utils::Multipart.parse_multipart(env) params["submit-name"].should.equal "Larry" @@ -416,7 +429,7 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.should.equal "" end - specify "should parse multipart upload with filename with semicolons" do + should "parse multipart upload with filename with semicolons" do env = Rack::MockRequest.env_for("/", multipart_fixture(:semicolon)) params = Rack::Utils::Multipart.parse_multipart(env) params["files"][:type].should.equal "text/plain" @@ -428,7 +441,7 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.should.equal "contents" end - specify "should not include file params if no file was selected" do + should "not include file params if no file was selected" do env = Rack::MockRequest.env_for("/", multipart_fixture(:none)) params = Rack::Utils::Multipart.parse_multipart(env) params["submit-name"].should.equal "Larry" @@ -436,7 +449,7 @@ context "Rack::Utils::Multipart" do params.keys.should.not.include "files" end - specify "should parse IE multipart upload and clean up filename" do + should "parse IE multipart upload and clean up filename" do env = Rack::MockRequest.env_for("/", multipart_fixture(:ie)) params = Rack::Utils::Multipart.parse_multipart(env) params["files"][:type].should.equal "text/plain" @@ -449,7 +462,76 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.should.equal "contents" end - specify "rewinds input after parsing upload" do + should "parse filename and modification param" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_and_modification_param)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["files"][:type].should.equal "image/jpeg" + params["files"][:filename].should.equal "genome.jpeg" + params["files"][:head].should.equal "Content-Type: image/jpeg\r\n" + + "Content-Disposition: attachment; " + + "name=\"files\"; " + + "filename=genome.jpeg; " + + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";\r\n" + + "Content-Description: a complete map of the human genome\r\n" + params["files"][:name].should.equal "files" + params["files"][:tempfile].read.should.equal "contents" + end + + should "parse filename with escaped quotes" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_escaped_quotes)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["files"][:type].should.equal "application/octet-stream" + params["files"][:filename].should.equal "escape \"quotes" + params["files"][:head].should.equal "Content-Disposition: form-data; " + + "name=\"files\"; " + + "filename=\"escape \\\"quotes\"\r\n" + + "Content-Type: application/octet-stream\r\n" + params["files"][:name].should.equal "files" + params["files"][:tempfile].read.should.equal "contents" + end + + should "parse filename with percent escaped quotes" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_percent_escaped_quotes)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["files"][:type].should.equal "application/octet-stream" + params["files"][:filename].should.equal "escape \"quotes" + params["files"][:head].should.equal "Content-Disposition: form-data; " + + "name=\"files\"; " + + "filename=\"escape %22quotes\"\r\n" + + "Content-Type: application/octet-stream\r\n" + params["files"][:name].should.equal "files" + params["files"][:tempfile].read.should.equal "contents" + end + + should "parse filename with unescaped quotes" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_unescaped_quotes)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["files"][:type].should.equal "application/octet-stream" + params["files"][:filename].should.equal "escape \"quotes" + params["files"][:head].should.equal "Content-Disposition: form-data; " + + "name=\"files\"; " + + "filename=\"escape \"quotes\"\r\n" + + "Content-Type: application/octet-stream\r\n" + params["files"][:name].should.equal "files" + params["files"][:tempfile].read.should.equal "contents" + end + + should "parse filename with escaped quotes and modification param" do + env = Rack::MockRequest.env_for("/", multipart_fixture(:filename_with_escaped_quotes_and_modification_param)) + params = Rack::Utils::Multipart.parse_multipart(env) + params["files"][:type].should.equal "image/jpeg" + params["files"][:filename].should.equal "\"human\" genome.jpeg" + params["files"][:head].should.equal "Content-Type: image/jpeg\r\n" + + "Content-Disposition: attachment; " + + "name=\"files\"; " + + "filename=\"\"human\" genome.jpeg\"; " + + "modification-date=\"Wed, 12 Feb 1997 16:29:51 -0500\";\r\n" + + "Content-Description: a complete map of the human genome\r\n" + params["files"][:name].should.equal "files" + params["files"][:tempfile].read.should.equal "contents" + end + + it "rewinds input after parsing upload" do options = multipart_fixture(:text) input = options[:input] env = Rack::MockRequest.env_for("/", options) @@ -459,7 +541,7 @@ context "Rack::Utils::Multipart" do input.read.length.should.equal 197 end - specify "builds multipart body" do + it "builds multipart body" do files = Rack::Utils::Multipart::UploadedFile.new(multipart_file("file1.txt")) data = Rack::Utils::Multipart.build_multipart("submit-name" => "Larry", "files" => files) @@ -475,7 +557,7 @@ context "Rack::Utils::Multipart" do params["files"][:tempfile].read.should.equal "contents" end - specify "builds nested multipart body" do + it "builds nested multipart body" do files = Rack::Utils::Multipart::UploadedFile.new(multipart_file("file1.txt")) data = Rack::Utils::Multipart.build_multipart("people" => [{"submit-name" => "Larry", "files" => files}]) @@ -491,7 +573,7 @@ context "Rack::Utils::Multipart" do params["people"][0]["files"][:tempfile].read.should.equal "contents" end - specify "can parse fields that end at the end of the buffer" do + it "can parse fields that end at the end of the buffer" do input = File.read(multipart_file("bad_robots")) req = Rack::Request.new Rack::MockRequest.env_for("/", @@ -503,7 +585,7 @@ context "Rack::Utils::Multipart" do req.POST['addresses'].should.not.equal nil end - specify "builds complete params with the chunk size of 16384 slicing exactly on boundary" do + it "builds complete params with the chunk size of 16384 slicing exactly on boundary" do data = File.open(multipart_file("fail_16384_nofile")) { |f| f.read }.gsub(/\n/, "\r\n") options = { "CONTENT_TYPE" => "multipart/form-data; boundary=----WebKitFormBoundaryWsY0GnpbI5U7ztzo", @@ -522,31 +604,14 @@ context "Rack::Utils::Multipart" do params["AAAAAAAAAAAAAAAAAAA"]["PLAPLAPLA_MEMMEMMEMM_ATTRATTRER"]["new"]["-2"]["ba_unit_id"].should.equal "1017" end - specify "should return nil if no UploadedFiles were used" do + should "return nil if no UploadedFiles were used" do data = Rack::Utils::Multipart.build_multipart("people" => [{"submit-name" => "Larry", "files" => "contents"}]) data.should.equal nil end - specify "should raise ArgumentError if params is not a Hash" do + should "raise ArgumentError if params is not a Hash" do lambda { Rack::Utils::Multipart.build_multipart("foo=bar") }. should.raise(ArgumentError). message.should.equal "value must be a Hash" end - - private - def multipart_fixture(name) - file = multipart_file(name) - data = File.open(file, 'rb') { |io| io.read } - - type = "multipart/form-data; boundary=AaB03x" - length = data.respond_to?(:bytesize) ? data.bytesize : data.size - - { "CONTENT_TYPE" => type, - "CONTENT_LENGTH" => length.to_s, - :input => StringIO.new(data) } - end - - def multipart_file(name) - File.join(File.dirname(__FILE__), "multipart", name.to_s) - end end diff --git a/vendor/plugins/rack/test/spec_rack_webrick.rb b/vendor/plugins/rack/spec/spec_webrick.rb similarity index 70% rename from vendor/plugins/rack/test/spec_rack_webrick.rb rename to vendor/plugins/rack/spec/spec_webrick.rb index 599425c4..0bf9690e 100644 --- a/vendor/plugins/rack/test/spec_rack_webrick.rb +++ b/vendor/plugins/rack/spec/spec_webrick.rb @@ -1,35 +1,29 @@ -require 'test/spec' - -require 'rack/handler/webrick' -require 'rack/lint' -require 'rack/response' -require 'testrequest' +require 'rack/mock' +require File.expand_path('../testrequest', __FILE__) Thread.abort_on_exception = true -context "Rack::Handler::WEBrick" do - include TestRequest::Helpers +describe Rack::Handler::WEBrick do + extend TestRequest::Helpers - setup do - @server = WEBrick::HTTPServer.new(:Host => @host='0.0.0.0', - :Port => @port=9202, - :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN), - :AccessLog => []) - @server.mount "/test", Rack::Handler::WEBrick, - Rack::Lint.new(TestRequest.new) - Thread.new { @server.start } - trap(:INT) { @server.shutdown } - end + @server = WEBrick::HTTPServer.new(:Host => @host='0.0.0.0', + :Port => @port=9202, + :Logger => WEBrick::Log.new(nil, WEBrick::BasicLog::WARN), + :AccessLog => []) + @server.mount "/test", Rack::Handler::WEBrick, + Rack::Lint.new(TestRequest.new) + Thread.new { @server.start } + trap(:INT) { @server.shutdown } - specify "should respond" do + should "respond" do lambda { GET("/test") }.should.not.raise end - specify "should be a WEBrick" do + should "be a WEBrick" do GET("/test") - status.should.be 200 + status.should.equal 200 response["SERVER_SOFTWARE"].should =~ /WEBrick/ response["HTTP_VERSION"].should.equal "HTTP/1.1" response["SERVER_PROTOCOL"].should.equal "HTTP/1.1" @@ -37,15 +31,15 @@ context "Rack::Handler::WEBrick" do response["SERVER_NAME"].should.equal "0.0.0.0" end - specify "should have rack headers" do + should "have rack headers" do GET("/test") response["rack.version"].should.equal [1,1] - response["rack.multithread"].should.be true - response["rack.multiprocess"].should.be false - response["rack.run_once"].should.be false + response["rack.multithread"].should.be.true + response["rack.multiprocess"].should.be.false + response["rack.run_once"].should.be.false end - specify "should have CGI headers on GET" do + should "have CGI headers on GET" do GET("/test") response["REQUEST_METHOD"].should.equal "GET" response["SCRIPT_NAME"].should.equal "/test" @@ -69,7 +63,7 @@ context "Rack::Handler::WEBrick" do response["QUERY_STRING"].should.equal "quux=1" end - specify "should have CGI headers on POST" do + should "have CGI headers on POST" do POST("/test", {"rack-form-data" => "23"}, {'X-test-header' => '42'}) status.should.equal 200 response["REQUEST_METHOD"].should.equal "POST" @@ -80,18 +74,18 @@ context "Rack::Handler::WEBrick" do response["test.postdata"].should.equal "rack-form-data=23" end - specify "should support HTTP auth" do + should "support HTTP auth" do GET("/test", {:user => "ruth", :passwd => "secret"}) response["HTTP_AUTHORIZATION"].should.equal "Basic cnV0aDpzZWNyZXQ=" end - specify "should set status" do + should "set status" do GET("/test?secret") status.should.equal 403 response["rack.url_scheme"].should.equal "http" end - specify "should correctly set cookies" do + should "correctly set cookies" do @server.mount "/cookie-test", Rack::Handler::WEBrick, Rack::Lint.new(lambda { |req| res = Rack::Response.new @@ -107,7 +101,7 @@ context "Rack::Handler::WEBrick" do } end - specify "should provide a .run" do + should "provide a .run" do block_ran = false catch(:done) { Rack::Handler::WEBrick.run(lambda {}, @@ -120,11 +114,9 @@ context "Rack::Handler::WEBrick" do throw :done } } - block_ran.should.be true + block_ran.should.be.true @s.shutdown end - teardown do - @server.shutdown - end + @server.shutdown end diff --git a/vendor/plugins/rack/test/testrequest.rb b/vendor/plugins/rack/spec/testrequest.rb similarity index 86% rename from vendor/plugins/rack/test/testrequest.rb rename to vendor/plugins/rack/spec/testrequest.rb index 0da2b126..b819ce93 100644 --- a/vendor/plugins/rack/test/testrequest.rb +++ b/vendor/plugins/rack/spec/testrequest.rb @@ -2,10 +2,15 @@ require 'yaml' require 'net/http' class TestRequest + NOSERIALIZE = [Method, Proc] + def call(env) status = env["QUERY_STRING"] =~ /secret/ ? 403 : 200 env["test.postdata"] = env["rack.input"].read - body = env.to_yaml + minienv = env.dup + # This may in the future want to replace with a dummy value instead. + minienv.delete_if { |k,v| NOSERIALIZE.any? { |c| v.kind_of?(c) } } + body = minienv.to_yaml size = body.respond_to?(:bytesize) ? body.bytesize : body.size [status, {"Content-Type" => "text/yaml", "Content-Length" => size.to_s}, [body]] end @@ -35,7 +40,7 @@ class TestRequest @status = response.code.to_i begin @response = YAML.load(response.body) - rescue ArgumentError + rescue TypeError, ArgumentError @response = nil end } diff --git a/vendor/plugins/rack/test/unregistered_handler/rack/handler/unregistered.rb b/vendor/plugins/rack/spec/unregistered_handler/rack/handler/unregistered.rb similarity index 100% rename from vendor/plugins/rack/test/unregistered_handler/rack/handler/unregistered.rb rename to vendor/plugins/rack/spec/unregistered_handler/rack/handler/unregistered.rb diff --git a/vendor/plugins/rack/test/unregistered_handler/rack/handler/unregistered_long_one.rb b/vendor/plugins/rack/spec/unregistered_handler/rack/handler/unregistered_long_one.rb similarity index 100% rename from vendor/plugins/rack/test/unregistered_handler/rack/handler/unregistered_long_one.rb rename to vendor/plugins/rack/spec/unregistered_handler/rack/handler/unregistered_long_one.rb diff --git a/vendor/plugins/rack/test/cgi/test.ru b/vendor/plugins/rack/test/cgi/test.ru deleted file mode 100755 index fc9b6ffc..00000000 --- a/vendor/plugins/rack/test/cgi/test.ru +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env ruby -I ../../lib ../../bin/rackup -E deployment -I ../../lib -# -*- ruby -*- - -require '../testrequest' - -run TestRequest.new diff --git a/vendor/plugins/rack/test/spec_rack_auth_openid.rb b/vendor/plugins/rack/test/spec_rack_auth_openid.rb deleted file mode 100644 index ba248445..00000000 --- a/vendor/plugins/rack/test/spec_rack_auth_openid.rb +++ /dev/null @@ -1,84 +0,0 @@ -require 'test/spec' - -begin -# requires the ruby-openid gem -require 'rack/auth/openid' - -context "Rack::Auth::OpenID" do - OID = Rack::Auth::OpenID - host = 'host' - subd = 'sub.host' - wild = '*.host' - path = 'path' - long = 'path/long' - scheme = 'http://' - realm = scheme+host+'/'+path - - specify 'realm uri should be valid' do - lambda{OID.new('/'+path)}.should.raise ArgumentError - lambda{OID.new('/'+long)}.should.raise ArgumentError - lambda{OID.new(scheme+host)}.should.not.raise - lambda{OID.new(scheme+host+'/')}.should.not.raise - lambda{OID.new(scheme+host+'/'+path)}.should.not.raise - lambda{OID.new(scheme+subd)}.should.not.raise - lambda{OID.new(scheme+subd+'/')}.should.not.raise - lambda{OID.new(scheme+subd+'/'+path)}.should.not.raise - end - - specify 'should be able to check if a uri is within the realm' do - end - - specify 'return_to should be valid' do - uri = '/'+path - lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError - uri = '/'+long - lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError - uri = scheme+host - lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError - uri = scheme+host+'/'+path - lambda{OID.new(realm, :return_to=>uri)}.should.not.raise - uri = scheme+subd+'/'+path - lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError - uri = scheme+host+'/'+long - lambda{OID.new(realm, :return_to=>uri)}.should.not.raise - uri = scheme+subd+'/'+long - lambda{OID.new(realm, :return_to=>uri)}.should.raise ArgumentError - end - - specify 'extensions should have required constants defined' do - badext = Rack::Auth::OpenID::BadExtension - ext = Object.new - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext = Module.new - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::Request = nil - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::Response = nil - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::NS_URI = nil - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - end - - specify 'extensions should have Request and Response defined and inherit from OpenID::Extension' do - $-w, w = nil, $-w # yuck - badext = Rack::Auth::OpenID::BadExtension - ext = Module.new - ext::Request = nil - ext::Response = nil - ext::NS_URI = nil - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::Request = Class.new() - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::Response = Class.new() - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::Request = Class.new(::OpenID::Extension) - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - ext::Response = Class.new(::OpenID::Extension) - lambda{OID.new(realm).add_extension(ext)}.should.raise(badext) - $-w = w - end -end - -rescue LoadError - $stderr.puts "Skipping Rack::Auth::OpenID tests (ruby-openid 2 is required). `gem install ruby-openid` and try again." -end diff --git a/vendor/plugins/rack/test/spec_rack_camping.rb b/vendor/plugins/rack/test/spec_rack_camping.rb deleted file mode 100644 index bed11710..00000000 --- a/vendor/plugins/rack/test/spec_rack_camping.rb +++ /dev/null @@ -1,51 +0,0 @@ -require 'test/spec' -require 'stringio' -require 'uri' - -begin - require 'rack/mock' - - $-w, w = nil, $-w # yuck - require 'camping' - require 'rack/adapter/camping' - - Camping.goes :CampApp - module CampApp - module Controllers - class HW < R('/') - def get - @headers["X-Served-By"] = URI("http://rack.rubyforge.org") - "Camping works!" - end - - def post - "Data: #{input.foo}" - end - end - end - end - $-w = w - - context "Rack::Adapter::Camping" do - specify "works with GET" do - res = Rack::MockRequest.new(Rack::Adapter::Camping.new(CampApp)). - get("/") - - res.should.be.ok - res["Content-Type"].should.equal "text/html" - res["X-Served-By"].should.equal "http://rack.rubyforge.org" - - res.body.should.equal "Camping works!" - end - - specify "works with POST" do - res = Rack::MockRequest.new(Rack::Adapter::Camping.new(CampApp)). - post("/", :input => "foo=bar") - - res.should.be.ok - res.body.should.equal "Data: bar" - end - end -rescue LoadError - $stderr.puts "Skipping Rack::Adapter::Camping tests (Camping is required). `gem install camping` and try again." -end diff --git a/vendor/plugins/rack/test/spec_rack_rewindable_input.rb b/vendor/plugins/rack/test/spec_rack_rewindable_input.rb deleted file mode 100644 index 78bebfc9..00000000 --- a/vendor/plugins/rack/test/spec_rack_rewindable_input.rb +++ /dev/null @@ -1,118 +0,0 @@ -require 'test/spec' -require 'stringio' -require 'rack/rewindable_input' - -shared_context "a rewindable IO object" do - setup do - @rio = Rack::RewindableInput.new(@io) - end - - teardown do - @rio.close - end - - specify "should be able to handle to read()" do - @rio.read.should.equal "hello world" - end - - specify "should be able to handle to read(nil)" do - @rio.read(nil).should.equal "hello world" - end - - specify "should be able to handle to read(length)" do - @rio.read(1).should.equal "h" - end - - specify "should be able to handle to read(length, buffer)" do - buffer = "" - result = @rio.read(1, buffer) - result.should.equal "h" - result.object_id.should.equal buffer.object_id - end - - specify "should be able to handle to read(nil, buffer)" do - buffer = "" - result = @rio.read(nil, buffer) - result.should.equal "hello world" - result.object_id.should.equal buffer.object_id - end - - specify "should rewind to the beginning when #rewind is called" do - @rio.read(1) - @rio.rewind - @rio.read.should.equal "hello world" - end - - specify "should be able to handle gets" do - @rio.gets.should == "hello world" - end - - specify "should be able to handle each" do - array = [] - @rio.each do |data| - array << data - end - array.should.equal(["hello world"]) - end - - specify "should not buffer into a Tempfile if no data has been read yet" do - @rio.instance_variable_get(:@rewindable_io).should.be.nil - end - - specify "should buffer into a Tempfile when data has been consumed for the first time" do - @rio.read(1) - tempfile = @rio.instance_variable_get(:@rewindable_io) - tempfile.should.not.be.nil - @rio.read(1) - tempfile2 = @rio.instance_variable_get(:@rewindable_io) - tempfile2.should.equal tempfile - end - - specify "should close the underlying tempfile upon calling #close" do - @rio.read(1) - tempfile = @rio.instance_variable_get(:@rewindable_io) - @rio.close - tempfile.should.be.closed - end - - specify "should be possibel to call #close when no data has been buffered yet" do - @rio.close - end - - specify "should be possible to call #close multiple times" do - @rio.close - @rio.close - end -end - -context "Rack::RewindableInput" do - context "given an IO object that is already rewindable" do - setup do - @io = StringIO.new("hello world") - end - - it_should_behave_like "a rewindable IO object" - end - - context "given an IO object that is not rewindable" do - setup do - @io = StringIO.new("hello world") - @io.instance_eval do - undef :rewind - end - end - - it_should_behave_like "a rewindable IO object" - end - - context "given an IO object whose rewind method raises Errno::ESPIPE" do - setup do - @io = StringIO.new("hello world") - def @io.rewind - raise Errno::ESPIPE, "You can't rewind this!" - end - end - - it_should_behave_like "a rewindable IO object" - end -end diff --git a/vendor/plugins/rack/test/spec_rack_showexceptions.rb b/vendor/plugins/rack/test/spec_rack_showexceptions.rb deleted file mode 100644 index bdbc1201..00000000 --- a/vendor/plugins/rack/test/spec_rack_showexceptions.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'test/spec' - -require 'rack/showexceptions' -require 'rack/mock' - -context "Rack::ShowExceptions" do - specify "catches exceptions" do - res = nil - req = Rack::MockRequest.new(Rack::ShowExceptions.new(lambda { |env| - raise RuntimeError - })) - lambda { - res = req.get("/") - }.should.not.raise - res.should.be.a.server_error - res.status.should.equal 500 - - res.should =~ /RuntimeError/ - res.should =~ /ShowExceptions/ - end -end diff --git a/vendor/plugins/rack/test/spec_rack_showstatus.rb b/vendor/plugins/rack/test/spec_rack_showstatus.rb deleted file mode 100644 index 78700134..00000000 --- a/vendor/plugins/rack/test/spec_rack_showstatus.rb +++ /dev/null @@ -1,72 +0,0 @@ -require 'test/spec' - -require 'rack/showstatus' -require 'rack/mock' - -context "Rack::ShowStatus" do - specify "should provide a default status message" do - req = Rack::MockRequest.new(Rack::ShowStatus.new(lambda { |env| - [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []] - })) - - res = req.get("/", :lint => true) - res.should.be.not_found - res.should.be.not.empty - - res["Content-Type"].should.equal("text/html") - res.should =~ /404/ - res.should =~ /Not Found/ - end - - specify "should let the app provide additional information" do - req = Rack::MockRequest.new(Rack::ShowStatus.new(lambda { |env| - env["rack.showstatus.detail"] = "gone too meta." - [404, {"Content-Type" => "text/plain", "Content-Length" => "0"}, []] - })) - - res = req.get("/", :lint => true) - res.should.be.not_found - res.should.be.not.empty - - res["Content-Type"].should.equal("text/html") - res.should =~ /404/ - res.should =~ /Not Found/ - res.should =~ /too meta/ - end - - specify "should not replace existing messages" do - req = Rack::MockRequest.new(Rack::ShowStatus.new(lambda { |env| - [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]] - })) - res = req.get("/", :lint => true) - res.should.be.not_found - - res.body.should == "foo!" - end - - specify "should pass on original headers" do - headers = {"WWW-Authenticate" => "Basic blah"} - - req = Rack::MockRequest.new(Rack::ShowStatus.new(lambda { |env| [401, headers, []] })) - res = req.get("/", :lint => true) - - res["WWW-Authenticate"].should.equal("Basic blah") - end - - specify "should replace existing messages if there is detail" do - req = Rack::MockRequest.new(Rack::ShowStatus.new(lambda { |env| - env["rack.showstatus.detail"] = "gone too meta." - [404, {"Content-Type" => "text/plain", "Content-Length" => "4"}, ["foo!"]] - })) - - res = req.get("/", :lint => true) - res.should.be.not_found - res.should.be.not.empty - - res["Content-Type"].should.equal("text/html") - res["Content-Length"].should.not.equal("4") - res.should =~ /404/ - res.should =~ /too meta/ - res.body.should.not =~ /foo/ - end -end diff --git a/vendor/plugins/rack/test/spec_rackup.rb b/vendor/plugins/rack/test/spec_rackup.rb deleted file mode 100644 index d9926fda..00000000 --- a/vendor/plugins/rack/test/spec_rackup.rb +++ /dev/null @@ -1,154 +0,0 @@ -require 'test/spec' -require 'testrequest' -require 'rack/server' -require 'open3' - -begin -require "mongrel" - -context "rackup" do - include TestRequest::Helpers - - def run_rackup(*args) - options = args.last.is_a?(Hash) ? args.pop : {} - flags = args.first - @host = options[:host] || "0.0.0.0" - @port = options[:port] || 9292 - - Dir.chdir("#{root}/test/rackup") do - @in, @rackup, @err = Open3.popen3("#{Gem.ruby} -S #{rackup} #{flags}") - end - - return if options[:port] == false - - # Wait until the server is available - begin - GET("/") - rescue - sleep 0.05 - retry - end - end - - def output - @rackup.read - end - - after do - # This doesn't actually return a response, so we rescue - GET "/die" rescue nil - - Dir["#{root}/**/*.pid"].each do |file| - File.delete(file) - end - - File.delete("#{root}/log_output") if File.exist?("#{root}/log_output") - end - - specify "rackup" do - run_rackup - response["PATH_INFO"].should.equal '/' - response["test.$DEBUG"].should.be false - response["test.$EVAL"].should.be nil - response["test.$VERBOSE"].should.be false - response["test.Ping"].should.be nil - response["SERVER_SOFTWARE"].should.not =~ /webrick/ - end - - specify "rackup --help" do - run_rackup "--help", :port => false - output.should.match /--port/ - end - - specify "rackup --port" do - run_rackup "--port 9000", :port => 9000 - response["SERVER_PORT"].should.equal "9000" - end - - specify "rackup --debug" do - run_rackup "--debug" - response["test.$DEBUG"].should.be true - end - - specify "rackup --eval" do - run_rackup %{--eval "BUKKIT = 'BUKKIT'"} - response["test.$EVAL"].should.equal "BUKKIT" - end - - specify "rackup --warn" do - run_rackup %{--warn} - response["test.$VERBOSE"].should.be true - end - - specify "rackup --include" do - run_rackup %{--include /foo/bar} - response["test.$LOAD_PATH"].should.include "/foo/bar" - end - - specify "rackup --require" do - run_rackup %{--require ping} - response["test.Ping"].should.equal "constant" - end - - specify "rackup --server" do - run_rackup %{--server webrick} - response["SERVER_SOFTWARE"].should =~ /webrick/i - end - - specify "rackup --host" do - run_rackup %{--host 127.0.0.1}, :host => "127.0.0.1" - response["REMOTE_ADDR"].should.equal "127.0.0.1" - end - - specify "rackup --daemonize --pid" do - run_rackup %{--daemonize --pid testing.pid} - status.should.be 200 - @rackup.should.be.eof? - Dir["#{root}/**/testing.pid"].should.not.be.empty? - end - - specify "rackup --pid" do - run_rackup %{--pid testing.pid} - status.should.be 200 - Dir["#{root}/**/testing.pid"].should.not.be.empty? - end - - specify "rackup --version" do - run_rackup %{--version}, :port => false - output.should =~ /1.0/ - end - - specify "rackup --env development includes lint" do - run_rackup - GET("/broken_lint") - status.should.be 500 - end - - specify "rackup --env deployment does not include lint" do - run_rackup %{--env deployment} - GET("/broken_lint") - status.should.be 200 - end - - specify "rackup --env none does not include lint" do - run_rackup %{--env none} - GET("/broken_lint") - status.should.be 200 - end - - specify "rackup --env deployment does log" do - run_rackup %{--env deployment} - log = File.read(response["test.stderr"]) - log.should.be.empty? - end - - specify "rackup --env none does not log" do - run_rackup %{--env none} - GET("/") - log = File.read(response["test.stderr"]) - log.should.be.empty? - end -end -rescue LoadError - $stderr.puts "Skipping rackup --server tests (mongrel is required). `gem install thin` and try again." -end \ No newline at end of file