rack-jsonp-tools 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.3.0
@@ -27,7 +27,7 @@ module Rack
27
27
  # Set proper content type as per RFC4329
28
28
  headers["Content-Type"] = "application/javascript"
29
29
 
30
- [status, headers, self]
30
+ [200, headers, self] # Override status
31
31
  else
32
32
  @app.call(env)
33
33
  end
@@ -1,9 +1,36 @@
1
1
  module Rack
2
2
  module JSONP
3
3
 
4
- class Callback
5
- # Coming soon!
4
+ class StatusWrapper
5
+ def initialize(app, callback_param = "_callback")
6
+ @app, @callback_param = app, callback_param
7
+ end
8
+
9
+ def call(env)
10
+ if env["jsonp.callback"]
11
+ # Call original app
12
+ status, headers, @body = @app.call(env)
13
+
14
+ # Wrap
15
+ @pre, @post = '{"body": ', ', "status": ' + status.to_s + '}'
16
+
17
+ # Fix content length if present
18
+ if content_length = headers["Content-Length"]
19
+ headers["Content-Length"] = (@pre.size + content_length.to_i + @post.size).to_s
20
+ end
21
+
22
+ [status, headers, self]
23
+ else
24
+ @app.call(env)
25
+ end
26
+ end
27
+
28
+ def each(&block)
29
+ block.call(@pre)
30
+ @body.each(&block)
31
+ block.call(@post)
32
+ end
6
33
  end
7
34
 
8
35
  end
9
- end
36
+ end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{rack-jsonp-tools}
8
- s.version = "0.2.0"
8
+ s.version = "0.3.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Jacek Becela"]
12
- s.date = %q{2010-06-21}
12
+ s.date = %q{2010-06-25}
13
13
  s.description = %q{A collection of rack middlewares helping you add JSONP to your app}
14
14
  s.email = %q{jacek.becela@gmail.com}
15
15
  s.files = [
@@ -23,6 +23,7 @@ Gem::Specification.new do |s|
23
23
  "rack-jsonp-tools.gemspec",
24
24
  "test/callback_test.rb",
25
25
  "test/method_override_test.rb",
26
+ "test/status_wrapper_test.rb",
26
27
  "test/test_helper.rb"
27
28
  ]
28
29
  s.homepage = %q{http://github.com/ncr/rack-jsonp-tools}
@@ -33,6 +34,7 @@ Gem::Specification.new do |s|
33
34
  s.test_files = [
34
35
  "test/callback_test.rb",
35
36
  "test/method_override_test.rb",
37
+ "test/status_wrapper_test.rb",
36
38
  "test/test_helper.rb"
37
39
  ]
38
40
 
@@ -3,7 +3,7 @@ require "rack/jsonp/callback"
3
3
 
4
4
  class CallbackTest < Test::Unit::TestCase
5
5
  def setup
6
- @status = 200
6
+ @status = 401
7
7
  @headers = { "Content-Type" => "application/json", "Content-Length" => "2" }
8
8
  @body = "{}"
9
9
  end
@@ -29,7 +29,7 @@ class CallbackTest < Test::Unit::TestCase
29
29
 
30
30
  expected_body = "callback(#{@body})"
31
31
 
32
- assert_equal @status, status
32
+ assert_equal 200, status
33
33
  assert_equal @headers, {
34
34
  "Content-Type" => "application/javascript",
35
35
  "Content-Length" => expected_body.size.to_s
@@ -0,0 +1,45 @@
1
+ require "test_helper"
2
+ require "rack/jsonp/status_wrapper"
3
+
4
+ class StatusWrapperTest < Test::Unit::TestCase
5
+ def setup
6
+ @status = 401
7
+ @body = "{ number: 666 }"
8
+ @headers = { "Content-Type" => "application/json", "Content-Length" => @body.size }
9
+ end
10
+
11
+ def app
12
+ app = Rack::Builder.new # instance_eval fail
13
+ app.use Rack::JSONP::Callback
14
+ app.use Rack::JSONP::StatusWrapper
15
+ app.run lambda { |env| [@status, @headers, [@body]] }
16
+ app
17
+ end
18
+
19
+ test "doesn't change anything when callback is missing" do
20
+ env = Rack::MockRequest.env_for("/")
21
+
22
+ status, headers, iterable = app.call(env)
23
+ body = ""; iterable.each { |l| body << l }
24
+
25
+ assert_equal @status, status
26
+ assert_equal @headers, headers
27
+ assert_equal @body, body
28
+ end
29
+
30
+ test "wraps response with status and updates headers" do
31
+ env = Rack::MockRequest.env_for("/?_callback=callback")
32
+
33
+ status, headers, iterable = app.call(env)
34
+ body = ""; iterable.each { |l| body << l }
35
+
36
+ expected_body = 'callback({"body": ' + @body + ', "status": ' + @status.to_s + '})'
37
+
38
+ assert_equal 200, status
39
+ assert_equal @headers, {
40
+ "Content-Type" => "application/javascript",
41
+ "Content-Length" => expected_body.size.to_s
42
+ }
43
+ assert_equal expected_body, body
44
+ end
45
+ end
metadata CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
6
  - 0
7
- - 2
7
+ - 3
8
8
  - 0
9
- version: 0.2.0
9
+ version: 0.3.0
10
10
  platform: ruby
11
11
  authors:
12
12
  - Jacek Becela
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-06-21 00:00:00 +02:00
17
+ date: 2010-06-25 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -73,6 +73,7 @@ files:
73
73
  - rack-jsonp-tools.gemspec
74
74
  - test/callback_test.rb
75
75
  - test/method_override_test.rb
76
+ - test/status_wrapper_test.rb
76
77
  - test/test_helper.rb
77
78
  has_rdoc: true
78
79
  homepage: http://github.com/ncr/rack-jsonp-tools
@@ -107,4 +108,5 @@ summary: Add JSONP support to your app in less than 3 minutes! Method Override i
107
108
  test_files:
108
109
  - test/callback_test.rb
109
110
  - test/method_override_test.rb
111
+ - test/status_wrapper_test.rb
110
112
  - test/test_helper.rb