【问题标题】:How to modify HTML content on Webrick proxy server?如何在 Webrick 代理服务器上修改 HTML 内容?
【发布时间】:2020-07-21 21:41:24
【问题描述】:

如何使用 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

This question 类似,但它的解决方案不起作用。如果 Webrick 不支持内容更改功能,是否还有其他代理服务器库支持?

更新

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

【问题讨论】:

  • 检查这个github.com/bbtfr/evil-proxy你可以复制他们的代码或者使用它来代替项目的父类WEBrick::HTTPProxyServer
  • 它说res.body 是可写的,但如果我修改它,网页不会反映更改。你知道我怎样才能改变屏幕上的实际内容吗?
  • 如果您将 StringString.IO 重新分配给 res.body (res.body = 'Hello'),这将是您的身体,但这不是您所要求的。抱歉,但我找不到方法(res.body 返回@body,它是一个定义的 lambda #<0x000055bdd4750548 httpproxy.rb:340>

标签: ruby http proxy webrick


【解决方案1】:

如果你只需要创建一个自定义的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

【讨论】:

  • 第一个解决方案在chrome中导致ERR_TUNNEL_CONNECTION_FAILED,我认为是因为标题正在以非正常方式修改。第二个将 res.body 作为 Proc 而不是 String (我认为这是我们环境的差异)。我还开始了一项赏金活动,因此我可以理想地奖励您为此付出的所有时间!非常感谢!
  • 对不起,它与curl 一起工作我没有用浏览器尝试过,如果你需要检查 git hub github.com/muffatruffa/ProxyServer 有一个包含客户端调用和打印输出的文件(ruby版本 2.6.3 顺便说一句)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-25
  • 2011-09-09
  • 1970-01-01
相关资源
最近更新 更多