rack-jsonp-tools 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/.gitignore ADDED
@@ -0,0 +1 @@
1
+ pkg
data/Rakefile ADDED
@@ -0,0 +1,29 @@
1
+ require "rake/testtask"
2
+
3
+ task :test do
4
+ Rake::TestTask.new do |t|
5
+ t.libs << "test"
6
+ t.test_files = FileList['test/*_test.rb']
7
+ t.verbose = true
8
+ end
9
+ end
10
+
11
+ task :default => :test
12
+
13
+ begin
14
+ require 'jeweler'
15
+ Jeweler::Tasks.new do |gem|
16
+ gem.name = "rack-jsonp-tools"
17
+ gem.summary = "Add JSONP support to your app in less than 3 minutes! Method Override included for free!"
18
+ gem.description = "A collection of rack middlewares helping you add JSONP to your app"
19
+ gem.email = "jacek.becela@gmail.com"
20
+ gem.homepage = "http://github.com/ncr/rack-jsonp-tools"
21
+ gem.authors = ["Jacek Becela"]
22
+ gem.add_dependency "rack"
23
+ gem.add_development_dependency "rack-test"
24
+ gem.add_development_dependency "test-unit", ">= 2.0"
25
+ end
26
+ Jeweler::GemcutterTasks.new
27
+ rescue LoadError
28
+ puts "Jeweler not available. Install it with: gem install jeweler"
29
+ end
data/Readme ADDED
@@ -0,0 +1 @@
1
+ Add JSONP support to your app in less than 3 minutes! Method Override included for free!
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,61 @@
1
+ require "rack/jsonp/utils"
2
+
3
+ module Rack
4
+ module JSONP
5
+
6
+ class Callback
7
+ def initialize(app, callback_param = "_callback")
8
+ @app, @callback_param = app, callback_param
9
+ end
10
+
11
+ def call(env)
12
+ request = Rack::Request.new(env)
13
+
14
+ if callback = request.params[@callback_param]
15
+ # Save for underlying middlewares
16
+ env["jsonp.callback"] = callback
17
+
18
+ # Remove callback param and value from query string
19
+ Utils.remove_param(env, @callback_param)
20
+
21
+
22
+ # Call original app
23
+ status, headers, body = @app.call(env)
24
+
25
+ # Wrap body with callback
26
+ pre, post = "#{callback}(", ")"
27
+ body = Wrapper.new(pre, body, post)
28
+
29
+ # Fix content length if present
30
+ if content_length = headers["Content-Length"]
31
+ headers["Content-Length"] = (pre.size + content_length.to_i + post.size).to_s
32
+ end
33
+
34
+ # Set proper content type as per RFC4329
35
+ headers["Content-Type"] = "application/javascript"
36
+
37
+ [status, headers, body]
38
+ else
39
+ @app.call(env)
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ class Wrapper
46
+ def initialize(pre, body, post)
47
+ @pre, @body, @post = pre, body, post
48
+ end
49
+
50
+ def each(&block)
51
+ block.call(@pre)
52
+ @body.each(&block)
53
+ block.call(@post)
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+
60
+ end
61
+ end
@@ -0,0 +1,23 @@
1
+ require "rack/jsonp/utils"
2
+
3
+ module Rack
4
+ module JSONP
5
+
6
+ class MethodOverride
7
+ def initialize(app, method_param = "_method")
8
+ @app, @method_param = app, method_param
9
+ end
10
+
11
+ def call(env)
12
+ if env["jsonp.callback"] && method = Rack::Request.new(env).params[@method_param]
13
+ Utils.remove_param(env, @method_param)
14
+ method.upcase!
15
+ env["REQUEST_METHOD"] = %w(GET HEAD PUT POST DELETE OPTIONS).include?(method) ? method : "GET"
16
+ end
17
+
18
+ @app.call(env)
19
+ end
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,9 @@
1
+ module Rack
2
+ module JSONP
3
+
4
+ class Callback
5
+ # Coming soon!
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Rack
2
+ module JSONP
3
+ module Utils
4
+
5
+ def remove_param(env, param)
6
+ env["QUERY_STRING"].gsub!(/#{Regexp.escape(param)}=[^&;]*/, "")
7
+ end
8
+ module_function :remove_param
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,59 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{rack-jsonp-tools}
8
+ s.version = "0.1.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Jacek Becela"]
12
+ s.date = %q{2010-01-14}
13
+ s.description = %q{A collection of rack middlewares helping you add JSONP to your app}
14
+ s.email = %q{jacek.becela@gmail.com}
15
+ s.files = [
16
+ ".gitignore",
17
+ "Rakefile",
18
+ "Readme",
19
+ "VERSION",
20
+ "lib/rack/jsonp/callback.rb",
21
+ "lib/rack/jsonp/method_override.rb",
22
+ "lib/rack/jsonp/status_wrapper.rb",
23
+ "lib/rack/jsonp/utils.rb",
24
+ "rack-jsonp-tools.gemspec",
25
+ "test/callback_test.rb",
26
+ "test/method_override_test.rb",
27
+ "test/test_helper.rb"
28
+ ]
29
+ s.homepage = %q{http://github.com/ncr/rack-jsonp-tools}
30
+ s.rdoc_options = ["--charset=UTF-8"]
31
+ s.require_paths = ["lib"]
32
+ s.rubygems_version = %q{1.3.5}
33
+ s.summary = %q{Add JSONP support to your app in less than 3 minutes! Method Override included for free!}
34
+ s.test_files = [
35
+ "test/callback_test.rb",
36
+ "test/method_override_test.rb",
37
+ "test/test_helper.rb"
38
+ ]
39
+
40
+ if s.respond_to? :specification_version then
41
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
42
+ s.specification_version = 3
43
+
44
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
45
+ s.add_runtime_dependency(%q<rack>, [">= 0"])
46
+ s.add_development_dependency(%q<rack-test>, [">= 0"])
47
+ s.add_development_dependency(%q<test-unit>, [">= 2.0"])
48
+ else
49
+ s.add_dependency(%q<rack>, [">= 0"])
50
+ s.add_dependency(%q<rack-test>, [">= 0"])
51
+ s.add_dependency(%q<test-unit>, [">= 2.0"])
52
+ end
53
+ else
54
+ s.add_dependency(%q<rack>, [">= 0"])
55
+ s.add_dependency(%q<rack-test>, [">= 0"])
56
+ s.add_dependency(%q<test-unit>, [">= 2.0"])
57
+ end
58
+ end
59
+
@@ -0,0 +1,42 @@
1
+ require "test_helper"
2
+ require "rack/jsonp/callback"
3
+
4
+ class CallbackTest < Test::Unit::TestCase
5
+
6
+ def setup
7
+ @status = 200
8
+ @headers = { "Content-Type" => "application/json", "Content-Length" => "2" }
9
+ @body = "{}"
10
+ end
11
+
12
+ test "doesn't change anything when callback is missing" do
13
+ env = Rack::MockRequest.env_for("/")
14
+ app = Rack::JSONP::Callback.new(lambda { |env| [@status, @headers, [@body]] })
15
+
16
+ status, headers, iterable = app.call(env)
17
+ body = ""; iterable.each { |l| body << l }
18
+
19
+ assert_equal @status, status
20
+ assert_equal @headers, headers
21
+ assert_equal @body, body
22
+ end
23
+
24
+ test "wraps response with callback and updates headers" do
25
+ env = Rack::MockRequest.env_for("/?_callback=callback")
26
+ app = Rack::JSONP::Callback.new(lambda { |env| [@status, @headers, [@body]] })
27
+
28
+ status, headers, iterable = app.call(env)
29
+ body = ""; iterable.each { |l| body << l }
30
+
31
+ expected_body = "callback(#{@body})"
32
+
33
+ assert_equal @status, status
34
+ assert_equal @headers, {
35
+ "Content-Type" => "application/javascript",
36
+ "Content-Length" => expected_body.size.to_s
37
+ }
38
+ assert_equal expected_body, body
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,13 @@
1
+ require "test_helper"
2
+ require "rack/jsonp/method_override"
3
+
4
+ class CallbackTest < Test::Unit::TestCase
5
+
6
+ test "doesn't change anything when method is missing" do
7
+ env = Rack::MockRequest.env_for("/?_method=post", :method => "GET", "jsonp.callback" => true)
8
+ app = Rack::JSONP::MethodOverride.new(lambda { |env| Rack::Request.new(env) })
9
+ req = app.call(env)
10
+
11
+ assert_equal "POST", req.env["REQUEST_METHOD"]
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ require "rubygems"
2
+
3
+ gem "test-unit"
4
+
5
+ require "test/unit"
6
+ require "rack"
7
+ require "rack/mock"
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-jsonp-tools
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jacek Becela
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2010-01-14 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rack
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: rack-test
27
+ type: :development
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: "0"
34
+ version:
35
+ - !ruby/object:Gem::Dependency
36
+ name: test-unit
37
+ type: :development
38
+ version_requirement:
39
+ version_requirements: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: "2.0"
44
+ version:
45
+ description: A collection of rack middlewares helping you add JSONP to your app
46
+ email: jacek.becela@gmail.com
47
+ executables: []
48
+
49
+ extensions: []
50
+
51
+ extra_rdoc_files: []
52
+
53
+ files:
54
+ - .gitignore
55
+ - Rakefile
56
+ - Readme
57
+ - VERSION
58
+ - lib/rack/jsonp/callback.rb
59
+ - lib/rack/jsonp/method_override.rb
60
+ - lib/rack/jsonp/status_wrapper.rb
61
+ - lib/rack/jsonp/utils.rb
62
+ - rack-jsonp-tools.gemspec
63
+ - test/callback_test.rb
64
+ - test/method_override_test.rb
65
+ - test/test_helper.rb
66
+ has_rdoc: true
67
+ homepage: http://github.com/ncr/rack-jsonp-tools
68
+ licenses: []
69
+
70
+ post_install_message:
71
+ rdoc_options:
72
+ - --charset=UTF-8
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: "0"
80
+ version:
81
+ required_rubygems_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ version: "0"
86
+ version:
87
+ requirements: []
88
+
89
+ rubyforge_project:
90
+ rubygems_version: 1.3.5
91
+ signing_key:
92
+ specification_version: 3
93
+ summary: Add JSONP support to your app in less than 3 minutes! Method Override included for free!
94
+ test_files:
95
+ - test/callback_test.rb
96
+ - test/method_override_test.rb
97
+ - test/test_helper.rb