kris-kross 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ .idea
7
+ Gemfile.lock
8
+ InstalledFiles
9
+ _yardoc
10
+ coverage
11
+ doc/
12
+ lib/bundler/man
13
+ pkg
14
+ rdoc
15
+ spec/reports
16
+ test/tmp
17
+ test/version_tmp
18
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in kris-kross.gemspec
4
+ gemspec
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env ruby
2
+ #^syntax detection
3
+
4
+ # A sample Guardfile
5
+ # More info at https://github.com/guard/guard#readme
6
+
7
+ guard 'rspec', cli: '--color' do
8
+ watch(%r{^kris-kross\.gemspec}) { "spec"}
9
+ watch(%r{^spec/.+_spec\.rb$})
10
+ watch(%r{^lib/(.+)\.rb$}) { "spec" }
11
+ watch('spec/spec_helper.rb') { "spec" }
12
+ end
13
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Eric Saxby
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,144 @@
1
+ Kris::Kross
2
+ ===========
3
+
4
+ Kris Kross will make you jump jump between domains with cross origin requests. Have you read
5
+ that RFC? It's F-en crazy! What headers do you set where, and who do you tell what to make those
6
+ requests actually go through?
7
+
8
+ This gem will totally kross out your confusion, and you'll be left young, rich and dangerous to
9
+ certify your gold-plated programming skills.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'kris-kross'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ ## Requirements
22
+
23
+ This gem is built to work with Rails 3 applications.
24
+
25
+ ## Usage
26
+
27
+ Including `kris-kross` in a Rails 3 application automatically adds it to the Middleware chain.
28
+ Configure it in an initializer:
29
+
30
+ ```ruby
31
+ Kris::Kross.configure do |c|
32
+ c.origins %w{ http://my-domain http://my-other-domain}
33
+ end
34
+ ```
35
+
36
+ The HTTP protocol desired (http/https) should be explicitly set in the configuration block. Kris Kross
37
+ makes no assumptions about this.
38
+
39
+ ### Custom Headers
40
+
41
+ Cors does some extra checking if you send custom headers in your cross origin requests. You can configure
42
+ Kris Kross to accept those headers in the following way:
43
+
44
+ ```ruby
45
+ Kris::Kross.configure do |c|
46
+ c.origins %w{ http://my-domain}
47
+ c.headers %w{X-Mac-Daddy X-Daddy-Mac}
48
+ end
49
+ ```
50
+
51
+ These get mixed into a set of default values and returns to clients as `Access-Control-Allow-Headers`.
52
+
53
+ ### Wildcard domains (not!)
54
+
55
+ Kris Kross can not be configured to open domains to wildcard cross origin requests. Kris Kross is crazy,
56
+ but not that crazy.
57
+
58
+ ## Cross Origin Requests explained
59
+
60
+ Let's say you have a domain `http://make-my-video.com`, from which you serve an amazing javascript-based
61
+ video game. With the overwhelming popularity of the site, you are starting to worry that over the weekend
62
+ the it may go down.
63
+
64
+ You move all the logic around saving state to `http://saves.make-my-video.com`, but notice at the last minute
65
+ that nothing is making it through to those servers. What are you going to do???
66
+
67
+ First, you drop `gem kris-kross` into your Gemfile.
68
+
69
+ Second, you create the file `#{Rails.root}/config/initializers/kris-kross.rb` in
70
+ both `make-my-video.com` and `saves.make-my-video.com`:
71
+
72
+ ```ruby
73
+ Kris::Kross.configure do |c|
74
+ c.origins %w{ http://make-my-video.com }
75
+ end
76
+ ```
77
+
78
+ ### Client interactions
79
+
80
+ When a web browser hits your site, the Kris Kross rack middleware will mix in some response headers. You can see
81
+ this by hitting your domain with curl:
82
+
83
+ ```bash
84
+ > curl http://make-my-video.com -I
85
+ HTTP/1.1 200 OK
86
+ Server: nginx/1.2.4
87
+ Date: Thu, 6 Feb 1992 18:03:07 GMT
88
+ Content-Type: text/html; charset=utf-8
89
+ Content-Length: 23497
90
+ Connection: close
91
+ Status: 200 OK
92
+ Access-Control-Allow-Origin: http://make-my-video.com
93
+ Access-Control-Allow-Credentials: true
94
+ Cache-Control: no-cache, no-store, max-age=0, must-revalidate
95
+ Pragma: no-cache
96
+ Expires: Wed, 09 Sep 1972 09:09:09 GMT
97
+ X-UA-Compatible: IE=Edge
98
+ ETag: "7ccdafcac2e2d541fd69823d290126d6"
99
+ X-Request-Id: f7c0684f1bc06321039b55d3c431d81b
100
+ X-Runtime: 0.762781
101
+ ```
102
+
103
+ The browser now knows that you know you have potential cross origin requests, and from where. This is only half
104
+ of the picture, though. When the browser tries to do a cross origin request it first tests the crossed domain.
105
+ It does this with what is called a preflight check.
106
+
107
+ Preflight checks hit the cross origin domain with an HTTP call using the OPTIONS verb. Wait, never heard of OPTIONS?
108
+ Test it out with another bit of curl:
109
+
110
+ ```bash
111
+ > curl -X OPTIONS http://saves.make-my-video.com -I
112
+ HTTP/1.1 200 OK
113
+ Server: nginx/1.2.4
114
+ Date: Thu, 6 Feb 1992 18:09:12 GMT
115
+ Transfer-Encoding: chunked
116
+ Connection: close
117
+ Status: 200 OK
118
+ Access-Control-Allow-Origin: http://make-my-video.com
119
+ Access-Control-Allow-Methods: POST, GET, OPTIONS
120
+ Access-Control-Allow-Headers: X-Requested-With, X-Prototype-Version, Authorization, Authentication
121
+ Access-Control-Max-Age: 172800
122
+ Access-Control-Allow-Credentials: true
123
+ X-UA-Compatible: IE=Edge
124
+ Cache-Control: no-cache
125
+ X-Request-Id: b287f0b81f5711c659df1caa2d749568
126
+ X-Runtime: 0.140053
127
+ ```
128
+
129
+ Notice that in these examples, the `Access-Control-Allow-Origin` headers all refer to the main domain,
130
+ `make-my-video.com` and not to the cross origin domain.
131
+
132
+ ## References
133
+
134
+ * http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
135
+ * http://www.w3.org/TR/cors/
136
+ * https://developer.mozilla.org/en-US/docs/HTTP_access_control
137
+
138
+ ## Contributing
139
+
140
+ 1. Fork it
141
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
142
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
143
+ 4. Push to the branch (`git push origin my-new-feature`)
144
+ 5. Create new Pull Request
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
@@ -0,0 +1,21 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/kris-kross/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Eric Saxby"]
6
+ gem.email = ["sax@wanelo.com"]
7
+ gem.description = %q{Kris Kross will make you jump jump between domains with cross origin requests}
8
+ gem.summary = %q{Cross origin requests made easy}
9
+ gem.homepage = "https://github.com/wanelo/kris-kross"
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "kris-kross"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Kris::Kross::VERSION
17
+
18
+ gem.add_development_dependency 'rspec'
19
+ gem.add_development_dependency 'guard-rspec'
20
+ gem.add_development_dependency 'rb-fsevent'
21
+ end
@@ -0,0 +1,24 @@
1
+ require "kris-kross/version"
2
+ require "kris-kross/configuration"
3
+ require "kris-kross/handler"
4
+
5
+ module Kris
6
+ class Kross
7
+ # Does Kris live inside Kross, or does Kross live inside Kris?
8
+ # This is like a crazy X-Files episode!
9
+
10
+ def self.configure(&block)
11
+ Kris::Kross::Configuration.instance.configure(&block)
12
+ end
13
+
14
+ def initialize(app)
15
+ Kris::Kross::Handler.instance.app = app
16
+ end
17
+
18
+ def call(env)
19
+ Kris::Kross::Handler.instance.call(env)
20
+ end
21
+ end
22
+ end
23
+
24
+ require "kris-kross/railtie" if defined? Rails
@@ -0,0 +1,50 @@
1
+ require 'singleton'
2
+
3
+ module Kris
4
+ class Kross
5
+ class Configuration
6
+ include Singleton
7
+
8
+ attr_writer :origins, :headers
9
+
10
+ def configure
11
+ yield self
12
+ self
13
+ end
14
+
15
+ def origins(hostnames = nil)
16
+ if hostnames.nil?
17
+ [@origins].flatten
18
+ else
19
+ @origins = hostnames
20
+ end
21
+ end
22
+
23
+ def headers(headers = nil)
24
+ if headers.nil?
25
+ (default_headers + [@headers]).flatten.compact.join(' ')
26
+ else
27
+ @headers = headers
28
+ end
29
+ end
30
+
31
+ def self.origins
32
+ @origins ||= self.instance.origins
33
+ end
34
+
35
+ def self.hosts
36
+ @hosts ||= origins.join(' ')
37
+ end
38
+
39
+ def self.headers
40
+ @headers ||= self.instance.headers
41
+ end
42
+
43
+ private
44
+
45
+ def default_headers
46
+ %w{X-Requested-With X-Prototype-Version Authorization Authentication}
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,45 @@
1
+ require 'singleton'
2
+
3
+ class Kris::Kross::Handler
4
+ include Singleton
5
+
6
+ attr_accessor :app
7
+
8
+ def call(env)
9
+ @env = env
10
+
11
+ if options_request?
12
+ [200, option_request_headers, [""]]
13
+ else
14
+ respond(env)
15
+ end
16
+ end
17
+
18
+ private
19
+
20
+ def option_request_headers
21
+ {
22
+ "Access-Control-Allow-Origin" => Kris::Kross::Configuration.hosts,
23
+ "Access-Control-Allow-Methods" => "POST, GET, OPTIONS",
24
+ "Access-Control-Allow-Headers" => Kris::Kross::Configuration.headers,
25
+ "Access-Control-Max-Age" => "172800",
26
+ "Access-Control-Allow-Credentials" => 'true'
27
+ }
28
+ end
29
+
30
+ def options_request?
31
+ @env["REQUEST_METHOD"] == "OPTIONS"
32
+ end
33
+
34
+ def respond(env)
35
+ status, headers, response = app.call(env)
36
+ [status, headers.merge(cors_headers), response]
37
+ end
38
+
39
+ def cors_headers
40
+ {
41
+ "Access-Control-Allow-Origin" => Kris::Kross::Configuration.hosts,
42
+ "Access-Control-Allow-Credentials" => "true"
43
+ }
44
+ end
45
+ end
@@ -0,0 +1,9 @@
1
+ module Kris
2
+ class Kross
3
+ class Railtie < Rails::Railtie
4
+ initializer "kriss_kross.insert_middleware" do |app|
5
+ app.config.middleware.use "Kris::Kross"
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module Kris
2
+ class Kross
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kris::Kross::Configuration, "#configure" do
4
+ before { Kris::Kross::Configuration.reset }
5
+ let(:instance) { Kris::Kross::Configuration.instance }
6
+
7
+ describe "origins" do
8
+ it "should allow configuration via method calls" do
9
+ instance.configure do |c|
10
+ c.origins %w(http://host-1 http://host-2)
11
+ end
12
+
13
+ instance.origins.should == %w(http://host-1 http://host-2)
14
+ end
15
+
16
+ it "should allow configuration via assignment" do
17
+ instance.configure do |c|
18
+ c.origins = %w(http://host-3 http://host-4)
19
+ end
20
+
21
+ instance.origins.should == %w(http://host-3 http://host-4)
22
+ end
23
+
24
+ it "should accept string origins" do
25
+ instance.configure do |c|
26
+ c.origins = "http://blah.blah"
27
+ end
28
+
29
+ instance.origins.should == %w(http://blah.blah)
30
+ end
31
+ end
32
+
33
+ describe "headers" do
34
+ it "should allow configuration via method calls, mixed into defaults" do
35
+ instance.configure do |c|
36
+ c.headers %w{X-Blah-Blah X-Blah-Blah-Blah}
37
+ end
38
+
39
+ instance.headers.should == %w{
40
+ X-Requested-With
41
+ X-Prototype-Version
42
+ Authorization
43
+ Authentication
44
+ X-Blah-Blah
45
+ X-Blah-Blah-Blah}.join(' ')
46
+ end
47
+
48
+ it "should allow configuration with assignment, mixed into defaults" do
49
+ instance.configure do |c|
50
+ c.headers = %w{X-Blah-Blah X-Blah-Blah-Blah}
51
+ end
52
+
53
+ instance.headers.should == %w{
54
+ X-Requested-With
55
+ X-Prototype-Version
56
+ Authorization
57
+ Authentication
58
+ X-Blah-Blah
59
+ X-Blah-Blah-Blah}.join(' ')
60
+ end
61
+ end
62
+ end
63
+
64
+ describe Kris::Kross::Configuration, ".headers" do
65
+ before { Kris::Kross::Configuration.reset }
66
+ let(:instance) { Kris::Kross::Configuration.instance }
67
+ let(:default_headers) { %w{X-Requested-With X-Prototype-Version Authorization Authentication} }
68
+
69
+ context "with only default headers" do
70
+ it "should return just the defaults" do
71
+ Kris::Kross::Configuration.headers.should == default_headers.join(' ')
72
+ end
73
+ end
74
+
75
+ context "with extra headers" do
76
+ before do
77
+ instance.configure do |c|
78
+ c.headers %w(X-Blah)
79
+ end
80
+ end
81
+
82
+ it "should return headers as a string" do
83
+ Kris::Kross::Configuration.headers.should == (default_headers << "X-Blah").join(' ')
84
+ end
85
+ end
86
+ end
87
+
88
+ describe Kris::Kross::Configuration, ".hosts" do
89
+ before { Kris::Kross::Configuration.reset }
90
+ let(:instance) { Kris::Kross::Configuration.instance }
91
+
92
+ before do
93
+ instance.configure do |c|
94
+ c.origins %w(http://host-1 http://host-2)
95
+ end
96
+ end
97
+
98
+ it "should return origins as a string" do
99
+ Kris::Kross::Configuration.hosts.should == "http://host-1 http://host-2"
100
+ end
101
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kris::Kross::Handler do
4
+ before do
5
+ Kris::Kross::Handler.reset_instance
6
+ Kris::Kross::Handler.instance.app = app
7
+ end
8
+
9
+ subject { Kris::Kross::Handler.instance }
10
+
11
+ let(:app) { mock() }
12
+ let(:response) { subject.call(env) }
13
+ let(:status) { response[0] }
14
+ let(:headers) { response[1] }
15
+ let(:body) { response[2] }
16
+
17
+ let(:request_method) { 'OPTIONS' }
18
+ let(:allow_origin) { 'http://my-host https://my-host' }
19
+ let(:allow_headers) { 'X-Stuff X-Other-Stuff X-What-What' }
20
+
21
+ let(:configuration) { mock() }
22
+
23
+ before do
24
+ Kris::Kross::Configuration.stub(:hosts).and_return(allow_origin)
25
+ Kris::Kross::Configuration.stub(:headers).and_return(allow_headers)
26
+ end
27
+
28
+ let(:env) { {
29
+ 'REQUEST_METHOD' => request_method,
30
+ 'REQUEST_PATH' => '/'
31
+ } }
32
+
33
+ describe "OPTIONS request" do
34
+ it "should return a 200 status" do
35
+ status.should == 200
36
+ end
37
+
38
+ it "should include Access-Control headers" do
39
+ headers['Access-Control-Allow-Origin'].should == allow_origin
40
+ headers["Access-Control-Allow-Methods"].should == "POST, GET, OPTIONS"
41
+ headers["Access-Control-Allow-Headers"].should == allow_headers
42
+ headers["Access-Control-Max-Age"].should == "172800"
43
+ headers["Access-Control-Allow-Credentials"].should == 'true'
44
+ end
45
+ end
46
+
47
+ describe "POST request" do
48
+ let(:request_method) { 'POST' }
49
+ let(:application_response_body) { ["some text from the application"] }
50
+ let(:application_response) {
51
+ [
52
+ 200,
53
+ {"header" => 'content'},
54
+ application_response_body
55
+ ]
56
+ }
57
+
58
+ before do
59
+ app.should_receive(:call).with(env).and_return(application_response)
60
+ end
61
+
62
+ it "should call the Rails dispatcher with the request environment" do
63
+ subject.call(env)
64
+ end
65
+
66
+ it "should return the body text from the app" do
67
+ body.should == application_response_body
68
+ end
69
+
70
+ it "should inject Allow-Origin headers into the response" do
71
+ headers['Access-Control-Allow-Origin'].should == allow_origin
72
+ headers["Access-Control-Allow-Credentials"].should == 'true'
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Kris::Kross, "#new" do
4
+ let(:app) { mock() }
5
+
6
+ it "should initialize a handler and configure it" do
7
+ Kris::Kross::Handler.instance.should_receive(:app=).with(app)
8
+ Kris::Kross.new(app)
9
+ end
10
+ end
11
+
12
+ describe Kris::Kross, "#configure" do
13
+ let(:proc) { -> { "some proc" } }
14
+
15
+ it "passes block on to Configuration" do
16
+ Kris::Kross::Configuration.instance.should_receive(:configure).with(&proc)
17
+ Kris::Kross.configure(&proc)
18
+ end
19
+ end
20
+
21
+ describe Kris::Kross, "#call" do
22
+ let(:app) { mock() }
23
+ let(:env) { mock() }
24
+ let(:handler) { mock() }
25
+
26
+ it "passes arguments on to a handler" do
27
+ Kris::Kross::Handler.stub(:instance).and_return(handler)
28
+ handler.should_receive(:app=).with(app)
29
+ handler.should_receive(:call).with(env)
30
+
31
+ Kris::Kross.new(app).call(env)
32
+ end
33
+ end
@@ -0,0 +1,25 @@
1
+ # This file was generated by the `rspec --init` command. Conventionally, all
2
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
3
+ # Require this file using `require "spec_helper"` to ensure that it is only
4
+ # loaded once.
5
+ #
6
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
7
+
8
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
9
+ require 'rubygems'
10
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
11
+ require 'support/singleton'
12
+ require 'kris-kross'
13
+ require 'support/configuration'
14
+
15
+ RSpec.configure do |config|
16
+ config.treat_symbols_as_metadata_keys_with_true_values = true
17
+ config.run_all_when_everything_filtered = true
18
+ config.filter_run :focus
19
+
20
+ # Run specs in random order to surface order dependencies. If you find an
21
+ # order dependency and want to debug it, you can fix the order by providing
22
+ # the seed, which is printed after each run.
23
+ # --seed 1234
24
+ config.order = 'random'
25
+ end
@@ -0,0 +1,8 @@
1
+ class Kris::Kross::Configuration
2
+ def self.reset
3
+ @origins = nil
4
+ @hosts = nil
5
+ @headers = nil
6
+ reset_instance
7
+ end
8
+ end
@@ -0,0 +1,15 @@
1
+ require 'singleton'
2
+
3
+ class <<Singleton
4
+ def included_with_reset(klass)
5
+ included_without_reset(klass)
6
+ class <<klass
7
+ def reset_instance
8
+ Singleton.send :__init__, self
9
+ self
10
+ end
11
+ end
12
+ end
13
+ alias_method :included_without_reset, :included
14
+ alias_method :included, :included_with_reset
15
+ end
metadata ADDED
@@ -0,0 +1,119 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kris-kross
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Eric Saxby
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-11-22 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: guard-rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: rb-fsevent
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Kris Kross will make you jump jump between domains with cross origin
63
+ requests
64
+ email:
65
+ - sax@wanelo.com
66
+ executables: []
67
+ extensions: []
68
+ extra_rdoc_files: []
69
+ files:
70
+ - .gitignore
71
+ - Gemfile
72
+ - Guardfile
73
+ - LICENSE
74
+ - README.md
75
+ - Rakefile
76
+ - kris-kross.gemspec
77
+ - lib/kris-kross.rb
78
+ - lib/kris-kross/configuration.rb
79
+ - lib/kris-kross/handler.rb
80
+ - lib/kris-kross/railtie.rb
81
+ - lib/kris-kross/version.rb
82
+ - spec/kris-kross/configuration_spec.rb
83
+ - spec/kris-kross/handler_spec.rb
84
+ - spec/kris-kross_spec.rb
85
+ - spec/spec_helper.rb
86
+ - spec/support/configuration.rb
87
+ - spec/support/singleton.rb
88
+ homepage: https://github.com/wanelo/kris-kross
89
+ licenses: []
90
+ post_install_message:
91
+ rdoc_options: []
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ! '>='
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ requirements: []
107
+ rubyforge_project:
108
+ rubygems_version: 1.8.24
109
+ signing_key:
110
+ specification_version: 3
111
+ summary: Cross origin requests made easy
112
+ test_files:
113
+ - spec/kris-kross/configuration_spec.rb
114
+ - spec/kris-kross/handler_spec.rb
115
+ - spec/kris-kross_spec.rb
116
+ - spec/spec_helper.rb
117
+ - spec/support/configuration.rb
118
+ - spec/support/singleton.rb
119
+ has_rdoc: