class WEBrick::HTTPServlet::FileHandler

def set_dir_list(req, res)

def set_dir_list(req, res)
  redirect_to_directory_uri(req, res)
  unless @options[:FancyIndexing]
    raise HTTPStatus::Forbidden, "no access permission to '#{req.path}'"
  end
  local_path = res.filename
  list = Dir::entries(local_path).collect{|name|
    next if name == "." || name == ".."
    next if nondisclosure_name?(name)
    next if windows_ambiguous_name?(name)
    st = (File::stat(File.join(local_path, name)) rescue nil)
    if st.nil?
      [ name, nil, -1 ]
    elsif st.directory?
      [ name + "/", st.mtime, -1 ]
    else
      [ name, st.mtime, st.size ]
    end
  }
  list.compact!
  query = req.query
  d0 = nil
  idx = nil
  %w[N M S].each_with_index do |q, i|
    if d = query.delete(q)
      idx ||= i
      d0 ||= d
    end
  end
  d0 ||= "A"
  idx ||= 0
  d1 = (d0 == "A") ? "D" : "A"
  if d0 == "A"
    list.sort!{|a,b| a[idx] <=> b[idx] }
  else
    list.sort!{|a,b| b[idx] <=> a[idx] }
  end
  namewidth = query["NameWidth"]
  if namewidth == "*"
    namewidth = nil
  elsif !namewidth or (namewidth = namewidth.to_i) < 2
    namewidth = 25
  end
  query = query.inject('') {|s, (k, v)| s << '&' << HTMLUtils::escape("#{k}=#{v}")}.dup
  type = +"text/html"
  case enc = Encoding.find('filesystem')
  when Encoding::US_ASCII, Encoding::ASCII_8BIT
  else
    type << "; charset=\"#{enc.name}\""
  end
  res['content-type'] = type
  title = "Index of #{HTMLUtils::escape(req.path)}"
  res.body = +<<-_end_of_html_
YPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">

D>
ITLE>#{title}</TITLE>
tyle type="text/css">
--
ame, .mtime { text-align: left; }
ize { text-align: right; }
 { text-overflow: ellipsis; white-space: nowrap; overflow: hidden; }
ble { border-collapse: collapse; }
 th { border-bottom: 2px groove; }
-->
style>
AD>
Y>
1>#{title}</H1>
  _end_of_html_
  res.body << "<TABLE width=\"100%\"><THEAD><TR>\n"
  res.body << "<TH class=\"name\"><A HREF=\"?N=#{d1}#{query}\">Name</A></TH>"
  res.body << "<TH class=\"mtime\"><A HREF=\"?M=#{d1}#{query}\">Last modified</A></TH>"
  res.body << "<TH class=\"size\"><A HREF=\"?S=#{d1}#{query}\">Size</A></TH>\n"
  res.body << "</TR></THEAD>\n"
  res.body << "<TBODY>\n"
  query.sub!(/\A&/, '?')
  list.unshift [ "..", File::mtime(local_path+"/.."), -1 ]
  list.each{ |name, time, size|
    if name == ".."
      dname = "Parent Directory"
    elsif namewidth and name.size > namewidth
      dname = name[0...(namewidth - 2)] << '..'
    else
      dname = name
    end
    s =  +"<TR><TD class=\"name\"><A HREF=\"#{HTTPUtils::escape(name)}#{query if name.end_with?('/')}\">#{HTMLUtils::escape(dname)}</A></TD>"
    s << "<TD class=\"mtime\">" << (time ? time.strftime("%Y/%m/%d %H:%M") : "") << "</TD>"
    s << "<TD class=\"size\">" << (size >= 0 ? size.to_s : "-") << "</TD></TR>\n"
    res.body << s
  }
  res.body << "</TBODY></TABLE>"
  res.body << "<HR>"
  res.body << <<-_end_of_html_
DDRESS>
{HTMLUtils::escape(@config[:ServerSoftware])}<BR>
t #{req.host}:#{req.port}
ADDRESS>
DY>
>
  _end_of_html_
end