class Rack::LiveReload::BodyProcessor

Constants

HEAD_TAG_REGEX
LIVERELOAD_JS_PATH
LIVERELOAD_PORT

Attributes

content_length[R]
livereload_added[R]
new_body[R]

Public Class Methods

new(body, options) click to toggle source
# File lib/rack/livereload/body_processor.rb, line 20
def initialize(body, options)
  @body, @options = body, options
  @options[:live_reload_port] ||= LIVERELOAD_PORT

  @processed = false
end

Public Instance Methods

app_root() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 88
def app_root
  ENV['RAILS_RELATIVE_URL_ROOT'] || ''
end
force_swf?() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 27
def force_swf?
  @options[:force_swf]
end
host_to_use() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 92
def host_to_use
  (@options[:host] || @env['HTTP_HOST'] || 'localhost').gsub(%r{:.*}, '')
end
livereload_local_uri() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 16
def livereload_local_uri
  "#{protocol}://localhost:#{@options[:live_reload_port]}/livereload.js"
end
livereload_source() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 100
def livereload_source
  if use_vendored?
    src = "#{app_root}#{LIVERELOAD_JS_PATH.dup}?host=#{host_to_use}"
  else
    src = livereload_local_uri.dup.gsub('localhost', host_to_use) + '?'
  end

  src << "&amp;mindelay=#{@options[:min_delay]}" if @options[:min_delay]
  src << "&amp;maxdelay=#{@options[:max_delay]}" if @options[:max_delay]
  src << "&amp;port=#{@options[:port]}" if @options[:port]

  src
end
process!(env) click to toggle source
# File lib/rack/livereload/body_processor.rb, line 67
def process!(env)
  @env = env
  @body.close if @body.respond_to?(:close)

  @new_body = [] ; @body.each { |line| @new_body << line.to_s }

  @content_length = 0
  @livereload_added = false

  @new_body.each do |line|
    if !@livereload_added && line['<head']
      line.gsub!(HEAD_TAG_REGEX) { |match| %{#{match}#{template.result(binding)}} }

      @livereload_added = true
    end

    @content_length += line.bytesize
    @processed = true
  end
end
processed?() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 63
def processed?
  @processed
end
protocol() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 12
def protocol
  @options[:protocol] || "http"
end
template() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 96
def template
  ERB.new(::File.read(::File.expand_path('../../../../skel/livereload.html.erb', __FILE__)))
end
use_vendored?() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 35
def use_vendored?
  return @use_vendored if @use_vendored

  if @options[:source]
    @use_vendored = (@options[:source] == :vendored)
  else
    require 'net/http'
    require 'uri'

    uri = URI.parse(livereload_local_uri)

    http = Net::HTTP.new(uri.host, uri.port)
    http.read_timeout = 1

    begin
      http.send_request('GET', uri.path)
      @use_vendored = false
    rescue ::Timeout::Error, Errno::ECONNREFUSED, EOFError, IOError
      @use_vendored = true
    rescue => e
      $stderr.puts e.inspect
      raise e
    end
  end

  @use_vendored
end
with_swf?() click to toggle source
# File lib/rack/livereload/body_processor.rb, line 31
def with_swf?
  !@options[:no_swf]
end