rack-request_replication 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c53f6dc67d9b644ff865a0e0e5db200e19756ad
4
- data.tar.gz: 77e9cd22aeab694556c8d2195e766d56c9df25f9
3
+ metadata.gz: 9f86b1abca6aee060bc978f2d9d03cc0241ff51e
4
+ data.tar.gz: 8f5e982046204fc40f2c4369805b5b073795c679
5
5
  SHA512:
6
- metadata.gz: 6c9e718ca2a6a0688088766e7d7a96e550f32a521e6991fcf5d37937ca905a281f3035c1e6f1532d26eebfd523ba55315ea0b464711f356a64e2e7af1fa46a68
7
- data.tar.gz: afd0d4ffa1b81cf3cd5b2cdeb39af9a3e7ee70009f2335c4686c5bc0c33474266442b2d1b5a5bdc5d709d36128a99ae1c7cf46d3a682b8ea2b35b8e98eb1d052
6
+ metadata.gz: b67f6d7ecbf05611b54da1c862ce67fdd6e3ea58e53c01867bc0eb6f62d71aa845b2d23b762ac81aa5ad17a8033778f232eef6b264a4ad4854935c173f373a75
7
+ data.tar.gz: cfe08f90f63f11b7232330c81c2ba43faea3f5bc9c13ea42cb9a5ba5c8fc8f0fab060b4d4eb37f8ac7126528edd0d0390530e8ebf68c540058c8089d5bde189e
@@ -2,6 +2,7 @@ require 'logger'
2
2
  require 'json'
3
3
  require 'net/http'
4
4
  require 'uri'
5
+ require 'redis'
5
6
 
6
7
  module Rack
7
8
  module RequestReplication
@@ -18,12 +19,16 @@ module Rack
18
19
  # @param [Hash{Symbol => Object}] options
19
20
  # @option options [String] :host ('localhost')
20
21
  # @option options [Integer] :port (8080)
22
+ # @option options [String] :session_key ('rack.session')
21
23
  #
22
24
  def initialize( app, options = {} )
23
25
  @app = app
24
26
  @options = {
25
27
  host: 'localhost',
26
- port: 8080
28
+ port: 8080,
29
+ session_key: 'rack.session',
30
+ root_url: '/',
31
+ redis: {}
27
32
  }.merge options
28
33
  end
29
34
 
@@ -54,16 +59,38 @@ module Rack
54
59
  forward_request.add_field("Accept", opts[:accept])
55
60
  forward_request.add_field("Accept-Encoding", opts[:accept_encoding])
56
61
  forward_request.add_field("Host", request.host)
57
- forward_request.add_field("Cookie", opts[:cookies]) # TODO: we need to link the source session to the session on the destination app. Maybe we can use Redis to store this.
62
+
58
63
  Thread.new do
59
64
  begin
60
- http.request(forward_request)
61
- rescue
62
- logger.debug "Request to Forward App failed."
65
+ forward_request.add_field("Cookie", cookies( request ))
66
+ update_cookies( request, http.request(forward_request) )
67
+ rescue => e
68
+ logger.debug "Replicating request failed with: #{e.message}"
63
69
  end
64
70
  end
65
71
  end
66
72
 
73
+ def update_cookies( request, response )
74
+ return unless cookies_id( request )
75
+ cookie = response.to_hash['set-cookie'].collect{|ea|ea[/^.*?;/]}.join rescue {}
76
+ cookie = Hash[cookie.split(";").map{|d|d.split('=')}] rescue {}
77
+ redis.set( cookies_id( request), cookie )
78
+ end
79
+
80
+ def cookies( request )
81
+ return ( request.cookies || "" ) unless cookies_id( request )
82
+ cs = redis.get( cookies_id( request )) ||
83
+ request.cookies ||
84
+ {}
85
+ end
86
+
87
+ def cookies_id( request )
88
+ cs = request.cookies
89
+ sess = cs && cs[options[:session_key]]
90
+ sess_id = sess && sess.split("\n--").last
91
+ sess_id
92
+ end
93
+
67
94
  def create_get_request( uri, opts = {} )
