remi-rails-rack-adapter 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/COPYING ADDED
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2008 Marc-Andre Cournoyer
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
16
+ THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,17 @@
1
+ = Rails Rack Adapter
2
+
3
+ This is the Rack::Adapter::Rails from Thin, extracted out
4
+
5
+ See COPYING for the original license (c) 2008 Marc-Andre Cournoyer
6
+
7
+ Often times, I've needed this adapter but haven't needed Thin (even though Thin absolutely ROCKS)
8
+
9
+ sooooo ... now you should be able to:
10
+
11
+ sudo gem install remi-rails-rack-adapter
12
+
13
+ >> require 'rails-rack-adapter'
14
+ >> Rack::Hander::Foo.run Rack::Rails::Adapter.new :root => 'some/dir', :environment => 'development'
15
+
16
+ Hopefully this won't be necessary for Rails 2.3, which is finally built on Rack, but it's
17
+ very helpful for Rails < 2.3
data/Rakefile ADDED
@@ -0,0 +1,57 @@
1
+ require 'rake'
2
+ require 'rubygems'
3
+ require 'rake/rdoctask'
4
+ require 'spec/rake/spectask'
5
+
6
+ begin
7
+ require 'jeweler'
8
+ Jeweler::Tasks.new do |s|
9
+ s.name = "rails-rack-adapter"
10
+ s.summary = "Thin's Rack::Adapter::Rails extracted to its own gem"
11
+ s.email = "remi@remitaylor.com"
12
+ s.homepage = "http://github.com/remi/rails-rack-adapter"
13
+ s.description = "Thin's Rack::Adapter::Rails extracted to its own gem"
14
+ s.authors = %w( remi )
15
+ s.files = FileList["[A-Z]*", "{lib,spec,examples,rails_generators}/**/*"]
16
+ # s.executables = "neato"
17
+ # s.add_dependency 'person-project'
18
+ end
19
+ rescue LoadError
20
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
21
+ end
22
+
23
+ Spec::Rake::SpecTask.new do |t|
24
+ t.spec_files = FileList['spec/**/*_spec.rb']
25
+ end
26
+
27
+ desc "Run all examples with RCov"
28
+ Spec::Rake::SpecTask.new('rcov') do |t|
29
+ t.spec_files = FileList['spec/**/*_spec.rb']
30
+ t.rcov = true
31
+ end
32
+
33
+ Rake::RDocTask.new do |rdoc|
34
+ rdoc.rdoc_dir = 'rdoc'
35
+ rdoc.title = 'rails-rack-adapter'
36
+ rdoc.options << '--line-numbers' << '--inline-source'
37
+ rdoc.rdoc_files.include('README*')
38
+ rdoc.rdoc_files.include('lib/**/*.rb')
39
+ end
40
+
41
+ desc 'Confirm that gemspec is $SAFE'
42
+ task :safe do
43
+ require 'yaml'
44
+ require 'rubygems/specification'
45
+ data = File.read('rails-rack-adapter.gemspec')
46
+ spec = nil
47
+ if data !~ %r{!ruby/object:Gem::Specification}
48
+ Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
49
+ else
50
+ spec = YAML.load(data)
51
+ end
52
+ spec.validate
53
+ puts spec
54
+ puts "OK"
55
+ end
56
+
57
+ task :default => :spec
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 1
3
+ :minor: 0
4
+ :patch: 0
@@ -0,0 +1,167 @@
1
+ require 'cgi'
2
+
3
+ # Adapter to run a Rails app with any supported Rack handler.
4
+ # By default it will try to load the Rails application in the
5
+ # current directory in the development environment.
6
+ #
7
+ # Options:
8
+ # root: Root directory of the Rails app
9
+ # environment: Rails environment to run in (development [default], production or test)
10
+ # prefix: Set the relative URL root.
11
+ #
12
+ # Based on http://fuzed.rubyforge.org/ Rails adapter
13
+ module Rack
14
+ module Adapter
15
+ class Rails
16
+ FILE_METHODS = %w(GET HEAD).freeze
17
+
18
+ def initialize(options={})
19
+ @root = options[:root] || Dir.pwd
20
+ @env = options[:environment] || 'development'
21
+ @prefix = options[:prefix]
22
+
23
+ load_application
24
+
25
+ @file_server = Rack::File.new(::File.join(RAILS_ROOT, "public"))
26
+ end
27
+
28
+ def load_application
29
+ ENV['RAILS_ENV'] = @env
30
+
31
+ require "#{@root}/config/environment"
32
+ require 'dispatcher'
33
+
34
+ ActionController::AbstractRequest.relative_url_root = @prefix if @prefix
35
+ end
36
+
37
+ # TODO refactor this in File#can_serve?(path) ??
38
+ def file_exist?(path)
39
+ full_path = ::File.join(@file_server.root, Utils.unescape(path))
40
+ ::File.file?(full_path) && ::File.readable_real?(full_path)
41
+ end
42
+
43
+ def serve_file(env)
44
+ @file_server.call(env)
45
+ end
46
+
47
+ def serve_rails(env)
48
+ request = Request.new(env)
49
+ response = Response.new
50
+
51
+ session_options = ActionController::CgiRequest::DEFAULT_SESSION_OPTIONS
52
+ cgi = CGIWrapper.new(request, response)
53
+
54
+ Dispatcher.dispatch(cgi, session_options, response)
55
+
56
+ response.finish
57
+ end
58
+
59
+ def call(env)
60
+ path = env['PATH_INFO'].chomp('/')
61
+ method = env['REQUEST_METHOD']
62
+ cached_path = (path.empty? ? 'index' : path) + ActionController::Base.page_cache_extension
63
+
64
+ if FILE_METHODS.include?(method)
65
+ if file_exist?(path) # Serve the file if it's there
66
+ return serve_file(env)
67
+ elsif file_exist?(cached_path) # Serve the page cache if it's there
68
+ env['PATH_INFO'] = cached_path
69
+ return serve_file(env)
70
+ end
71
+ end
72
+
73
+ # No static file, let Rails handle it
74
+ serve_rails(env)
75
+ end
76
+
77
+ protected
78
+
79
+ class CGIWrapper < ::CGI
80
+ def initialize(request, response, *args)
81
+ @request = request
82
+ @response = response
83
+ @args = *args
84
+ @input = request.body
85
+
86
+ super *args
87
+ end
88
+
89
+ def header(options = "text/html")
90
+ if options.is_a?(String)
91
+ @response['Content-Type'] = options unless @response['Content-Type']
92
+ else
93
+ @response['Content-Length'] = options.delete('Content-Length').to_s if options['Content-Length']
94
+
95
+ @response['Content-Type'] = options.delete('type') || "text/html"
96
+ @response['Content-Type'] += "; charset=" + options.delete('charset') if options['charset']
97
+
98
+ @response['Content-Language'] = options.delete('language') if options['language']
99
+ @response['Expires'] = options.delete('expires') if options['expires']
100
+
101
+ @response.status = options.delete('Status') if options['Status']
102
+
103
+ # Convert 'cookie' header to 'Set-Cookie' headers.
104
+ # Because Set-Cookie header can appear more the once in the response body,
105
+ # we store it in a line break seperated string that will be translated to
106
+ # multiple Set-Cookie header by the handler.
107
+ if cookie = options.delete('cookie')
108
+ cookies = []
109
+
110
+ case cookie
111
+ when Array then cookie.each { |c| cookies << c.to_s }
112
+ when Hash then cookie.each { |_, c| cookies << c.to_s }
113
+ else cookies << cookie.to_s
114
+ end
115
+
116
+ @output_cookies.each { |c| cookies << c.to_s } if @output_cookies
117
+
118
+ @response['Set-Cookie'] = [@response['Set-Cookie'], cookies].compact
119
+ # See http://groups.google.com/group/rack-devel/browse_thread/thread/e8759b91a82c5a10/a8dbd4574fe97d69?#a8dbd4574fe97d69
120
+ if Thin.ruby_18?
121
+ @response['Set-Cookie'].flatten!
122
+ else
123
+ @response['Set-Cookie'] = @response['Set-Cookie'].join("\n")
124
+ end
125
+ end
126
+
127
+ options.each { |k,v| @response[k] = v }
128
+ end
129
+
130
+ ""
131
+ end
132
+
133
+ def params
134
+ @params ||= @request.params
135
+ end
136
+
137
+ def cookies
138
+ @request.cookies
139
+ end
140
+
141
+ def query_string
142
+ @request.query_string
143
+ end
144
+
145
+ # Used to wrap the normal args variable used inside CGI.
146
+ def args
147
+ @args
148
+ end
149
+
150
+ # Used to wrap the normal env_table variable used inside CGI.
151
+ def env_table
152
+ @request.env
153
+ end
154
+
155
+ # Used to wrap the normal stdinput variable used inside CGI.
156
+ def stdinput
157
+ @input
158
+ end
159
+
160
+ def stdoutput
161
+ STDERR.puts "stdoutput should not be used."
162
+ @response.body
163
+ end
164
+ end
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,9 @@
1
+ $:.unshift File.dirname(__FILE__)
2
+
3
+ begin
4
+ require 'rack'
5
+ rescue LoadError
6
+ raise "rack is required for rails-rack-adapter, try: gem install rack"
7
+ end
8
+
9
+ require 'rack/adapter/rails'
metadata ADDED
@@ -0,0 +1,61 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: remi-rails-rack-adapter
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - remi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-10 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description: Thin's Rack::Adapter::Rails extracted to its own gem
17
+ email: remi@remitaylor.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - Rakefile
26
+ - VERSION.yml
27
+ - COPYING
28
+ - README.rdoc
29
+ - lib/rack
30
+ - lib/rack/adapter
31
+ - lib/rack/adapter/rails.rb
32
+ - lib/rails-rack-adapter.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/remi/rails-rack-adapter
35
+ post_install_message:
36
+ rdoc_options:
37
+ - --inline-source
38
+ - --charset=UTF-8
39
+ require_paths:
40
+ - lib
41
+ required_ruby_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: "0"
46
+ version:
47
+ required_rubygems_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: "0"
52
+ version:
53
+ requirements: []
54
+
55
+ rubyforge_project:
56
+ rubygems_version: 1.2.0
57
+ signing_key:
58
+ specification_version: 2
59
+ summary: Thin's Rack::Adapter::Rails extracted to its own gem
60
+ test_files: []
61
+