ruby - 如何在 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 的代理处理程序:可写、可解析、可读(无论是数据流还是完整数据)。
解决方案
如果您只需要创建自定义 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
推荐阅读
- python - Emacs flycheck 和 python virtualenv
- python - raise InvalidSchema("没有为 {!r} 找到连接适配器".format(url))
- pivot - pivot_longer:更改条形图的数据框结构
- laravel - 如何更改 Laravel 中的默认验证错误消息?
- javascript - 使用 axios 反应原生无法获取承载令牌
- ios - IAP iOS 应用程序。如何仅为新用户制作付费功能,而为已经下载付费应用的用户免费保留?
- c++ - C++ 坏线程访问
- azure-active-directory - 可靠地识别 Teams 来宾用户
- javascript - 旋转问题
- pixi.js - 为什么我使用 PixiJS 的 stage.height/width 为 0?