Class: Hatetepe::Parser

Inherits:
Object
  • Object
show all
Includes:
Events
Defined in:
lib/hatetepe/parser.rb

Instance Attribute Summary collapse

Attributes included from Events

#state

Instance Method Summary collapse

Methods included from Events

#event, #event!, included

Constructor Details

#initialize(&block) ⇒ Parser

Returns a new instance of Parser.



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
# File 'lib/hatetepe/parser.rb', line 21

def initialize(&block)
  @parser = HTTP::Parser.new.tap do |p|
    p.on_headers_complete = proc do
      version = p.http_version.join(".")
      if p.http_method
        @message = Request.new(p.http_method, p.request_url,
                               p.headers, Body.new, version)
        event! :request, message
      else
        @message = Response.new(p.status_code, p.headers, Body.new, version)
        event! :response, message
      end
      
      event! :headers, message.headers
      event! :body, message.body
      nil
    end
    
    p.on_body = proc do |chunk|
      message.body.write chunk unless message.body.closed_write?
    end
    
    p.on_message_complete = method(:complete)
  end
  
  reset
  
  if block
    block.arity == 0 ? instance_eval(&block) : block.call(self)
  end
end

Instance Attribute Details

#messageObject (readonly)

Returns the value of attribute message.



19
20
21
# File 'lib/hatetepe/parser.rb', line 19

def message
  @message
end

Instance Method Details

#<<(data) ⇒ Object



65
66
67
68
69
# File 'lib/hatetepe/parser.rb', line 65

def <<(data)
  @parser << data
rescue HTTP::Parser::Error => e
  raise Hatetepe::ParserError, e.message, e.backtrace
end

#completeObject



59
60
61
62
63
# File 'lib/hatetepe/parser.rb', line 59

def complete
  message.body.rewind
  message.body.close_write unless message.body.closed_write?
  event! :complete
end

#resetObject



53
54
55
56
57
# File 'lib/hatetepe/parser.rb', line 53

def reset
  @parser.reset!
  event! :reset
  @message = nil
end