lib/faye/adapters/rack_adapter.rb in faye-0.6.6 vs lib/faye/adapters/rack_adapter.rb in faye-0.6.7

- old
+ new

@@ -1,9 +1,11 @@ +require 'cgi' +require 'digest/sha1' require 'json' require 'rack' require 'thin' -require 'cgi' +require 'time' require Faye::ROOT + '/faye/thin_extensions' module Faye class RackAdapter @@ -71,31 +73,53 @@ env['faye.client'] = get_client return @app ? @app.call(env) : [404, TYPE_TEXT, ["Sure you're not looking for #{@endpoint} ?"]] end - return handle_options(request) if env['REQUEST_METHOD'] == 'OPTIONS' - return handle_upgrade(request) if env['HTTP_UPGRADE'] =~ /^WebSocket$/i - return [200, TYPE_SCRIPT, File.new(SCRIPT_PATH)] if request.path_info =~ /\.js$/ + return serve_client_script(env) if request.path_info =~ /\.js$/ + return handle_options(request) if env['REQUEST_METHOD'] == 'OPTIONS' + return handle_upgrade(request) if env['HTTP_UPGRADE'] =~ /^WebSocket$/i + handle_request(request) end private + def serve_client_script(env) + @client_script ||= File.read(SCRIPT_PATH) + @client_digest ||= Digest::SHA1.hexdigest(@client_script) + @client_mtime ||= File.mtime(SCRIPT_PATH) + + headers = TYPE_SCRIPT.dup + ims = env['HTTP_IF_MODIFIED_SINCE'] + + headers['ETag'] = @client_digest + headers['Last-Modified'] = @client_mtime.httpdate + + if env['HTTP_IF_NONE_MATCH'] == @client_digest + [304, headers, ['']] + elsif ims and @client_mtime <= Time.httpdate(ims) + [304, headers, ['']] + else + [200, headers, [@client_script]] + end + end + def handle_request(request) json_msg = message_from_request(request) message = JSON.parse(json_msg) jsonp = request.params['jsonp'] || JSONP_CALLBACK - head = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup + headers = request.get? ? TYPE_SCRIPT.dup : TYPE_JSON.dup origin = request.env['HTTP_ORIGIN'] callback = request.env['async.callback'] body = DeferredBody.new debug 'Received ?: ?', request.env['REQUEST_METHOD'], json_msg @server.flush_connection(message) if request.get? - head['Access-Control-Allow-Origin'] = origin if origin - callback.call [200, head, body] + headers['Access-Control-Allow-Origin'] = origin if origin + headers['Cache-Control'] = 'no-cache, no-store' if request.get? + callback.call [200, headers, body] @server.process(message, false) do |replies| response = JSON.unparse(replies) response = "#{ jsonp }(#{ response });" if request.get? debug 'Returning ?', response