rack-mux 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/rack/mux.rb ADDED
@@ -0,0 +1,72 @@
1
+ require 'rack'
2
+
3
+ module Rack
4
+ class Mux
5
+ VERSION = '0.1.0'
6
+ HEADER = 'X-Mux-Uri'
7
+
8
+ def initialize(app, options = {})
9
+ @app, @rack_options = app, options
10
+ @host = options[:Host] || '0.0.0.0'
11
+ @port = options[:Port] || find_port
12
+ @uri = URI.parse("http://#{@host}:#{@port}")
13
+
14
+ rackup
15
+ end
16
+
17
+ def call(env)
18
+ @app.call(env.merge(HEADER => @uri.to_s))
19
+ end
20
+
21
+ def rackup
22
+ Thread.new(server_options) do |options|
23
+ Server.start(server_options)
24
+ end
25
+
26
+ wait_for_server
27
+ end
28
+
29
+ def server_options
30
+ default_options.merge(@rack_options).merge(:app => self)
31
+ end
32
+
33
+ def default_options
34
+ {
35
+ :environment => ENV['RACK_ENV'] || "development",
36
+ :Port => @port,
37
+ :Host => @host
38
+ }
39
+ end
40
+
41
+ def find_port
42
+ port = rand(64510) + 1025
43
+
44
+ begin
45
+ TCPSocket.new(@host, port)
46
+ retry
47
+ rescue Errno::ECONNREFUSED
48
+ return port
49
+ end
50
+ end
51
+
52
+ def wait_for_server
53
+ Timeout::timeout(30) do
54
+ begin
55
+ return TCPSocket.new(@host, @port)
56
+ rescue Errno::ECONNREFUSED
57
+ retry
58
+ rescue => e
59
+ raise Error, e.message
60
+ end
61
+ end
62
+ end
63
+
64
+ # http://github.com/rack/rack/commit/c73b474525bace3f059a130b15413abd4d917086
65
+ class Server < Rack::Server
66
+ def initialize(options = nil)
67
+ @options = options
68
+ @app = options[:app] if options && options[:app]
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rack::Mux do
4
+ it 'adds the "X-Mux-Uri" header' do
5
+ env = JSON.parse(@client.get('/').body)
6
+ env['X-Mux-Uri'].should =~ %r{^http://}
7
+ end
8
+
9
+ it 'boots a rack server' do
10
+ uri = JSON.parse(@client.get('/').body)['X-Mux-Uri']
11
+ new_client = Rack::Client.new(uri)
12
+ new_response = new_client.get('/')
13
+ new_uri = JSON.parse(new_client.get('/').body)['X-Mux-Uri']
14
+ new_uri.should == uri
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ $:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
2
+
3
+ require 'rack/mux'
4
+ require 'rack/client'
5
+ require 'json'
6
+ require 'mongrel'
7
+
8
+ RSpec.configure do |config|
9
+ config.color_enabled = true
10
+
11
+ config.before(:all) do
12
+ @client = Rack::Client.new do
13
+ use Rack::Lint
14
+ use Rack::Mux
15
+ use Rack::Lint
16
+ run lambda {|env| [200, {'Content-Type' => 'application/json'}, [env.to_json]] }
17
+ end
18
+ end
19
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-mux
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Ben Burkert
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-10-24 00:00:00 -07:00
19
+ default_executable:
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: rack
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: rack-client
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 1923832054
44
+ segments:
45
+ - 0
46
+ - 3
47
+ - 1
48
+ - pre
49
+ - c
50
+ version: 0.3.1.pre.c
51
+ type: :development
52
+ version_requirements: *id002
53
+ - !ruby/object:Gem::Dependency
54
+ name: rspec
55
+ prerelease: false
56
+ requirement: &id003 !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ hash: 3
62
+ segments:
63
+ - 0
64
+ version: "0"
65
+ type: :development
66
+ version_requirements: *id003
67
+ - !ruby/object:Gem::Dependency
68
+ name: rake
69
+ prerelease: false
70
+ requirement: &id004 !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ hash: 3
76
+ segments:
77
+ - 0
78
+ version: "0"
79
+ type: :development
80
+ version_requirements: *id004
81
+ - !ruby/object:Gem::Dependency
82
+ name: json
83
+ prerelease: false
84
+ requirement: &id005 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ hash: 3
90
+ segments:
91
+ - 0
92
+ version: "0"
93
+ type: :development
94
+ version_requirements: *id005
95
+ - !ruby/object:Gem::Dependency
96
+ name: mongrel
97
+ prerelease: false
98
+ requirement: &id006 !ruby/object:Gem::Requirement
99
+ none: false
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ hash: 3
104
+ segments:
105
+ - 0
106
+ version: "0"
107
+ type: :development
108
+ version_requirements: *id006
109
+ - !ruby/object:Gem::Dependency
110
+ name: ruby-debug
111
+ prerelease: false
112
+ requirement: &id007 !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ hash: 3
118
+ segments:
119
+ - 0
120
+ version: "0"
121
+ type: :development
122
+ version_requirements: *id007
123
+ description: Multiplex multiple rack servers to the same app.
124
+ email:
125
+ - ben@benburkert.com
126
+ executables: []
127
+
128
+ extensions: []
129
+
130
+ extra_rdoc_files: []
131
+
132
+ files:
133
+ - ./lib/rack/mux.rb
134
+ - ./spec/rack_mux_spec.rb
135
+ - ./spec/spec_helper.rb
136
+ has_rdoc: true
137
+ homepage: http://github.com/benburkert/rack-mux
138
+ licenses: []
139
+
140
+ post_install_message:
141
+ rdoc_options: []
142
+
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ">="
149
+ - !ruby/object:Gem::Version
150
+ hash: 3
151
+ segments:
152
+ - 0
153
+ version: "0"
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ none: false
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ hash: 3
160
+ segments:
161
+ - 0
162
+ version: "0"
163
+ requirements: []
164
+
165
+ rubyforge_project:
166
+ rubygems_version: 1.3.7
167
+ signing_key:
168
+ specification_version: 3
169
+ summary: Multiplex multiple rack servers to the same app.
170
+ test_files:
171
+ - ./spec/rack_mux_spec.rb
172
+ - ./spec/spec_helper.rb