Module: PcapTools::HttpParser

Defined in:
lib/pcap_tools.rb

Class Method Summary collapse

Class Method Details

.parse_request(stream) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/pcap_tools.rb', line 123

def parse_request stream
  headers, body = split_headers(stream[:data])
  line0 = headers.shift
  m = /(\S+)\s+(\S+)\s+(\S+)/.match(line0) or raise "Unable to parse first line of http request #{line0}"
  clazz = {'POST' => Net::HTTP::Post, 'HEAD' => Net::HTTP::Head, 'GET' => Net::HTTP::Get, 'PUT' => Net::HTTP::Put}[m[1]] or raise "Unknown http request type #{m[1]}"
  req = clazz.new m[2]
  req['Pcap-Src'] = stream[:from]
  req['Pcap-Src-Port'] = stream[:from_port]
  req['Pcap-Dst'] = stream[:to]
  req['Pcap-Dst-Port'] = stream[:to_port]
  req.time = stream[:time]
  req.body = body
  req['user-agent'] = nil
  req['accept'] = nil
  add_headers req, headers
  req.body.size == req['Content-Length'].to_i or raise "Wrong content-length for http request, header say #{req['Content-Length'].chomp}, found #{req.body.size}"
  req
end

.parse_response(stream) ⇒ Object



144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# File 'lib/pcap_tools.rb', line 144

def parse_response stream
  headers, body = split_headers(stream[:data])
  line0 = headers.shift
  m = /^(\S+)\s+(\S+)\s+(.*)$/.match(line0) or raise "Unable to parse first line of http response #{line0}"
  resp = Net::HTTPResponse.send(:response_class, m[2]).new(m[1], m[2], m[3])
  resp.time = stream[:time]
  add_headers resp, headers
  if resp.chunked?
    resp.body = read_chunked("\r\n" + body)
  else
    resp.body = body
    resp.body.size == resp['Content-Length'].to_i or raise "Wrong content-length for http response, header say #{resp['Content-Length'].chomp}, found #{resp.body.size}"
  end
  resp.body = Zlib::GzipReader.new(StringIO.new(resp.body)).read if resp['Content-Encoding'] == 'gzip'
  resp
end