Class: NodeRb::Modules::Http::RackParser

Inherits:
Object
  • Object
show all
Includes:
Parser
Defined in:
lib/noderb/modules/http/rack_parser.rb

Instance Method Summary collapse

Methods included from Parser

#dispose, #on_header, #on_message_body, #on_message_error, #on_message_header, #on_status_code, #on_version, #parse, #setup

Constructor Details

#initialize(env) ⇒ RackParser

Returns a new instance of RackParser.



12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/noderb/modules/http/rack_parser.rb', line 12

def initialize(env)
  setup(:request)
  @env = {
      "rack.input" => StringIO.new,
      "rack.version" => ::Rack::VERSION,
      "rack.errors" => StringIO.new,
      "rack.multithread" => false,
      "rack.multiprocess" => false,
      "rack.run_once" => false,
      "rack.url_scheme" => "http"
  }.merge(env || {})
end

Instance Method Details

#<<(data) ⇒ Object



25
26
27
28
29
30
# File 'lib/noderb/modules/http/rack_parser.rb', line 25

def <<(data)
  self.parse(data)
  return nil unless @_state == :done
  self.dispose
  @env
end

#on_body(body) ⇒ Object



85
86
87
# File 'lib/noderb/modules/http/rack_parser.rb', line 85

def on_body(body)
  @env["rack.input"] << body
end

#on_error(name, description) ⇒ Object

Raises:

  • (RuntimeError)


89
90
91
# File 'lib/noderb/modules/http/rack_parser.rb', line 89

def on_error(name, description)
  raise(RuntimeError, "Http parser error: #{name} (#{description})")
end

#on_header_field(name) ⇒ Object



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/noderb/modules/http/rack_parser.rb', line 53

def on_header_field(name)
  if @_state == :value
    header = @_header_name.sub("-", "_").upcase
    case header
      when "CONTENT_TYPE", "CONTENT_LENGTH"
        @env[header] = @_header_value
      when "HOST"
        @env["HTTP_HOST"] = @_header_value
        unless @env["SERVER_NAME"]
          host = @_header_value.split(":")
          @env["SERVER_NAME"] = host[0]
          @env["SERVER_PORT"] = host[1] || 80
        end
      else
        @env["HTTP_#{header}"] = @_header_value
    end
    @_header_name = ""
    @_header_value = ""
  end
  @_state = :field
  @_header_name << name
end

#on_header_value(value) ⇒ Object



76
77
78
79
# File 'lib/noderb/modules/http/rack_parser.rb', line 76

def on_header_value(value)
  @_header_value << value
  @_state = :value
end

#on_headers_completeObject



81
82
83
# File 'lib/noderb/modules/http/rack_parser.rb', line 81

def on_headers_complete
  on_header_field("")
end

#on_keep_alive(status) ⇒ Object



93
94
95
# File 'lib/noderb/modules/http/rack_parser.rb', line 93

def on_keep_alive status
  @env["nrb.keep_alive"] = status
end

#on_message_beginObject



32
33
34
35
36
# File 'lib/noderb/modules/http/rack_parser.rb', line 32

def on_message_begin
  @_state = :field
  @_header_name = ""
  @_header_value = ""
end

#on_message_completeObject



101
102
103
# File 'lib/noderb/modules/http/rack_parser.rb', line 101

def on_message_complete
  @_state = :done
end

#on_method(method) ⇒ Object



38
39
40
# File 'lib/noderb/modules/http/rack_parser.rb', line 38

def on_method(method)
  @env["REQUEST_METHOD"] = method
end

#on_upgradeObject



97
98
99
# File 'lib/noderb/modules/http/rack_parser.rb', line 97

def on_upgrade
  @env["nrb.upgrade"] = true
end

#on_url(url) ⇒ Object



42
43
44
45
46
47
48
49
50
51
# File 'lib/noderb/modules/http/rack_parser.rb', line 42

def on_url(url)
  url = url.split("?", 2)
  if @env["SCRIPT_NAME"]
    url.sub!(@env["SCRIPT_NAME"], "")
  else
    @env["SCRIPT_NAME"] = ""
  end
  @env["PATH_INFO"] = url[0]
  @env["QUERY_STRING"] = url[1] || ""
end