prototype: Allow WEBrick to simulate slow or dropped connections and to ease Ajax request inspection.

This commit is contained in:
Tobie Langel 2007-12-30 10:54:34 +00:00
parent f0d54a48bd
commit 143b13d069
3 changed files with 91 additions and 20 deletions

View File

@ -1,5 +1,7 @@
*SVN*
* Allow WEBrick to simulate slow or dropped connections and to ease Ajax request inspection. [Tobie Langel]
* Ensure Ajax.Response#getHeader returns null for missing headers. [Tobie Langel]
* Ensure $A creates an empty array when its argument's length is undefined. Closes #10574. [henryju, Tobie Langel]

View File

@ -168,31 +168,103 @@ class ::WEBrick::HTTPServer
# nop
end
end
class ::WEBrick::BasicLog
def log(level, data)
# nop
end
end
class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler
def do_GET(req, res)
super
res['Content-Type'] = case req.path
when /\.js$/ then 'text/javascript'
when /\.html$/ then 'text/html'
when /\.css$/ then 'text/css'
else 'text/plain'
end
class WEBrick::HTTPResponse
alias send send_response
def send_response(socket)
send(socket) unless fail_silently?
end
def fail_silently?
@fail_silently
end
def fail_silently
@fail_silently = true
end
end
class WEBrick::HTTPRequest
def to_json
headers = []
each { |k, v| headers.push "#{k.inspect}: #{v.inspect}" }
headers = "{" << headers.join(', ') << "}"
%({ "headers": #{headers}, "body": #{body.inspect}, "method": #{request_method.inspect} })
end
end
class WEBrick::HTTPServlet::AbstractServlet
def prevent_caching(res)
res['ETag'] = nil
res['Last-Modified'] = Time.now + 100**4
res['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0'
res['Pragma'] = 'no-cache'
res['Expires'] = Time.now - 100**4
end
def set_default_content_type(res, path)
res['Content-Type'] = case path
when /\.js$/ then 'text/javascript'
when /\.html$/ then 'text/html'
when /\.css$/ then 'text/css'
else 'text/plain'
end
end
end
class BasicServlet < WEBrick::HTTPServlet::AbstractServlet
def do_GET(req, res)
set_default_content_type(res, req.path)
prevent_caching(res)
req.query.each do |k, v|
res[k] = v unless k == 'responseBody'
end
res.body = req.query["responseBody"]
raise WEBrick::HTTPStatus::OK
end
def do_POST(req, res)
do_GET(req, res)
end
end
class SlowServlet < BasicServlet
def do_GET(req, res)
sleep(2)
super
end
end
class DownServlet < BasicServlet
def do_GET(req, res)
res.fail_silently
end
end
class InspectionServlet < BasicServlet
def do_GET(req, res)
prevent_caching(res)
res['Content-Type'] = "application/json"
res.body = req.to_json
raise WEBrick::HTTPStatus::OK
end
end
class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler
def do_GET(req, res)
super
set_default_content_type(res, req.path)
prevent_caching(res)
end
end
class JavaScriptTestTask < ::Rake::TaskLib
@ -213,13 +285,10 @@ class JavaScriptTestTask < ::Rake::TaskLib
})
res.body = "OK"
end
@server.mount_proc("/content-type") do |req, res|
res.body = req["content-type"]
end
@server.mount_proc("/response") do |req, res|
req.query.each {|k, v| res[k] = v unless k == 'responseBody'}
res.body = req.query["responseBody"]
end
@server.mount("/response", BasicServlet)
@server.mount("/slow", SlowServlet)
@server.mount("/down", DownServlet)
@server.mount("/inspect", InspectionServlet)
yield self if block_given?
define
end

View File

@ -230,11 +230,11 @@
testContentTypeSetForSimulatedVerbs: function() {with(this) {
if (isRunningFromRake) {
new Ajax.Request('/content-type', extendDefault({
new Ajax.Request('/inspect', extendDefault({
method: 'put',
contentType: 'application/bogus',
onComplete: function(response) {
assertEqual('application/bogus; charset=UTF-8', response.responseText);
assertEqual('application/bogus; charset=UTF-8', response.responseJSON.headers['content-type']);
}
}));
} else {