rack-mux 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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