如何设置基本Webrick服务器的默认错误页面?

时间:2015-07-15 23:38:29

标签: ruby webrick

我有一个非常基本的webrick服务器,用于嵌入式设备的管理页面。我们刚刚为设备添加了基本身份验证,它运行良好,但是您可以获得通用的"未授权的"消息回复如下:

@IBAction func UIButtonClicked(sender:UIButton) {
    userMessage.hidden = true
    if plays[sender.tag] == nil && !aiDeciding && !done {
        setImageForSpot(sender.tag, player:1)
    }

有谁知道如何覆盖它以返回静态HTML文件?

1 个答案:

答案 0 :(得分:5)

查看源代码,看起来httpresponse.rb有一个名为create_error_page的“挂钩”:

  if respond_to?(:create_error_page)
    create_error_page()
    return
  end

因此,如果您在create_error_page中添加自己的名为WEBrick::HTTPResponse的Ruby方法,则可以设置自己的标记:

module WEBrick
  class HTTPResponse
    def create_error_page
      @body = ''
      @body << <<-_end_of_html_
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>#{HTMLUtils::escape(@reason_phrase)}</TITLE></HEAD>
  <BODY>
    <H1>#{HTMLUtils::escape(@reason_phrase)}</H1>
    <HR>
    <P>Custom error page!</P>
  </BODY>
</HTML>
      _end_of_html_
    end
  end
end

请注意,您可以访问@reason_phraseex.code等变量。在您的情况下,如果您愿意,可以使用ex.code(例如:401)设置不同的内容。

以下是一个完整示例,您可以在显示自定义错误页面的irb控制台中运行(请注意,它假定您的文件系统中有一个名为Public的目录):

require 'webrick'

module WEBrick
  class HTTPResponse
    def create_error_page
      @body = ''
      @body << <<-_end_of_html_
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
<HTML>
  <HEAD><TITLE>#{HTMLUtils::escape(@reason_phrase)}</TITLE></HEAD>
  <BODY>
    <H1>#{HTMLUtils::escape(@reason_phrase)}</H1>
    <HR>
    <P>Custom error page!</P>
  </BODY>
</HTML>
      _end_of_html_
    end
  end
end

root = File.expand_path '~/Public'
server = WEBrick::HTTPServer.new :Port => 8000, :DocumentRoot => root
trap 'INT' do server.shutdown end
server.start

当你转到http://localhost:8000/bogus(一个不存在的页面)时,你会看到自定义错误页面,如下所示:

enter image description here

希望它有所帮助! : - ]