pow_proxy 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/.gemtest ADDED
File without changes
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --color
2
+ --format=nested
3
+ --backtrace
data/.simplecov ADDED
@@ -0,0 +1 @@
1
+ SimpleCov.start
data/.yardopts ADDED
@@ -0,0 +1,3 @@
1
+ --markup markdown
2
+ -
3
+ LICENSE.md
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in pow_proxy.gemspec
4
+ gemspec
data/LICENSE.md ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Steve Agalloco, Assaf Arkin
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require 'bundler'
4
+ Bundler::GemHelper.install_tasks
5
+
6
+ require 'rspec/core/rake_task'
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ task :default => :spec
10
+ task :test => :spec
11
+
12
+ require 'yard'
13
+ namespace :doc do
14
+ YARD::Rake::YardocTask.new do |task|
15
+ task.files = ['LICENSE.md', 'lib/**/*.rb']
16
+ task.options = ['--markup', 'markdown']
17
+ end
18
+ end
data/Readme.md ADDED
@@ -0,0 +1,32 @@
1
+ PowProxy
2
+ ========
3
+
4
+ PowProxy is a simple rack-based proxy that allows you to run your node apps through [Pow](http://pow.cx).
5
+
6
+ PowProxy is based on a blog post by [Assaf Arkin](/assaf). It's super easy to use. You really should just read [Assaf's blog post](http://labnotes.org/2011/08/09/using-pow-with-your-node-js-project/) to get the full explanation.
7
+
8
+ Usage
9
+ -----
10
+
11
+ Create a `config.ru` file in your project's root with the following:
12
+
13
+ ```ruby
14
+ require 'pow_proxy'
15
+ run PowProxy.new
16
+ ```
17
+
18
+ By default, it assumes the host to be `localhost` and the port to be `3000` however you can configure that to be anything you'd like:
19
+
20
+ ```ruby
21
+ require 'pow_proxy'
22
+ run PowProxy.new(:host => '127.0.0.1', :port => 8080)
23
+ ```
24
+
25
+ You can also set the host and port by exporting the `POW_PROXY_HOST` and `POW_PROXY_PORT` environment variables in your `.powenv`.
26
+
27
+ Make sure your node app is running, symlink your app so that Pow knows about it and you'll be all set.
28
+
29
+ Copyright
30
+ ---------
31
+
32
+ Copyright (c) 2011 Steve Agalloco, Assaf Arkin. See [LICENSE](LICENSE.md) for details.
data/lib/pow_proxy.rb ADDED
@@ -0,0 +1,39 @@
1
+ require "net/http"
2
+ require "rack"
3
+
4
+ class PowProxy
5
+ DEFAULT_HOST = "127.0.0.1"
6
+ DEFAULT_PORT = 3000
7
+
8
+ attr_reader :host, :port
9
+
10
+ def initialize(options = {})
11
+ @host = options.delete(:host) || ENV['POW_PROXY_HOST'] || DEFAULT_HOST
12
+ @port = options.delete(:port) || ENV['POW_PROXY_PORT'] || DEFAULT_PORT
13
+ end
14
+
15
+ def call(env)
16
+ begin
17
+ request = Rack::Request.new(env)
18
+ headers = {}
19
+ env.each do |key, value|
20
+ if key =~ /^http_(.*)/i
21
+ headers[$1] = value
22
+ end
23
+ end
24
+
25
+ headers["Content-Type"] = request.content_type if request.content_type
26
+ headers["Content-Length"] = request.content_length if request.content_length
27
+
28
+ http = Net::HTTP.new(@host, @port)
29
+ http.start do |http|
30
+ response = http.send_request(request.request_method, request.fullpath, request.body.read, headers)
31
+ headers = response.to_hash
32
+ headers.delete "transfer-encoding"
33
+ [response.code, headers, [response.body]]
34
+ end
35
+ rescue Errno::ECONNREFUSED
36
+ [500, {}, ["Could not establish a connection to #{@host}:#{@port}, make sure your node process is running."]]
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,3 @@
1
+ class PowProxy
2
+ VERSION = "0.1.0"
3
+ end
data/pow_proxy.gemspec ADDED
@@ -0,0 +1,26 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/pow_proxy/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = "pow_proxy"
6
+ gem.version = PowProxy::VERSION
7
+
8
+ gem.authors = ["Steve Agalloco"]
9
+ gem.email = ["steve.agalloco@gmail.com"]
10
+ gem.description = 'A simple rack-based proxy that allows you to run your node apps through Pow.'
11
+ gem.summary = gem.description
12
+ gem.homepage = "https://github.com/spagalloco/pow_proxy"
13
+
14
+ gem.add_dependency 'rack'
15
+ gem.add_development_dependency 'rake', '~> 0.9'
16
+ gem.add_development_dependency 'rdiscount', '~> 1.6'
17
+ gem.add_development_dependency 'rspec', '~> 2.7'
18
+ gem.add_development_dependency 'simplecov', '~> 0.5'
19
+ gem.add_development_dependency 'yard', '~> 0.7'
20
+ gem.add_development_dependency 'webmock', '~> 1.7'
21
+
22
+ gem.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
23
+ gem.files = `git ls-files`.split("\n")
24
+ gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
25
+ gem.require_paths = ["lib"]
26
+ end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe PowProxy do
4
+
5
+ describe '.new' do
6
+ context 'defaults' do
7
+ before do
8
+ @proxy = PowProxy.new
9
+ end
10
+
11
+ it 'defaults the host to "127.0.0.1"' do
12
+ @proxy.host.should eq('127.0.0.1')
13
+ end
14
+
15
+ it 'defaults the port to 3000' do
16
+ @proxy.port.should eq(3000)
17
+ end
18
+ end
19
+
20
+ context 'options' do
21
+ before do
22
+ @proxy = PowProxy.new(:host => 'localhost2', :port => 4242)
23
+ end
24
+
25
+ it 'sets the host to "localhost2"' do
26
+ @proxy.host.should eq('localhost2')
27
+ end
28
+
29
+ it 'sets the port to 4242' do
30
+ @proxy.port.should eq(4242)
31
+ end
32
+ end
33
+
34
+ context 'ENV' do
35
+ before do
36
+ ENV['POW_PROXY_HOST'] = 'monk.local'
37
+ ENV['POW_PROXY_PORT'] = '8080'
38
+ @proxy = PowProxy.new
39
+ end
40
+
41
+ it 'defaults the host to "monk.local"' do
42
+ @proxy.host.should eq('monk.local')
43
+ end
44
+
45
+ it 'defaults the port to 8080' do
46
+ @proxy.port.should eq('8080')
47
+ end
48
+ end
49
+ end
50
+
51
+ describe 'integration' do
52
+ before do
53
+ @proxy = PowProxy.new(:host => 'app.local', :port => 2121)
54
+ end
55
+
56
+ it 'returns the requested content' do
57
+ stub_request(:get, "http://app.local:2121/").
58
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
59
+ to_return(:status => 200, :body => "abcdefg", :headers => {})
60
+
61
+ env = { "REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/", "rack.input" => StringIO.new }
62
+ response = @proxy.call(env)
63
+ body = response.last.shift
64
+ body.should eq('abcdefg')
65
+ end
66
+
67
+ it 'removes the transfer-encoding header from the response' do
68
+ stub_request(:get, "http://app.local:2121/").
69
+ with(:headers => {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
70
+ to_return(:status => 200, :body => "abcdefg", :headers => { 'Transfer-Encoding' => 'chunked'})
71
+
72
+ env = { "REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/", "rack.input" => StringIO.new }
73
+ response = @proxy.call(env)
74
+ headers = response[1]
75
+ headers.should_not have_key('transfer-encoding')
76
+ end
77
+
78
+ it 'passes headers to the node server' do
79
+ stub_request(:get, "http://app.local:2121/").
80
+ with(:headers => {'Accept'=>'*/*', 'Accept-Encoding'=>'gzip,deflate,sdch', 'User-Agent'=>'Ruby'}).
81
+ to_return(:status => 200, :body => "abcdefg", :headers => {})
82
+
83
+ env = { "REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/", "rack.input" => StringIO.new, 'HTTP_ACCEPT_ENCODING' => "gzip,deflate,sdch" }
84
+ response = @proxy.call(env)
85
+ body = response.last.shift
86
+ body.should eq('abcdefg')
87
+ end
88
+
89
+ it 'reports an error when it cannot request to the node server' do
90
+ Rack::Request.stub(:new).and_raise(Errno::ECONNREFUSED)
91
+
92
+ env = { "REQUEST_METHOD"=>"GET", "PATH_INFO"=>"/", "rack.input" => StringIO.new }
93
+ response = @proxy.call(env)
94
+ response.first.should eq(500)
95
+ body = response.last.shift
96
+ body.should match(/Could not establish a connection/)
97
+ end
98
+ end
99
+
100
+ end
@@ -0,0 +1,6 @@
1
+ $:.unshift File.expand_path('..', __FILE__)
2
+ $:.unshift File.expand_path('../../lib', __FILE__)
3
+ require 'simplecov'
4
+ require 'pow_proxy'
5
+ require 'rspec'
6
+ require 'webmock/rspec'
metadata ADDED
@@ -0,0 +1,140 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pow_proxy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Steve Agalloco
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2011-11-11 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rack
16
+ requirement: &70320649561140 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *70320649561140
25
+ - !ruby/object:Gem::Dependency
26
+ name: rake
27
+ requirement: &70320649560440 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ~>
31
+ - !ruby/object:Gem::Version
32
+ version: '0.9'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: *70320649560440
36
+ - !ruby/object:Gem::Dependency
37
+ name: rdiscount
38
+ requirement: &70320649559560 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ~>
42
+ - !ruby/object:Gem::Version
43
+ version: '1.6'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70320649559560
47
+ - !ruby/object:Gem::Dependency
48
+ name: rspec
49
+ requirement: &70320649559100 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.7'
55
+ type: :development
56
+ prerelease: false
57
+ version_requirements: *70320649559100
58
+ - !ruby/object:Gem::Dependency
59
+ name: simplecov
60
+ requirement: &70320649549540 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ~>
64
+ - !ruby/object:Gem::Version
65
+ version: '0.5'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70320649549540
69
+ - !ruby/object:Gem::Dependency
70
+ name: yard
71
+ requirement: &70320649549080 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '0.7'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *70320649549080
80
+ - !ruby/object:Gem::Dependency
81
+ name: webmock
82
+ requirement: &70320649548620 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '1.7'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *70320649548620
91
+ description: A simple rack-based proxy that allows you to run your node apps through
92
+ Pow.
93
+ email:
94
+ - steve.agalloco@gmail.com
95
+ executables: []
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - .gemtest
100
+ - .gitignore
101
+ - .rspec
102
+ - .simplecov
103
+ - .yardopts
104
+ - Gemfile
105
+ - LICENSE.md
106
+ - Rakefile
107
+ - Readme.md
108
+ - lib/pow_proxy.rb
109
+ - lib/pow_proxy/version.rb
110
+ - pow_proxy.gemspec
111
+ - spec/pow_proxy_spec.rb
112
+ - spec/spec_helper.rb
113
+ homepage: https://github.com/spagalloco/pow_proxy
114
+ licenses: []
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ none: false
121
+ requirements:
122
+ - - ! '>='
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ required_rubygems_version: !ruby/object:Gem::Requirement
126
+ none: false
127
+ requirements:
128
+ - - ! '>='
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
131
+ requirements: []
132
+ rubyforge_project:
133
+ rubygems_version: 1.8.10
134
+ signing_key:
135
+ specification_version: 3
136
+ summary: A simple rack-based proxy that allows you to run your node apps through Pow.
137
+ test_files:
138
+ - spec/pow_proxy_spec.rb
139
+ - spec/spec_helper.rb
140
+ has_rdoc: