rack-livereload/lib/rack/livereload.rb

52 lines
1.4 KiB
Ruby
Raw Normal View History

2011-11-04 15:51:22 +00:00
module Rack
class LiveReload
LIVERELOAD_JS_PATH = '/__rack/livereload.js'
attr_reader :app
def initialize(app, options = {})
2011-11-04 15:51:22 +00:00
@app = app
@options = options
2011-11-04 15:51:22 +00:00
end
def call(env)
if env['PATH_INFO'] == LIVERELOAD_JS_PATH
deliver_file(::File.expand_path('../../../js/livereload.js', __FILE__))
else
status, headers, body = @app.call(env)
case headers['Content-Type']
when %r{text/html}
2011-11-07 13:49:42 +00:00
content_length = 0
2011-11-04 15:51:22 +00:00
body.each do |line|
2011-11-07 13:49:42 +00:00
if !headers['X-Rack-LiveReload'] && line['</head>']
2011-11-04 15:57:41 +00:00
src = LIVERELOAD_JS_PATH.dup
2011-11-04 15:51:22 +00:00
src << "?host=#{env['HTTP_HOST'].gsub(%r{:.*}, '')}" if env['HTTP_HOST']
src << "&mindelay=#{@options[:min_delay]}" if @options[:min_delay]
src << "&maxdelay=#{@options[:max_delay]}" if @options[:max_delay]
src << "&port=#{@options[:port]}" if @options[:port]
2011-11-04 15:51:22 +00:00
line.gsub!('</head>', %{<script type="text/javascript" src="#{src}"></script></head>})
2011-11-07 13:41:51 +00:00
2011-11-07 13:49:42 +00:00
headers["X-Rack-LiveReload"] = '1'
2011-11-04 15:51:22 +00:00
end
2011-11-07 13:49:42 +00:00
content_length += line.length
2011-11-04 15:51:22 +00:00
end
2011-11-07 13:49:42 +00:00
headers['Content-Length'] = content_length.to_s
2011-11-04 15:51:22 +00:00
end
[ status, headers, body ]
end
end
private
def deliver_file(file)
[ 200, { 'Content-Type' => 'text/javascript', 'Content-Length' => ::File.size(file).to_s }, [ ::File.read(file) ] ]
end
end
end