def serving(env)
if env["REQUEST_METHOD"] == "OPTIONS"
return [200, {'Allow' => ALLOW_HEADER, CONTENT_LENGTH => '0'}, []]
end
last_modified = F.mtime(@path).httpdate
return [304, {}, []] if env['HTTP_IF_MODIFIED_SINCE'] == last_modified
headers = { "Last-Modified" => last_modified }
headers[CONTENT_TYPE] = mime_type if mime_type
@headers.each { |field, content| headers[field] = content } if @headers
response = [ 200, headers, env[REQUEST_METHOD] == "HEAD" ? [] : self ]
size = filesize
ranges = Rack::Utils.byte_ranges(env, size)
if ranges.nil? || ranges.length > 1
response[0] = 200
@range = 0..size-1
elsif ranges.empty?
response = fail(416, "Byte range unsatisfiable")
response[1]["Content-Range"] = "bytes */#{size}"
return response
else
@range = ranges[0]
response[0] = 206
response[1]["Content-Range"] = "bytes #{@range.begin}-#{@range.end}/#{size}"
size = @range.end - @range.begin + 1
end
response[2] = [response_body] unless response_body.nil?
response[1][CONTENT_LENGTH] = size.to_s
response
end