68
95
  Net::HTTP::Get.new uri.request_uri
69
96
  end
@@ -108,7 +135,6 @@ module Rack
108
135
  body
109
136
  request_method
110
137
  content_charset
111
- cookies
112
138
  media_type
113
139
  media_type_params
114
140
  params
@@ -131,12 +157,28 @@ module Rack
131
157
  # @returns [URI]
132
158
  #
133
159
  def forward_uri( request )
134
- url = "#{request.scheme}://#{options[:host]}"
135
- url << ":#{options[:port]}" unless port_matches_scheme? request
160
+ url = "#{request.scheme}://#{forward_host_with_port( request )}"
136
161
  url << request.fullpath
137
162
  URI(url)
138
163
  end
139
164
 
165
+ def forward_host_with_port( request )
166
+ host = options[:host].to_s
167
+ host = "#{host}:#{options[:port]}" unless port_matches_scheme? request
168
+ host
169
+ end
170
+
171
+ ##
172
+ # Persistent Redis connection that is used
173
+ # to store cookies.
174
+ #
175
+ def redis
176
+ @redis ||= Redis.new({
177
+ host: 'localhost',
178
+ port: 6379,
179
+ db: 'rack-request-replication'
180
+ }.merge(options[:redis]))
181
+ end
140
182
  ##
141
183
  # Checks if the request scheme matches the destination port.
142
184
  #
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module RequestReplication
3
- VERSION = "0.0.1"
3
+ VERSION = "0.0.2"
4
4
  end
5
5
  end
@@ -24,6 +24,8 @@ Gem::Specification.new do |spec|
24
24
  spec.add_development_dependency 'rspec', '~> 3.0'
25
25
  spec.add_development_dependency 'yard' , '>= 0.5.5'
26
26
  spec.add_development_dependency 'sinatra'
27
+ spec.add_development_dependency 'sinatra-contrib'
27
28
 
28
29
  spec.add_runtime_dependency 'rack', '>= 1.0.0'
30
+ spec.add_runtime_dependency 'redis', '>= 1.0.0'
29
31
  end
data/spec/app/test_app.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  require 'sinatra/base'
2
+ require 'sinatra/cookies'
2
3
  require 'rack/request_replication'
3
4
 
4
5
  $destination_responses ||= []
@@ -36,10 +37,16 @@ class TestApp < Sinatra::Base
36
37
  end
37
38
 
38
39
  class DestApp < Sinatra::Base
40
+ helpers Sinatra::Cookies
41
+
39
42
  set :port, 4568
40
43
 
41
44
  enable :logging
42
45
 
46
+ before do
47
+ cookies.merge! 'boo' => 'far', 'zar' => 'bab'
48
+ end
49
+
43
50
  get '/' do
44
51
  $destination_responses << 'GET OK'
45
52
  'Hello, World!'
data/spec/spec_helper.rb CHANGED
@@ -15,7 +15,6 @@ RSpec.configure do |config|
15
15
 
16
16
  config.after :suite do
17
17
  puts "Quitting example applications..."
18
- #@spid.kill
19
18
  @dpid.kill
20
19
  end
21
20
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-request_replication
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wouter de Vos
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: sinatra-contrib
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '>='
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: rack
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -108,6 +122,20 @@ dependencies:
108
122
  - - '>='
109
123
  - !ruby/object:Gem::Version
110
124
  version: 1.0.0
125
+ - !ruby/object:Gem::Dependency
126
+ name: redis
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - '>='
130
+ - !ruby/object:Gem::Version
131
+ version: 1.0.0
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: 1.0.0
111
139
  description: Replicate or record HTTP requests to your Rack application and replay
112
140
  them elsewhere or at another time.
113
141
  email: