Sha256: fd5153eb8e5c7aeb0264779db0f9d27066f97565c1ac5bb26fb4f717305e908e

Contents?: true

Size: 1.46 KB

Versions: 3

Compression:

Stored size: 1.46 KB

Contents

require 'eventmachine'
require 'em-websocket'
require 'http/parser'

module Guard
  class LiveReload
    class WebSocket < EventMachine::WebSocket::Connection

      def dispatch(data)
        parser = Http::Parser.new
        parser << data
        if parser.http_method != 'GET' || parser.upgrade?
          super #pass the request to websocket
        elsif parser.request_path == '/livereload.js'
          _serve_file(_livereload_js_file)
        elsif File.exist?(parser.request_path[1..-1])
          _serve_file(parser.request_path[1..-1]) # Strip leading slash
        else
          send_data("HTTP/1.1 404 Not Found\r\nContent-Type: text/plain\r\nContent-Length: 13\r\n\r\n404 Not Found")
          close_connection_after_writing
        end
      end

      private

      def _serve_file(path)
        UI.debug "Serving file #{path}"
        send_data "HTTP/1.1 200 OK\r\nContent-Type: #{_content_type(path)}\r\nContent-Length: #{File.size path}\r\n\r\n"
        stream_file_data(path).callback { close_connection_after_writing }
      end

      def _content_type(path)
        case File.extname(path)
        when '.css' then 'text/css'
        when '.js' then 'application/ecmascript'
        when '.gif' then 'image/gif'
        when '.jpeg', '.jpg' then 'image/jpeg'
        when '.png' then 'image/png'
        else; 'text/plain'
        end
      end

      def _livereload_js_file
        File.expand_path("../../../../js/livereload.js", __FILE__)
      end

    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
guard-livereload-2.1.0 lib/guard/livereload/websocket.rb
guard-livereload-2.0.1 lib/guard/livereload/websocket.rb
guard-livereload-2.0.0 lib/guard/livereload/websocket.rb