haproxy_log_parser 0.0.4 → 1.0.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f019630e3a37d631615874f51d00936ade7a58a2
4
+ data.tar.gz: c95c16a28cfc263e3b5f5b3310836b4afbf30094
5
+ SHA512:
6
+ metadata.gz: 1d9567c587f66a274e8fa1d829e59c42cb07969094061c0fe5cde805ca322114880c71d62ff18a88f9494f779fc04d4f132105d425d5c22aff3de6e8b95bfef8
7
+ data.tar.gz: 5d1d021bef436b3651e362a89ca555c1b3a8e3912bec57030a1bd3c76ad54d93f5fd5560df38460f9181bd36d232084e9020d28e254e0b319436735605d7d98b
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2013, Toby Hsieh
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,10 @@
1
+ # haproxy\_log\_parser
2
+
3
+ haproxy\_log\_parser is a gem that parses logs in HAProxy's HTTP log format.
4
+
5
+ Example:
6
+
7
+ require 'haproxy_log_parser'
8
+ result = HAProxyLogParser.parse('Aug 9 20:30:46 localhost haproxy[2022]: 10.0.8.2:34028 [09/Aug/2011:20:30:46.429] proxy-out proxy-out/cache1 1/0/2/126/+128 301 +223 - - ---- 617/523/336/168/0 0/0 {www.sytadin.equipement.gouv.fr||http://trafic.1wt.eu/} {Apache|230|||true} "GET /index.html HTTP/1.1"')
9
+ result.client_ip # => "10.0.8.2"
10
+ result.captured_response_headers # => ["Apache", "230", "", "", "true"]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 1.0.0
@@ -9,10 +9,11 @@ Gem::Specification.new do |s|
9
9
 
10
10
  s.add_dependency 'treetop'
11
11
 
12
- s.add_development_dependency 'rspec', '~> 2.13'
12
+ s.add_development_dependency 'rspec', '~> 3.5.0'
13
13
 
14
14
  s.files = Dir.glob('lib/**/*') + [
15
- 'README.rdoc',
15
+ 'LICENSE',
16
+ 'README.md',
16
17
  'VERSION',
17
18
  'haproxy_log_parser.gemspec'
18
19
  ]
@@ -86,7 +86,7 @@ module HAProxyLogParser
86
86
  # @return [String]
87
87
  attr_accessor :http_request
88
88
 
89
- # return [true, false] true if and only if request was SSL
89
+ # return [Boolean] true if and only if request was SSL
90
90
  def ssl?
91
91
  @transport_mode == '~'
92
92
  end
@@ -1,23 +1,28 @@
1
1
  require 'treetop'
2
2
 
3
3
  require 'haproxy_log_parser/entry'
4
-
5
- Treetop.load(File.expand_path('haproxy_log_parser/line.treetop', File.dirname(__FILE__)))
4
+ require 'haproxy_log_parser/line'
6
5
 
7
6
  module HAProxyLogParser
8
7
  VERSION = IO.read(File.join(File.dirname(__FILE__), '..', 'VERSION')).chomp.freeze
9
8
 
10
- @parser = LineParser.new
9
+ # Exception for failures when parsing lines
10
+ class ParseError < ::StandardError; end
11
11
 
12
12
  class << self
13
13
  # Returns an Entry object resulting from the given HAProxy HTTP-format log
14
- # +line+, or +nil+ if the +line+ appears to be invalid.
14
+ # +line+.
15
15
  #
16
- # @param [String] line a line from an HAProxy log
17
- # @return [Entry, nil]
16
+ # @param line [String] a line from an HAProxy log
17
+ # @return [Entry]
18
+ # @raise [ParseError] if the line was not parsed successfully
18
19
  def parse(line)
19
- result = @parser.parse(line)
20
- return nil unless result
20
+ parser = LineParser.new
21
+ result = parser.parse(line)
22
+
23
+ unless result
24
+ raise ParseError, parser.failure_reason
25
+ end
21
26
 
22
27
  entry = Entry.new
