Module: HttpTools

Included in:
ETL::Parser::ApacheCombinedLogParser
Defined in:
lib/etl/http_tools.rb

Overview

Module which has utility methods for HTTP.

Instance Method Summary collapse

Instance Method Details

#parse_uri(uri_string) ⇒ Object



109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/etl/http_tools.rb', line 109

def parse_uri(uri_string)
  if uri_string      
    #attempt to parse uri --if it's a uri then catch the problem and set everything to nil
    begin
      uri = URI.parse(uri_string)    
      results = {:scheme => uri.scheme, :host => uri.host, :port => uri.port, :uri_path => uri.path}
      results[:domain] = $1 if uri.host =~ /\.?([^\.]+\.[^\.]+$)/
      results
    rescue
      {:scheme => nil, :host => nil, :port => nil, :uri_path => nil, :domain => nil}      
    end

  else
    {:scheme => nil, :host => nil, :port => nil, :uri_path => nil, :domain => nil}
  end
end

#parse_user_agent(user_agent) ⇒ Object

Parse the given user agent string

Code taken from gemtacular.com/gems/ParseUserAgent



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
101
102
103
104
105
106
107
# File 'lib/etl/http_tools.rb', line 8

def parse_user_agent(user_agent)
  if '-' == user_agent
    #raise 'Invalid User Agent'
    #puts 'Invalid User Agent'
  end
  
  browser, browser_version_major, browser_version_minor, ostype, os, os_version = nil

  # fix Opera
  #useragent =~ s/Opera (\d)/Opera\/$1/i;
  useragent = user_agent.gsub(/(Opera [\d])/,'Opera\1')

  # grab all Agent/version strings as 'agents'
  agents = Array.new
  user_agent.split(/\s+/).each {|string| 
    if string =~ /\//
      agents<< string
    end
  }

  # cycle through the agents to set browser and version (MSIE is set later)
  if agents && agents.length > 0
      agents.each {|agent|
        parts = agent.split('/')
        browser = parts[0]
        browser_version = parts[1]
        if browser == 'Firefox'
          browser_version_major = parts[1].slice(0,3)
          browser_version_minor = parts[1].sub(browser_version_major,'').sub('.','')
        elsif browser == 'Safari'
          if parts[1].slice(0,3).to_f < 400
            browser_version_major = '1'
          else
            browser_version_major = '2'
          end
        else
          browser_version_major = parts[1].slice(0,1)
        end
      }
  end

  # grab all of the properties (within parens)
  # should be in relation to the agent if possible  
  detail = user_agent
  user_agent.gsub(/\((.*)\)/,'').split(/\s/).each {|part| detail = detail.gsub(part,'')}
  detail = detail.gsub('(','').gsub(')','').lstrip
  properties = detail.split(/;\s+/)

  # cycle through the properties to set known quantities
  properties.each do |property| 
    if property =~ /^Win/
      ostype = 'Windows'
      os = property
      if parts = property.split(/ /,2)
        if parts[1] =~ /^NT/
          ostype = 'Windows'
          subparts = parts[1].split(/ /,2)
          if subparts[1] == '5'
            os_version = '2000'
          elsif subparts[1] == '5.1'
            os_version = 'XP'
          else
            os_version = subparts[1]
          end
        end
      end
    end
    if property == 'Macintosh'
      ostype = 'Macintosh'
      os = property
    end
    if property =~ /OS X/
      ostype = 'Macintosh'
      os_version = 'OS X'
      os = property
    end
    if property =~ /^Linux/
      ostype = 'Linux'
      os = property
    end
    if property =~ /^MSIE/
      browser = 'MSIE'
      browser_version = property.gsub('MSIE ','').lstrip
      browser_version_major,browser_version_minor = browser_version.split('.')
    end
  end
  
  result = {
    :browser => browser, 
    :browser_version_major => browser_version_major, 
    :browser_version_minor => browser_version_minor, 
    :ostype => ostype, 
    :os_version => os_version,
    :os => os,
  }
  result.each do |key, value|
    result[key] = value.blank? ? nil : value.strip
  end
  result
end