Included Modules

EventMachine::Protocols::HeaderAndContentProtocol

Usage

 class RequestHandler < EM::P::HeaderAndContentProtocol
   def receive_request headers, content
     p [:request, headers, content]
   end
 end

 EM.run{
   EM.start_server 'localhost', 80, RequestHandler
 }

Constants

ContentLengthPattern

Public Class Methods

headers_2_hash(hdrs) click to toggle source
     # File lib/em/protocols/header_and_content.rb, line 124
124:         def headers_2_hash hdrs
125:           hash = {}
126:           hdrs.each {|h|
127:             if /\A([^\s:]+)\s*:\s*/ =~ h
128:               tail = $'.dup
129:               hash[ $1.downcase.gsub(/-/,"_").intern ] = tail
130:             end
131:           }
132:           hash
133:         end
new(*args) click to toggle source
    # File lib/em/protocols/header_and_content.rb, line 51
51:       def initialize *args
52:         super
53:         init_for_request
54:       end

Public Instance Methods

headers_2_hash(hdrs) click to toggle source

Basically a convenience method. We might create a subclass that does this automatically. But it’s such a performance killer.

     # File lib/em/protocols/header_and_content.rb, line 119
119:       def headers_2_hash hdrs
120:         self.class.headers_2_hash hdrs
121:       end
receive_binary_data(text) click to toggle source
    # File lib/em/protocols/header_and_content.rb, line 92
92:       def receive_binary_data text
93:         @hc_content = text
94:         dispatch_request
95:       end
receive_line(line) click to toggle source
    # File lib/em/protocols/header_and_content.rb, line 56
56:       def receive_line line
57:         case @hc_mode
58:         when :discard_blanks
59:           unless line == ""
60:             @hc_mode = :headers
61:             receive_line line
62:           end
63:         when :headers
64:           if line == ""
65:             raise "unrecognized state" unless @hc_headers.length > 0
66:             if respond_to?(:receive_headers)
67:               receive_headers @hc_headers
68:             end
69:             # @hc_content_length will be nil, not 0, if there was no content-length header.
70:             if @hc_content_length.to_i > 0
71:               set_binary_mode @hc_content_length
72:             else
73:               dispatch_request
74:             end
75:           else
76:             @hc_headers << line
77:             if ContentLengthPattern =~ line
78:               # There are some attacks that rely on sending multiple content-length
79:               # headers. This is a crude protection, but needs to become tunable.
80:               raise "extraneous content-length header" if @hc_content_length
81:               @hc_content_length = $1.to_i
82:             end
83:             if @hc_headers.length == 1 and respond_to?(:receive_first_header_line)
84:               receive_first_header_line line
85:             end
86:           end
87:         else
88:           raise "internal error, unsupported mode"
89:         end
90:       end

Private Instance Methods

dispatch_request() click to toggle source
     # File lib/em/protocols/header_and_content.rb, line 97
 97:       def dispatch_request
 98:         if respond_to?(:receive_request)
 99:           receive_request @hc_headers, @hc_content
100:         end
101:         init_for_request
102:       end
init_for_request() click to toggle source
     # File lib/em/protocols/header_and_content.rb, line 105
105:       def init_for_request
106:         @hc_mode = :discard_blanks
107:         @hc_headers = []
108:         # originally was @hc_headers ||= []; @hc_headers.clear to get a performance
109:         # boost, but it's counterproductive because a subclassed handler will have to
110:         # call dup to use the header array we pass in receive_headers.
111: 
112:         @hc_content_length = nil
113:         @hc_content = ""
114:       end

Disabled; run with --debug to generate this.

[Validate]

Generated with the Darkfish Rdoc Generator 1.1.6.