23
28
  [
@@ -59,8 +64,8 @@ module HAProxyLogParser
59
64
  # Returns the given string un-escaped. See the "Logging > Non-printable
60
65
  # characters" section in HAProxy documentation.
61
66
  #
62
- # @param [String] string
63
- # @return [String]
67
+ # @param string [String] string to unescape
68
+ # @return [String] an unescaped string
64
69
  def unescape(string)
65
70
  string.gsub(/#[[:xdigit:]]{2}/) do |match|
66
71
  match[1..-1].to_i(16).chr
@@ -69,7 +74,7 @@ module HAProxyLogParser
69
74
 
70
75
  # Converts the value of an accept_date field to a Time object.
71
76
  #
72
- # @param [String] string
77
+ # @param string [String] value of an accept_date field
73
78
  # @return [Time]
74
79
  def parse_accept_date(string)
75
80
  parts = string.split(/[\/:.]/)
@@ -78,8 +83,10 @@ module HAProxyLogParser
78
83
 
79
84
  # Converts a captured cookie string to a Hash.
80
85
  #
81
- # @param [String] string
86
+ # @param string [String] a captured cookie string
82
87
  # @return [Hash{String => String}]
88
+ # a one-entry Hash with the cookie name and value, or an empty Hash if no
89
+ # cookie was captured
83
90
  def decode_captured_cookie(string)
84
91
  if string == '-'
85
92
  {}
@@ -91,8 +98,8 @@ module HAProxyLogParser
91
98
 
92
99
  # Converts a captured headers string to an Array.
93
100
  #
94
- # @param [String] string
95
- # @return [Array<String>]
101
+ # @param string [String] a captured headers section
102
+ # @return [Array<String>] array of captured header values
96
103
  def decode_captured_headers(string)
97
104
  string.split('|', -1).map! { |header| unescape(header) }
98
105
  end
@@ -1,6 +1,6 @@
1
1
  require 'haproxy_log_parser'
2
2
 
3
- describe HAProxyLogParser do
3
+ RSpec.describe HAProxyLogParser do
4
4
  # TODO Use something better instead of LINES[0], LINES[1], ...
5
5
  LINES = IO.readlines(File.join(File.dirname(__FILE__), 'sample.log'))
6
6
 
@@ -33,7 +33,7 @@ describe HAProxyLogParser do
33
33
  expect(entry.backend_queue).to eq(0)
34
34
  expect(entry.captured_request_headers).to eq(['www.sytadin.equipement.gouv.fr', '', 'http://trafic.1wt.eu/'])
35
35
  expect(entry.captured_response_headers).to eq(['Apache', '230', '', '', 'http://www.sytadin.'])
36
- expect(entry.http_request).to eq('GET http://www.sytadin.equipement.gouv.fr/ HTTP/1.1')
36
+ expect(entry.http_request).to eq('GET / HTTP/1.1')
37
37
  end
38
38
 
39
39
  it 'parses LINES[1] correctly' do
@@ -67,8 +67,10 @@ describe HAProxyLogParser do
67
67
  expect(entry.http_request).to eq('GET /images/image.gif HTTP/1.1')
68
68
  end
69
69
 
70
- it 'returns nil if the line is invalid' do
71
- expect(HAProxyLogParser.parse('asdf jkl;')).to be_nil
70
+ it 'raises ParseError if the line is invalid' do
71
+ line = 'Aug 9 20:30:46 localhost haproxy[2022]: '
72
+ expect { HAProxyLogParser.parse(line) }.
73
+ to raise_error(HAProxyLogParser::ParseError)
72
74
  end
73
75
  end
74
76
  end
data/spec/sample.log CHANGED
@@ -1,2 +1,2 @@
1
- Aug 9 20:30:46 localhost haproxy[2022]: 10.0.8.2:34028 [09/Aug/2011:20:30:46.429] proxy-out~ proxy-out/cache1 1/0/2/126/+128 301 +223 - - LR-- 617/523/336/168/0 0/0 {www.sytadin.equipement.gouv.fr||http://trafic.1wt.eu/} {Apache|230|||http://www.sytadin.} "GET http://www.sytadin.equipement.gouv.fr/ HTTP/1.1"
1
+ Aug 9 20:30:46 localhost haproxy[2022]: 10.0.8.2:34028 [09/Aug/2011:20:30:46.429] proxy-out~ proxy-out/cache1 1/0/2/126/+128 301 +223 - - LR-- 617/523/336/168/0 0/0 {www.sytadin.equipement.gouv.fr||http://trafic.1wt.eu/} {Apache|230|||http://www.sytadin.} "GET / HTTP/1.1"
2
2
  May 21 01:35:46 10.18.237.5 haproxy[26747]: 192.168.1.215:50679 [21/May/2012:01:35:46.146] webapp webapp_backend/web09 27/0/1/0/217 200 1367 session=abc session=xyz ---- 600/529/336/158/0 0/0 {#7C#7C #7B5F41#7D|http://google.com/|} "GET /images/image.gif HTTP/1.1"
metadata CHANGED
@@ -1,103 +1,82 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: haproxy_log_parser
3
- version: !ruby/object:Gem::Version
4
- hash: 23
5
- prerelease: false
6
- segments:
7
- - 0
8
- - 0
9
- - 4
10
- version: 0.0.4
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
11
5
  platform: ruby
12
- authors:
6
+ authors:
13
7
  - Toby Hsieh
14
8
  autorequire:
15
9
  bindir: bin
16
10
  cert_chain: []
17
-
18
- date: 2014-08-16 00:00:00 -07:00
19
- default_executable:
20
- dependencies:
21
- - !ruby/object:Gem::Dependency
11
+ date: 2016-09-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
22
14
  name: treetop
23
- prerelease: false
24
- requirement: &id001 !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
27
17
  - - ">="
28
- - !ruby/object:Gem::Version
29
- hash: 3
30
- segments:
31
- - 0
32
- version: "0"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
33
20
  type: :runtime
34
- version_requirements: *id001
35
- - !ruby/object:Gem::Dependency
36
- name: rspec
37
21
  prerelease: false
38
- requirement: &id002 !ruby/object:Gem::Requirement
39
- none: false
40
- requirements:
41
- - - ~>
42
- - !ruby/object:Gem::Version
43
- hash: 25
44
- segments:
45
- - 2
46
- - 13
47
- version: "2.13"
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 3.5.0
48
34
  type: :development
49
- version_requirements: *id002
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 3.5.0
50
41
  description: Parser for HAProxy logs in the HTTP log format
51
42
  email:
52
43
  executables: []
53
-
54
44
  extensions: []
55
-
56
45
  extra_rdoc_files: []
57
-
58
- files:
59
- - lib/haproxy_log_parser/entry.rb
60
- - lib/haproxy_log_parser/line.treetop
61
- - lib/haproxy_log_parser.rb
62
- - README.rdoc
46
+ files:
47
+ - LICENSE
48
+ - README.md
63
49
  - VERSION
64
50
  - haproxy_log_parser.gemspec
51
+ - lib/haproxy_log_parser.rb
52
+ - lib/haproxy_log_parser/entry.rb
53
+ - lib/haproxy_log_parser/line.treetop
65
54
  - spec/haproxy_log_parser_spec.rb
66
55
  - spec/sample.log
67
- has_rdoc: true
68
56
  homepage: https://github.com/tobyhs/haproxy_log_parser
69
- licenses:
57
+ licenses:
70
58
  - MIT
59
+ metadata: {}
71
60
  post_install_message:
72
61
  rdoc_options: []
73
-
74
- require_paths:
62
+ require_paths:
75
63
  - lib
76
- required_ruby_version: !ruby/object:Gem::Requirement
77
- none: false
78
- requirements:
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
79
66
  - - ">="
80
- - !ruby/object:Gem::Version
81
- hash: 3
82
- segments:
83
- - 0
84
- version: "0"
85
- required_rubygems_version: !ruby/object:Gem::Requirement
86
- none: false
87
- requirements:
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
88
71
  - - ">="
89
- - !ruby/object:Gem::Version
90
- hash: 3
91
- segments:
92
- - 0
93
- version: "0"
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
94
74
  requirements: []
95
-
96
75
  rubyforge_project:
97
- rubygems_version: 1.3.7
76
+ rubygems_version: 2.5.1
98
77
  signing_key:
99
- specification_version: 3
78
+ specification_version: 4
100
79
  summary: Parser for HAProxy logs in the HTTP log format
101
- test_files:
80
+ test_files:
102
81
  - spec/haproxy_log_parser_spec.rb
103
82
  - spec/sample.log
data/README.rdoc DELETED
@@ -1,11 +0,0 @@
1
- = haproxy_log_parser
2
-
3
- haproxy_log_parser is a gem that uses Treetop to parse HAProxy logs in
4
- HAProxy's HTTP log format.
5
-
6
- == Example
7
-
8
- require 'haproxy_log_parser'
9
- result = HAProxyLogParser.parse('Aug 9 20:30:46 localhost haproxy[2022]: 10.0.8.2:34028 [09/Aug/2011:20:30:46.429] proxy-out proxy-out/cache1 1/0/2/126/+128 301 +223 - - ---- 617/523/336/168/0 0/0 {www.sytadin.equipement.gouv.fr||http://trafic.1wt.eu/} {Apache|230|||http://www.sytadin.} "GET http://www.sytadin.equipement.gouv.fr/ HTTP/1.1"')
10
- result.client_ip # => "10.0.8.2"
11
- result.captured_response_headers # => ["Apache", "230", "", "", "http://www.sytadin."]