rack-request_replication 0.0.1 → 0.0.2

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.
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: