log_replay 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.
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
+