class Firebug::Unserializer

This class will unserialize a PHP serialized string into a ruby object.

@attr [StringIOReader] str

Attributes

str[RW]

Public Class Methods

new(string) click to toggle source

@param [String] string

# File lib/firebug/unserializer.rb, line 14
def initialize(string)
  self.str = StringIOReader.new(string)
end
parse(value) click to toggle source

Convenience method for unserializing a PHP serialized string.

@see parse

@param [String] value @return [Object]

# File lib/firebug/unserializer.rb, line 24
def self.parse(value)
  new(value).parse
end

Public Instance Methods

parse() click to toggle source

Parse a PHP serialized string into a Ruby object.

@note Hashes will be returned with symbolized keys.

@raise [ParserError] @return [Hash, Array, String, Integer, Float, nil]

# File lib/firebug/unserializer.rb, line 34
def parse
  ch = str.getc
  return if ch.nil?

  str.getc # : or ;
  case ch
  when 'a'
    parse_enumerable.tap { str.getc }
  when 's'
    parse_string
  when 'i'
    parse_int
  when 'd'
    parse_double
  when 'b'
    parse_bool
  when 'N'
    nil
  else
    raise ParserError, "Unknown token '#{ch}' at position #{str.pos} (#{str.string})"
  end
end

Private Instance Methods

parse_bool() click to toggle source

@raise [ParserError] @return [Boolean]

# File lib/firebug/unserializer.rb, line 94
def parse_bool
  str.read(2)[0] == '1'
end
parse_double() click to toggle source

@raise [ParserError] @return [Float]

# File lib/firebug/unserializer.rb, line 88
def parse_double
  str.read_until(';')[0..-1].to_f
end
parse_enumerable() click to toggle source

@raise [ParseError] @return [Hash, Array]

# File lib/firebug/unserializer.rb, line 61
def parse_enumerable
  size = str.read_until('{')[0..-3].to_i # n:{
  return {} if size.zero?

  val = Array.new(size) { [parse, parse] }
  if val[0][0].is_a?(Integer)
    val.map! { |_, v| v }
  else
    val = Hash[val].transform_keys!(&:to_sym)
  end
  val
end
parse_int() click to toggle source

@raise [ParserError] @return [Integer]

# File lib/firebug/unserializer.rb, line 82
def parse_int
  str.read_until(';')[0..-1].to_i
end
parse_string() click to toggle source

@return [String]

# File lib/firebug/unserializer.rb, line 75
def parse_string
  size = str.read_until(':').to_i + 3 # add 3 for the 2 double quotes and semicolon
  String.new(str.read(size)[1..-3], encoding: Encoding::UTF_8)
end