首页 > 解决方案 > 如何在 Webrick 代理服务器上修改 HTML 内容?

问题描述

如何在通过代理服务器时使用 Ruby Webrick 进行 html 内容修改?

require 'webrick'
require 'webrick/httpproxy'

handler = proc do |req, res|
  # if the_site_url == "youtube.com"
  #    html_of_the_page = "<body>Custom Html<body>"
  # end
end

proxy = WEBrick::HTTPProxyServer.new(
  Port: 8080, 
  ProxyContentHandler: handler
)

trap 'INT'  do proxy.shutdown end
server.start

这个问题很相似,但它的解决方案不起作用。如果 Webrick 不支持内容更改功能,是否有另一个代理服务器库支持?

更新

理想情况下,我应该能够修改现有的 HTML。我认为还有一些其他变量,例如res.body代表页面 html 的代理处理程序:可写、可解析、可读(无论是数据流还是完整数据)。

标签: rubyhttpproxywebrick

解决方案


如果您只需要创建自定义 html

require 'webrick'
require 'webrick/httpproxy'
# require 'uri' no needed

handler = proc do |req, res|
  content_body = <<-HTML
  <body>
    Custom Html
  <body>
  HTML

  res.header['content-length'] = content_body.size.to_s

  res.body = content_body if req.request_uri.host =~ /youtube/
end

proxy = WEBrick::HTTPProxyServer.new Port: 8080, ProxyContentHandler: handler

trap 'INT'  do proxy.shutdown end
trap 'TERM' do proxy.shutdown end

proxy.start

如果您想在原始 HTML 之前和之后放置一条消息(我不知道是否可以实际解析和更改原始 HTML 内容):

#!/usr/bin/env ruby

require 'webrick'
require 'webrick/httpproxy'

handler = proc do |req, res|
  content_after = "CA "
  content_before = " CB"
  add_to_content_length = "#{content_after}#{content_before}".size.to_i

  res.header['content-length'] = (res.header['content-length'].to_i + add_to_content_length).to_s

  compose = lambda do |add_first, original_body|
    proc do |sock|
      original_body.(add_first.(sock))
      sock.write content_after
    end
  end

  add_before = lambda { |sock| sock.write content_before; sock}

  res.body = compose.(add_before,res.body)
end

proxy = WEBrick::HTTPProxyServer.new Port: 8080, ProxyContentHandler: handler

trap 'INT'  do proxy.shutdown end
trap 'TERM' do proxy.shutdown end

proxy.start

推荐阅读