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 +4 -4
- data/lib/rack/request_replication/forwarder.rb +50 -8
- data/lib/rack/request_replication/version.rb +1 -1
- data/rack-request_replication.gemspec +2 -0
- data/spec/app/test_app.rb +7 -0
- data/spec/spec_helper.rb +0 -1
- metadata +29 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9f86b1abca6aee060bc978f2d9d03cc0241ff51e
|
4
|
+
data.tar.gz: 8f5e982046204fc40f2c4369805b5b073795c679
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
|
62
|
+
|
58
63
|
Thread.new do
|
59
64
|
begin
|
60
|
-
|
61
|
-
|
62
|
-
|
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}://#{
|
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
|
#
|
@@ -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
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.
|
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:
|