Class: LogReplay::Request

Inherits:
Object
  • Object
show all
Defined in:
lib/log_replay/request.rb

Constant Summary collapse

METHOD =
/\[(GET|POST|PUT|DELETE)\]/
TIME =
/\s(\d\d\d\d\-\d\d\-\d\d\s\d\d\:\d\d\:\d\d)\)/
PARAMS =
/Parameters\:\s(.+)/
LOCATION =
/Location\:\s.+\/([a-f0-9]+)\r\n/
ERROR =
/.+Error\s\(/
IPV4 =
/\(for\s([0-9\.]+)\sat/
RESPONSE =
/\s\|\s(\d\d\d)\s(.+)\s\[(.+)\]/

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options) ⇒ Request

Returns a new instance of Request.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/log_replay/request.rb', line 22

def initialize options
  @log_entry  = options[:log_entry]
  @time       = Time.parse( options[:time] )
  @method     = options[:method]
  @client_ip  = options[:client_ip]
  @status     = options[:status]
  @message    = options[:message]
  @url        = options[:url]
  @path       = URI.parse( options[:url] ).path
  @request_id = options[:params].delete("id") rescue ""
  @params     = options[:params]
  @location   = options[:location]

  if @method == "PUT" && @params["upload[attachment]"]
    @params["upload[attachment]"] = File.open("file1.png")
  end

end

Instance Attribute Details

#client_ipObject (readonly)

Returns the value of attribute client_ip.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def client_ip
  @client_ip
end

#locationObject (readonly)

Returns the value of attribute location.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def location
  @location
end

#log_entryObject (readonly)

Returns the value of attribute log_entry.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def log_entry
  @log_entry
end

#paramsObject (readonly)

Returns the value of attribute params.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def params
  @params
end

#pathObject (readonly)

Returns the value of attribute path.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def path
  @path
end

#request_idObject (readonly)

Returns the value of attribute request_id.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def request_id
  @request_id
end

#statusObject (readonly)

Returns the value of attribute status.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def status
  @status
end

#timeObject (readonly)

Returns the value of attribute time.



10
11
12
# File 'lib/log_replay/request.rb', line 10

def time
  @time
end

Class Method Details

.each(logfile_path, &block) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/log_replay/request.rb', line 41

def self.each logfile_path, &block

  unless File.exist?(logfile_path)
    raise ArgumentError, "Logfile does not exist"
  end

  File.open( logfile_path, "r" ) do |file|
    file.each("\n\n") do |request|
      next unless options = parse_request( request )

      yield Request.new( options )
    end
  end

end

.each_with_timing(logfile_path, &block) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/log_replay/request.rb', line 57

def self.each_with_timing logfile_path, &block
  previous_timestamp = nil

  each( logfile_path ) do |request|
    previous_timestamp ||= request.time

    time_to_sleep = request.time - previous_timestamp
    sleep time_to_sleep

    yield request

    previous_timestamp = request.time
  end
end

.parse_request(request) ⇒ Object



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/log_replay/request.rb', line 72

def self.parse_request request
  begin
    request.gsub!(/\#\<File.+\>\}/, "\"fileupload\"}")

    request_params  = {}

    request_params[:log_entry]= request
    request_params[:client_ip]= request.match(IPV4)[1]
    request_params[:time]     = request.match(TIME)[1]
    request_params[:method]   = request.match(METHOD)[1]

    params_hash = eval( (request.match(PARAMS)[1] rescue "") )
    request_params[:params]   = resolve_params( params_hash )

    request_info = request.match(RESPONSE)
    request_params[:status]   = request_info[1]
    request_params[:message]  = request_info[2]
    request_params[:url]      = request_info[3]

    if ( request_params[:method] == "POST" ) && ( request =~ /Redirected/ )
      request_params[:location] = request.match(/Redirected\sto\s(.+)\n/)[1]
    end

    request_params
  rescue => exception
    puts exception
    nil
  end
end

.resolve_params(params_hash) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/log_replay/request.rb', line 102

def self.resolve_params params_hash
  params_hash ||= {}

  params_hash.inject({}) do |options, (key, value)|

    if value.is_a?(Hash)
      value.each do |k,v|
        options["#{key}[#{k}]"] = v
      end
    else
      options[key] = value
    end

    options
  end
end

Instance Method Details

#request_methodObject



119
120
121
# File 'lib/log_replay/request.rb', line 119

def request_method
  @method
end