rack-iframe 0.0.1

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,9 @@
1
+ .DS_Store
2
+ .bundle
3
+ .rbx
4
+ .*~
5
+ Gemfile.lock
6
+ pkg/*
7
+ *.gem
8
+ *.rbc
9
+ *~
data/.travis.yml ADDED
@@ -0,0 +1,10 @@
1
+ rvm:
2
+ - 1.8.7
3
+ - 1.9.2
4
+ - ree
5
+ - ruby-head
6
+ - rbx
7
+ - rbx-2.0
8
+ - jruby
9
+ notifications:
10
+ disabled: true
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ source "http://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :test do
6
+ group :darwin do
7
+ gem 'rb-fsevent'
8
+ end
9
+ end
data/Guardfile ADDED
@@ -0,0 +1,10 @@
1
+ guard 'bundler' do
2
+ watch('Gemfile')
3
+ watch(/^.+\.gemspec/)
4
+ end
5
+
6
+ guard 'minitest' do
7
+ watch(%r|^spec/(.*)_spec\.rb|)
8
+ watch(%r|^lib/(.*)\.rb|) { |m| "spec" }
9
+ watch(%r|^spec/spec_helper\.rb|) { "spec" }
10
+ end
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Jonas Grimfelt, Jaakko Suuturla, Merchii. http://merchii.com
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/README.textile ADDED
@@ -0,0 +1,65 @@
1
+ h1. RACK-IFRAME "!https://secure.travis-ci.org/merchii/rack-iframe.png!":http://travis-ci.org/merchii/rack-iframe
2
+
3
+ _Rack middleware for enabling problematic web browsers (Internet Explorer and Safari) to use same cookies in iframes as in parent windows._
4
+
5
+ h2. Background
6
+
7
+ Best described via:
8
+
9
+ * "http://tempe.st/tag/ruby-on-rails":http://tempe.st/tag/ruby-on-rails
10
+ * "http://groups.google.com/group/rack-devel/browse_thread/thread/11da5971522b107b":http://groups.google.com/group/rack-devel/browse_thread/thread/11da5971522b107b
11
+ * "http://grack.com/blog/2010/01/06/3rd-party-cookies-dom-storage-and-privacy":http://grack.com/blog/2010/01/06/3rd-party-cookies-dom-storage-and-privacy
12
+ * "http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari":http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari
13
+
14
+ h2. Installation
15
+
16
+ Add to your @Gemfile@:
17
+
18
+ <pre>
19
+ gem 'rack-iframe'
20
+ </pre>
21
+
22
+ ...and @bundle install@.
23
+
24
+ h2. Usage
25
+
26
+ *Minimal:*
27
+
28
+ <pre>
29
+ require 'rack/iframe'
30
+
31
+ use Rack::Iframe
32
+ </pre>
33
+
34
+ *Custom - P3P header:*
35
+
36
+ <pre>
37
+ require 'rack/iframe'
38
+
39
+ use Rack::Iframe, :p3p => %(CP="NOI DSP LAW NID")
40
+ </pre>
41
+
42
+ h2. Test
43
+
44
+ <pre>
45
+ $ bundle exec rake test
46
+ </pre>
47
+
48
+ ...or using "Guard":http://github.com/guard/guard:
49
+
50
+ <pre>
51
+ $ bundle exec guard
52
+ </pre>
53
+
54
+ h2. Notes
55
+
56
+ This gem was developed for our own requirements at *"Merchii":http://github.com/merchii*, so feel free to send pull-requests with enhancements of any kind (features, bug-fixes, documentation, tests, etc.) to make it better or useful for you as well.
57
+
58
+ h2. To-Do
59
+
60
+ Still not ready for prime-time. See "TODO":https://github.com/merchii/rack-iframe/blob/master/TODO.
61
+
62
+ h2. License
63
+
64
+ Released under the MIT license.
65
+ Copyright (c) "Jonas Grimfelt":http://github.com/grimen, "Jaakko Suutarla":http://github.com/jaakkos, "Merchii":http://github.com/merchii
data/Rakefile ADDED
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rake/testtask'
3
+
4
+ task :default => :test
5
+
6
+ Rake::TestTask.new do |t|
7
+ t.libs << ['lib', 'spec']
8
+ t.pattern = "spec/*_spec.rb"
9
+ end
data/TODO ADDED
@@ -0,0 +1,24 @@
1
+
2
+ == CURRENT/NEXT
3
+
4
+ x [feature/issue]: Fix/Review "Last-Modified" HTTP cache header case - to comply with W3C spec.
5
+
6
+ - [feature]: Track if P3P-headers should be sent via cookie. Reason: We can't assume that only bodies that contain <iframe>-elements needs the P3P header (or so I think right now).
7
+
8
+ - [feature]: Add option to send 304 headers but delete "Set-Cookie"-header - not allowed by spec, but seems to work in most browsers/servers anyway.
9
+
10
+
11
+ == LOW-PRIO
12
+
13
+ - [refactor/enhancement]: Use 'useragent' gem to parse 'USER_AGENT'-header - https://rubygems.org/gems/useragent
14
+
15
+ - [refactor/test]: Use proper integration testing, i.e. mocks/env => Sinatra/headers.
16
+
17
+
18
+ == MAYBE
19
+
20
+ - [feature]: Optionally silently/evily inject "the cross-domain iframe JavaScript hack" for Safari - or specified user agents - into the body response. >:)
21
+
22
+ - [feature]: Support for policy reference file. http://www.w3.org/TR/P3P/#ref_file
23
+
24
+ - [feature]: Support for specifying compact policies by configuration. http://www.w3.org/TR/P3P/#compact_policies http://www.p3pwriter.com/LRN_111.asp
@@ -0,0 +1,71 @@
1
+ require 'rack'
2
+ require 'rack/iframe/version'
3
+ require 'digest/md5'
4
+
5
+ module Rack
6
+ class Iframe
7
+
8
+ DEFAULT_P3P = %(CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV").freeze
9
+
10
+ def initialize(app, options = {})
11
+ @app, @options = app, options
12
+ @options[:p3p] ||= DEFAULT_P3P
13
+ end
14
+
15
+ def call(env)
16
+ # 1) If P3P: Set a random Etag (If-None-Match) to trick backend to not send cached response (304).
17
+ set_invalid_etag!(env) if set_p3p_header?(env)
18
+
19
+ # 2) Request
20
+ @status, @headers, @body = @app.call(env)
21
+
22
+ # 3) If P3P: Attach P3P header.
23
+ set_p3p_header! if set_p3p_header?(env)
24
+
25
+ # 4) Response
26
+ [@status, @headers, @body]
27
+ end
28
+
29
+ protected
30
+
31
+ def user_agent(env)
32
+ env['HTTP_USER_AGENT']
33
+ end
34
+
35
+ def set_invalid_etag!(env)
36
+ env['HTTP_IF_NONE_MATCH'] = Digest::MD5.hexdigest(Time.now.to_s)
37
+ end
38
+
39
+ def set_p3p_header!
40
+ @headers['P3P'] = @options[:p3p]
41
+ end
42
+
43
+ def set_p3p_header?(env)
44
+ user_agents?([:ie, :safari], env)
45
+ end
46
+
47
+ def user_agent?(id, env)
48
+ case id
49
+ when :ie
50
+ user_agent(env).include?('MSIE')
51
+ when :safari
52
+ user_agent(env).include?('Safari')
53
+ when :opera
54
+ user_agent(env).include?('Chrome')
55
+ when :opera
56
+ user_agent(env).include?('Opera')
57
+ when :firefox
58
+ user_agent(env).include?('Firefox')
59
+ else
60
+ raise "Define missing browser agent: #{id.inspect}"
61
+ end
62
+ end
63
+
64
+ def user_agents?(ids, env)
65
+ [*ids].any? do |id|
66
+ user_agent?(id, env)
67
+ end
68
+ end
69
+
70
+ end
71
+ end
@@ -0,0 +1,5 @@
1
+ module Rack
2
+ class Iframe
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "rack/iframe/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "rack-iframe"
7
+ s.version = Rack::Iframe::VERSION
8
+ s.authors = ["Merchii", "Jonas Grimfelt", "Jaakko Suuturla"]
9
+ s.email = ["operations@merchii.com", "grimen@gmail.com", "jaakko@suutarla.com"]
10
+ s.homepage = "http://github.com/merchii/rack-iframe"
11
+ s.summary = %q{Rack middleware for enabling problematic web browsers (Internet Explorer and Safari) to use same cookies in iframes as in parent windows.}
12
+ s.description = s.summary
13
+
14
+ s.rubyforge_project = s.name
15
+
16
+ s.files = `git ls-files`.split("\n")
17
+ s.test_files = `git ls-files -- spec/*`.split("\n")
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ["lib"]
20
+
21
+ s.add_runtime_dependency 'rack'
22
+
23
+ s.add_development_dependency 'rake'
24
+ s.add_development_dependency 'bundler'
25
+ s.add_development_dependency 'minitest'
26
+ s.add_development_dependency 'guard'
27
+ s.add_development_dependency 'guard-bundler'
28
+ s.add_development_dependency 'guard-minitest'
29
+ s.add_development_dependency 'rack-test'
30
+ s.add_development_dependency 'rack-cache'
31
+ s.add_development_dependency 'chronic'
32
+ s.add_development_dependency 'awesome_print'
33
+ s.add_development_dependency 'sinatra'
34
+ end
@@ -0,0 +1,192 @@
1
+ require 'spec_helper'
2
+
3
+ # == References:
4
+ # - http://tempe.st/tag/ruby-on-rails
5
+ # - http://groups.google.com/group/rack-devel/browse_thread/thread/11da5971522b107b
6
+ # - http://grack.com/blog/2010/01/06/3rd-party-cookies-dom-storage-and-privacy
7
+ # - http://anantgarg.com/2010/02/18/cross-domain-cookies-in-safari
8
+
9
+ describe Rack::Iframe do
10
+
11
+ describe "VERSION" do
12
+ it 'should be defined' do
13
+ defined?(::Rack::Iframe::VERSION)
14
+ end
15
+
16
+ it 'should be a valid version string (e.g. "0.0.1", or "0.0.1.rc1")' do
17
+ valid_version_string = /^\d+\.\d+\.\d+/
18
+ Rack::Iframe::VERSION.must_match valid_version_string
19
+ end
20
+ end
21
+
22
+ describe "Middleware" do
23
+ before do
24
+ @app = CachedApp.new
25
+ end
26
+
27
+ describe "without Rack::Iframe" do
28
+ before do
29
+ @user_agents = all_user_agents
30
+ end
31
+
32
+ it 'should not have P3P headers' do
33
+ @user_agents.each do |user_agent|
34
+ request = mock_request(user_agent)
35
+
36
+ response = @app.call(request)
37
+ status, headers, body = response
38
+
39
+ headers.key?('P3P').must_equal false
40
+ end
41
+ end
42
+ end
43
+
44
+ describe "with Rack::Iframe" do
45
+ describe "browsers that require the P3P header: IE, Safari" do
46
+ before do
47
+ @user_agents = [:ie, :safari]
48
+ end
49
+
50
+ describe "without any HTTP-cache headers" do
51
+ it 'should send P3P header - modified (200 OK)' do
52
+ @user_agents.each do |user_agent|
53
+ request = mock_request(user_agent)
54
+
55
+ response = Rack::Iframe.new(@app).call(request)
56
+ status, headers, body = response
57
+
58
+ headers['P3P'].must_equal %(CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV")
59
+ status.must_equal 200 # modified
60
+ end
61
+ end
62
+ end
63
+
64
+ # NOTE: P3P headers with HTTP-cache headers don't work well.
65
+
66
+ describe "with HTTP-cache headers" do
67
+ describe "If-None-Match (Etag)" do
68
+ it 'should send P3P header - modified (200 OK)' do
69
+ @user_agents.each do |user_agent|
70
+ @app = mock_app('Etag' => '123')
71
+
72
+ request = mock_request(user_agent, 'HTTP_IF_NONE_MATCH' => '123')
73
+
74
+ response = Rack::Iframe.new(@app).call(request)
75
+ status, headers, body = response
76
+
77
+ headers['P3P'].must_equal %(CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV")
78
+ status.must_equal 200 # modified
79
+ end
80
+ end
81
+ end
82
+
83
+ describe "Last-Modified" do
84
+ it 'should send P3P header - modified (200 OK)' do
85
+ skip
86
+ # @user_agents.each do |user_agent|
87
+ # @app = mock_app('Last-Modified' => Chronic.parse('0 minutes ago').rfc2822)
88
+
89
+ # request = mock_request(user_agent, 'HTTP_IF_MODIFIED_SINCE' => Chronic.parse('1 minute ago').rfc2822)
90
+
91
+ # response = Rack::Iframe.new(@app).call(request)
92
+ # status, headers, body = response
93
+
94
+ # headers['P3P'].must_equal %(CP="ALL DSP COR CURa ADMa DEVa OUR IND COM NAV")
95
+ # status.must_equal 200 # modified
96
+ # end
97
+ end
98
+ end
99
+ end
100
+
101
+ describe "custom middleware-arguments" do
102
+ it 'should use custom P3P header if specified via options as :p3p' do
103
+ request = mock_request(:ie)
104
+
105
+ response = Rack::Iframe.new(@app, :p3p => %(CP="NOI DSP LAW NID")).call(request)
106
+ status, headers, body = response
107
+
108
+ headers['P3P'].must_equal %(CP="NOI DSP LAW NID")
109
+ end
110
+ end
111
+ end
112
+
113
+ describe "browsers that don't require the P3P header: Chrome, Firefox, Opera" do
114
+ before do
115
+ @user_agents = all_user_agents - [:ie, :safari]
116
+ end
117
+
118
+ describe "without any HTTP-cache headers" do
119
+ it 'should not send P3P header - modified (200 OK)' do
120
+ @user_agents.each do |user_agent|
121
+ @app = mock_app()
122
+
123
+ request = mock_request(user_agent)
124
+
125
+ response = Rack::Iframe.new(@app).call(request)
126
+ status, headers, body = response
127
+
128
+ headers.key?('P3P').must_equal false
129
+ status.must_equal 200 # modified
130
+ end
131
+ end
132
+ end
133
+
134
+ describe "with HTTP-cache headers" do
135
+ describe "If-None-Match (Etag)" do
136
+ it 'should not send P3P header - not modified (304 Not Modified)' do
137
+ @user_agents.each do |user_agent|
138
+ @app = mock_app('Etag' => '123')
139
+
140
+ request = mock_request(user_agent, 'HTTP_IF_NONE_MATCH' => '123')
141
+
142
+ response = Rack::Iframe.new(@app).call(request)
143
+ status, headers, body = response
144
+
145
+ headers.key?('P3P').must_equal false
146
+ status.must_equal 304 # not modified
147
+
148
+ # browser = Rack::Test::Session.new(Rack::MockSession.new(CachedApp))
149
+ # browser.get '/', {}, 'HTTP_IF_NONE_MATCH' => '123'
150
+
151
+ # browser.last_response.headers.key?('P3P').must_equal false
152
+ # browser.last_response.status.must_equal 304
153
+ end
154
+ end
155
+ end
156
+
157
+ describe "Last-Modified" do
158
+ it 'should not send P3P header - not modified (304 Not Modified)' do
159
+ skip
160
+ # @user_agents.each do |user_agent|
161
+ # @app = mock_app('Last-Modified' => Chronic.parse('1 minute ago').rfc2822)
162
+
163
+ # request = mock_request(user_agent, 'HTTP_IF_MODIFIED_SINCE' => Chronic.parse('0 minutes ago').rfc2822)
164
+
165
+ # response = Rack::Iframe.new(@app).call(request)
166
+ # status, headers, body = response
167
+
168
+ # ap headers
169
+ # headers.key?('P3P').must_equal false
170
+ # status.must_equal 304 # not modified
171
+
172
+ # # response = Rack::Iframe.new(@app).call(request)
173
+ # # status, headers, body = response
174
+
175
+ # # ap headers
176
+ # # headers.key?('P3P').must_equal false
177
+ # # status.must_equal 304 # not modified
178
+
179
+ # # browser = Rack::Test::Session.new(Rack::MockSession.new(CachedApp))
180
+ # # browser.get '/', {}, 'HTTP_IF_MODIFIED_SINCE' => Chronic.parse('1 minute ago')
181
+
182
+ # # browser.last_response.headers.key?('P3P').must_equal false
183
+ # # browser.last_response.status.must_equal 200
184
+ # end
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+
192
+ end
@@ -0,0 +1,104 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require 'minitest/autorun'
3
+ require 'minitest/unit'
4
+ require 'minitest/spec'
5
+ require 'minitest/pride'
6
+
7
+ require 'rack/test'
8
+ require 'rack/mock'
9
+
10
+ require 'sinatra'
11
+ require 'rack/cache'
12
+ require 'chronic'
13
+ require 'awesome_print'
14
+ require 'digest/md5'
15
+ require 'time'
16
+
17
+ require 'rack/iframe'
18
+
19
+ ENV['RACK_ENV'] = 'test'
20
+
21
+ class CachedApp < Sinatra::Base
22
+
23
+ use Rack::Cache, :verbose => true, :meta_store => 'heap:/', :entitystore => 'heap:/'
24
+
25
+ get '/' do
26
+ headers['Content-Type'] = 'text/plain'
27
+ ""
28
+ end
29
+
30
+ get '/etag' do
31
+ headers['Etag'] = '123'
32
+ headers['Content-Type'] = 'text/plain'
33
+ ""
34
+ end
35
+
36
+ get '/last_modified' do
37
+ headers['Last-Modified'] = Chronic.parse('0 minutes ago')
38
+ headers['Content-Type'] = 'text/plain'
39
+ ""
40
+ end
41
+ end
42
+
43
+ def mock_app(headers = {}, env = {})
44
+ default_headers = headers.merge({
45
+ 'Content-Type' => 'text/plain'
46
+ })
47
+ body = block_given? ? [yield] : ['']
48
+ app = proc { [200, default_headers.merge(headers), body] }
49
+ rack_cache(app)
50
+ end
51
+
52
+ def rack_cache(app, options = {})
53
+ options = {:verbose => true, :meta_store => 'heap:/', :entitystore => 'heap:/'}.merge(options)
54
+ Rack::Cache.new(app, options)
55
+ end
56
+
57
+ def mock_request(user_agent_key, env = {})
58
+ headers = {
59
+ 'HTTP_USER_AGENT' => user_agent_string(user_agent_key)
60
+ }.merge(env)
61
+ Rack::MockRequest.env_for('/', headers)
62
+ end
63
+
64
+ def random_etag
65
+ Digest::MD5.hexdigest(Time.now.to_s)
66
+ end
67
+
68
+ def random_date
69
+ Time.now.rfc2822
70
+ end
71
+
72
+ # TODO: Use "more real" HTTP_USER_AGENT values.
73
+ def user_agent_string(id)
74
+ case id
75
+ when :ie
76
+ 'MSIE'
77
+ when :safari
78
+ 'Safari'
79
+ when :chrome
80
+ 'Chrome'
81
+ when :opera
82
+ 'Opera'
83
+ when :firefox
84
+ 'Firefox'
85
+ else
86
+ raise "Define mising browser agent: #{id.inspect}"
87
+ end
88
+ end
89
+
90
+ def all_user_agents
91
+ [:ie, :safari, :chrome, :firefox, :opera]
92
+ end
93
+
94
+ # REVIEW: Use or nuke?
95
+ def set_env!(request, env_key, value)
96
+ if block_given?
97
+ old_value = request.env[env_key]
98
+ request.env[env_key] = value
99
+ yield
100
+ request.env[env_key] = old_value
101
+ else
102
+ request.env[env_key] = value
103
+ end
104
+ end
metadata ADDED
@@ -0,0 +1,204 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rack-iframe
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Merchii
9
+ - Jonas Grimfelt
10
+ - Jaakko Suuturla
11
+ autorequire:
12
+ bindir: bin
13
+ cert_chain: []
14
+ date: 2011-10-28 00:00:00.000000000 Z
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: rack
18
+ requirement: &70167973270460 !ruby/object:Gem::Requirement
19
+ none: false
20
+ requirements:
21
+ - - ! '>='
22
+ - !ruby/object:Gem::Version
23
+ version: '0'
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: *70167973270460
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: &70167973269900 !ruby/object:Gem::Requirement
30
+ none: false
31
+ requirements:
32
+ - - ! '>='
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :development
36
+ prerelease: false
37
+ version_requirements: *70167973269900
38
+ - !ruby/object:Gem::Dependency
39
+ name: bundler
40
+ requirement: &70167973269260 !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ type: :development
47
+ prerelease: false
48
+ version_requirements: *70167973269260
49
+ - !ruby/object:Gem::Dependency
50
+ name: minitest
51
+ requirement: &70167973268820 !ruby/object:Gem::Requirement
52
+ none: false
53
+ requirements:
54
+ - - ! '>='
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ type: :development
58
+ prerelease: false
59
+ version_requirements: *70167973268820
60
+ - !ruby/object:Gem::Dependency
61
+ name: guard
62
+ requirement: &70167973268400 !ruby/object:Gem::Requirement
63
+ none: false
64
+ requirements:
65
+ - - ! '>='
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :development
69
+ prerelease: false
70
+ version_requirements: *70167973268400
71
+ - !ruby/object:Gem::Dependency
72
+ name: guard-bundler
73
+ requirement: &70167973267980 !ruby/object:Gem::Requirement
74
+ none: false
75
+ requirements:
76
+ - - ! '>='
77
+ - !ruby/object:Gem::Version
78
+ version: '0'
79
+ type: :development
80
+ prerelease: false
81
+ version_requirements: *70167973267980
82
+ - !ruby/object:Gem::Dependency
83
+ name: guard-minitest
84
+ requirement: &70167973267480 !ruby/object:Gem::Requirement
85
+ none: false
86
+ requirements:
87
+ - - ! '>='
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: *70167973267480
93
+ - !ruby/object:Gem::Dependency
94
+ name: rack-test
95
+ requirement: &70167973266940 !ruby/object:Gem::Requirement
96
+ none: false
97
+ requirements:
98
+ - - ! '>='
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ type: :development
102
+ prerelease: false
103
+ version_requirements: *70167973266940
104
+ - !ruby/object:Gem::Dependency
105
+ name: rack-cache
106
+ requirement: &70167973266320 !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: '0'
112
+ type: :development
113
+ prerelease: false
114
+ version_requirements: *70167973266320
115
+ - !ruby/object:Gem::Dependency
116
+ name: chronic
117
+ requirement: &70167973265500 !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ type: :development
124
+ prerelease: false
125
+ version_requirements: *70167973265500
126
+ - !ruby/object:Gem::Dependency
127
+ name: awesome_print
128
+ requirement: &70167973264440 !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: *70167973264440
137
+ - !ruby/object:Gem::Dependency
138
+ name: sinatra
139
+ requirement: &70167973263660 !ruby/object:Gem::Requirement
140
+ none: false
141
+ requirements:
142
+ - - ! '>='
143
+ - !ruby/object:Gem::Version
144
+ version: '0'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: *70167973263660
148
+ description: Rack middleware for enabling problematic web browsers (Internet Explorer
149
+ and Safari) to use same cookies in iframes as in parent windows.
150
+ email:
151
+ - operations@merchii.com
152
+ - grimen@gmail.com
153
+ - jaakko@suutarla.com
154
+ executables: []
155
+ extensions: []
156
+ extra_rdoc_files: []
157
+ files:
158
+ - .gitignore
159
+ - .travis.yml
160
+ - Gemfile
161
+ - Guardfile
162
+ - MIT-LICENSE
163
+ - README.textile
164
+ - Rakefile
165
+ - TODO
166
+ - lib/rack/iframe.rb
167
+ - lib/rack/iframe/version.rb
168
+ - rack-iframe.gemspec
169
+ - spec/rack-iframe_spec.rb
170
+ - spec/spec_helper.rb
171
+ homepage: http://github.com/merchii/rack-iframe
172
+ licenses: []
173
+ post_install_message:
174
+ rdoc_options: []
175
+ require_paths:
176
+ - lib
177
+ required_ruby_version: !ruby/object:Gem::Requirement
178
+ none: false
179
+ requirements:
180
+ - - ! '>='
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ segments:
184
+ - 0
185
+ hash: 3290203845642389863
186
+ required_rubygems_version: !ruby/object:Gem::Requirement
187
+ none: false
188
+ requirements:
189
+ - - ! '>='
190
+ - !ruby/object:Gem::Version
191
+ version: '0'
192
+ segments:
193
+ - 0
194
+ hash: 3290203845642389863
195
+ requirements: []
196
+ rubyforge_project: rack-iframe
197
+ rubygems_version: 1.8.10
198
+ signing_key:
199
+ specification_version: 3
200
+ summary: Rack middleware for enabling problematic web browsers (Internet Explorer
201
+ and Safari) to use same cookies in iframes as in parent windows.
202
+ test_files:
203
+ - spec/rack-iframe_spec.rb
204
+ - spec/spec_helper.rb