1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
require 'test/unit'
require 'rubygems'
require 'mechanize'
require 'webrick/httputils'
require 'servlets'
BASE_DIR = File.dirname(__FILE__)
class Net::HTTP
alias :old_do_start :do_start
def do_start
@started = true
end
SERVLETS = {
'/gzip' => GzipServlet,
'/form_post' => FormTest,
'/basic_auth' => BasicAuthServlet,
'/form post' => FormTest,
'/response_code' => ResponseCodeTest,
'/bad_content_type' => BadContentTypeTest,
'/content_type_test' => ContentTypeTest,
'/referer' => RefererServlet,
'/file_upload' => FileUploadTest,
'/one_cookie' => OneCookieTest,
'/one_cookie_no_space' => OneCookieNoSpacesTest,
'/many_cookies' => ManyCookiesTest,
'/many_cookies_as_string' => ManyCookiesAsStringTest,
'/send_cookies' => SendCookiesTest,
'/if_modified_since' => ModifiedSinceServlet,
'/http_headers' => HeaderServlet,
}
PAGE_CACHE = {}
alias :old_request :request
def request(request, *data, &block)
url = URI.parse(request.path)
path = URI.unescape(url.path)
path = '/index.html' if path == '/'
res = Response.new
request.query = WEBrick::HTTPUtils.parse_query(url.query)
request.cookies = WEBrick::Cookie.parse(request['Cookie'])
if SERVLETS[path]
if request.method == "POST"
if request['Content-Type'] =~ /^multipart\/form-data/
request.body = data.first
else
request.query = WEBrick::HTTPUtils.parse_query(data.first)
end
end
SERVLETS[path].new({}).send("do_#{request.method}", request, res)
else
filename = "htdocs#{path.gsub(/[^\/\\.\w_\s]/, '_')}"
unless PAGE_CACHE[filename]
File.open("#{BASE_DIR}/#{filename}", 'rb') { |file|
PAGE_CACHE[filename] = file.read
}
end
res.body = PAGE_CACHE[filename]
end
res['Content-Type'] ||= 'text/html'
res['Content-Length'] ||= res.body.length.to_s
res.code ||= "200"
res.cookies.each do |cookie|
res.add_field('Set-Cookie', cookie.to_s)
end
yield res if block_given?
res
end
end
class Net::HTTPRequest
attr_accessor :query, :body, :cookies, :user
end
class Response
include Net::HTTPHeader
attr_reader :code
attr_accessor :body, :query, :cookies
def code=(c)
@code = c.to_s
end
alias :status :code
alias :status= :code=
def initialize
@header = {}
@body = ''
@code = nil
@query = nil
@cookies = []
end
def read_body
yield body
end
end
|