log_replay 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
File without changes
@@ -0,0 +1,4 @@
1
+ require 'log_replay/request'
2
+
3
+ module LogReplay
4
+ end
@@ -0,0 +1,124 @@
1
+ require 'time'
2
+ require 'uri/generic'
3
+ require 'ipaddr'
4
+
5
+
6
+ module LogReplay
7
+
8
+ class Request
9
+
10
+ attr_reader :time, :path, :params, :request_id, :client_ip, :location,
11
+ :log_entry, :status
12
+
13
+ METHOD = /\[(GET|POST|PUT|DELETE)\]/
14
+ TIME = /\s(\d\d\d\d\-\d\d\-\d\d\s\d\d\:\d\d\:\d\d)\)/
15
+ PARAMS = /Parameters\:\s(.+)/
16
+ LOCATION = /Location\:\s.+\/([a-f0-9]+)\r\n/
17
+ ERROR = /.+Error\s\(/
18
+ IPV4 = /\(for\s([0-9\.]+)\sat/
19
+ RESPONSE = /\s\|\s(\d\d\d)\s(.+)\s\[(.+)\]/
20
+
21
+
22
+ def initialize options
23
+ @log_entry = options[:log_entry]
24
+ @time = Time.parse( options[:time] )
25
+ @method = options[:method]
26
+ @client_ip = options[:client_ip]
27
+ @status = options[:status]
28
+ @message = options[:message]
29
+ @url = options[:url]
30
+ @path = URI.parse( options[:url] ).path
31
+ @request_id = options[:params].delete("id") rescue ""
32
+ @params = options[:params]
33
+ @location = options[:location]
34
+
35
+ if @method == "PUT" && @params["upload[attachment]"]
36
+ @params["upload[attachment]"] = File.open("file1.png")
37
+ end
38
+
39
+ end
40
+
41
+ def self.each logfile_path, &block
42
+
43
+ unless File.exist?(logfile_path)
44
+ raise ArgumentError, "Logfile does not exist"
45
+ end
46
+
47
+ File.open( logfile_path, "r" ) do |file|
48
+ file.each("\n\n") do |request|
49
+ next unless options = parse_request( request )
50
+
51
+ yield Request.new( options )
52
+ end
53
+ end
54
+
55
+ end
56
+
57
+ def self.each_with_timing logfile_path, &block
58
+ previous_timestamp = nil
59
+
60
+ each( logfile_path ) do |request|
61
+ previous_timestamp ||= request.time
62
+
63
+ time_to_sleep = request.time - previous_timestamp
64
+ sleep time_to_sleep
65
+
66
+ yield request
67
+
68
+ previous_timestamp = request.time
69
+ end
70
+ end
71
+
72
+ def self.parse_request request
73
+ begin
74
+ request.gsub!(/\#\<File.+\>\}/, "\"fileupload\"}")
75
+
76
+ request_params = {}
77
+
78
+ request_params[:log_entry]= request
79
+ request_params[:client_ip]= request.match(IPV4)[1]
80
+ request_params[:time] = request.match(TIME)[1]
81
+ request_params[:method] = request.match(METHOD)[1]
82
+
83
+ params_hash = eval( (request.match(PARAMS)[1] rescue "") )
84
+ request_params[:params] = resolve_params( params_hash )
85
+
86
+ request_info = request.match(RESPONSE)
87
+ request_params[:status] = request_info[1]
88
+ request_params[:message] = request_info[2]
89
+ request_params[:url] = request_info[3]
90
+
91
+ if ( request_params[:method] == "POST" ) && ( request =~ /Redirected/ )
92
+ request_params[:location] = request.match(/Redirected\sto\s(.+)\n/)[1]
93
+ end
94
+
95
+ request_params
96
+ rescue => exception
97
+ puts exception
98
+ nil
99
+ end
100
+ end
101
+
102
+ def self.resolve_params params_hash
103
+ params_hash ||= {}
104
+
105
+ params_hash.inject({}) do |options, (key, value)|
106
+
107
+ if value.is_a?(Hash)
108
+ value.each do |k,v|
109
+ options["#{key}[#{k}]"] = v
110
+ end
111
+ else
112
+ options[key] = value
113
+ end
114
+
115
+ options
116
+ end
117
+ end
118
+
119
+ def request_method
120
+ @method
121
+ end
122
+
123
+ end
124
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: log_replay
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 2
9
+ version: 0.0.2
10
+ platform: ruby
11
+ authors:
12
+ - hukl
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-07-13 00:00:00 +02:00
18
+ default_executable:
19
+ dependencies: []
20
+
21
+ description: "[description]"
22
+ email: contact@smyck.org
23
+ executables: []
24
+
25
+ extensions: []
26
+
27
+ extra_rdoc_files: []
28
+
29
+ files:
30
+ - README
31
+ - lib/log_replay.rb
32
+ - lib/log_replay/request.rb
33
+ has_rdoc: true
34
+ homepage: http://github.com/hukl/log_replay
35
+ licenses: []
36
+
37
+ post_install_message:
38
+ rdoc_options: []
39
+
40
+ require_paths:
41
+ - lib
42
+ required_ruby_version: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ segments:
48
+ - 0
49
+ version: "0"
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ segments:
56
+ - 1
57
+ - 3
58
+ - 7
59
+ version: 1.3.7
60
+ requirements: []
61
+
62
+ rubyforge_project: "[none]"
63
+ rubygems_version: 1.3.7
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: "[summary]"
67
+ test_files: []
68
+