Class: PacketGen::Header::HTTP::Request

Inherits:
Base
  • Object
show all
Defined in:
lib/packetgen/header/http/request.rb

Overview

An HTTP/1.1 Request packet consists of:

  • the http verb (BinStruct::String).

  • the path (BinStruct::String).

  • the version (BinStruct::String).

  • associated http headers (Headers).

  • and a #body (BinStruct::String).

Note: When creating a HTTP Request packet, TCP#sport and TCP#dport attributes are not set.

Examples:

Create a HTTP Request header

# standalone
http_request = PacketGen::Header::HTTP::Request.new
# in a packet
pkt = PacketGen.gen("IP").add("TCP").add("HTTP::Request")
# access to HTTP Request header
pkt.http_request.class # => PacketGen::Header::HTTP::Request

HTTP Request attributes

http_request = PacketGen::Header::HTTP::Request.new
http_request.version #=> "HTTP/1.1"
http_request.verb  = "GET"
http_request.path    = "/meow.html"
http_request.headers = "Host: tcpdump.org"     # string or
http_request.headers = { "Host": "tcpdump.org" } # even a hash

Author:

  • Kent ‘picat’ Gruber

  • Sylvain Daubert

  • LemonTree55

Since:

  • 3.1.0 Rename #method into #verb to not mask Object#method.

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from Base

bind, calculate_and_set_length, #header_id, inherited, #ip_header, #ll_header

Methods included from PacketGen::Headerable

#added_to_packet, included, #method_name, #packet, #packet=, #protocol_name

Constructor Details

#initialize(options = {}) ⇒ Request

Returns a new instance of Request.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :verb (String)
  • :path (String)
  • :version (String)
  • :headers (Hash)

Since:

  • 3.1.0 Rename #method into #verb to not mask Object#method.



70
71
72
73
# File 'lib/packetgen/header/http/request.rb', line 70

def initialize(options={})
  super
  self.headers ||= options[:headers]
end

Instance Attribute Details

#bodyBinStruct::String

HTTP request body, if any

Returns:

  • (BinStruct::String)


63
# File 'lib/packetgen/header/http/request.rb', line 63

define_attr :body, BinStruct::String

#headersHTTP::Headers

associated http/1.1 headers

Returns:



59
# File 'lib/packetgen/header/http/request.rb', line 59

define_attr :headers, HTTP::Headers

#pathBinStruct::String

Requested path

Returns:

  • (BinStruct::String)


51
# File 'lib/packetgen/header/http/request.rb', line 51

define_attr :path,    BinStruct::String

#verbBinStruct::String

HTTP verb (method)

Returns:

  • (BinStruct::String)

Since:

  • 3.1.0



47
# File 'lib/packetgen/header/http/request.rb', line 47

define_attr :verb, BinStruct::String

#versionBinStruct::String

HTTP version

Returns:

  • (BinStruct::String)


55
# File 'lib/packetgen/header/http/request.rb', line 55

define_attr :version, BinStruct::String, default: 'HTTP/1.1'

Instance Method Details

#parse?Boolean

May be parsed as a HTTP request if verb is known, and if version is HTTP/1.x.

Returns:

  • (Boolean)

Since:

  • 3.1.0 Rename #method into #verb to not mask Object#method.



94
95
96
# File 'lib/packetgen/header/http/request.rb', line 94

def parse?
  VERBS.include?(self.verb) && self.version.start_with?('HTTP/1.')
end

#read(str) ⇒ self

Read in the HTTP portion of the packet, and parse it.

Returns:

  • (self)

Since:

  • 3.1.0 Rename #method into #verb to not mask Object#method.



77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/packetgen/header/http/request.rb', line 77

def read(str)
  lines = lines(str)
  first_line_words = lines.shift.split
  self[:verb].read(first_line_words[0])
  self[:path].read(first_line_words[1])
  self[:version].read(first_line_words[2])

  # requests can sometimes have a payload
  headers, data = headers_and_payload_from_lines(lines)
  self[:headers].read(headers)
  self[:body].read(data)

  self
end

#to_sString

String representation of data.

Returns:

  • (String)

Raises:

Since:

  • 3.1.0 Rename #method into #verb to not mask Object#method.



100
101
102
103
104
105
106
# File 'lib/packetgen/header/http/request.rb', line 100

def to_s
  raise FormatError, 'Missing #verb.' if self.verb.empty?
  raise FormatError, 'Missing #path.'    if self.path.empty?
  raise FormatError, 'Missing #version.' if self.version.empty?

  "#{self.verb.dup} #{self.path} #{self.version}\r\n#{self[:headers]}#{self.body}"
end