我写了一个快速应用程序作为HTTP代理,拦截和分析一些网络流量。我的应用程序感兴趣的流量部分都是HTTP,但我仍然希望我的应用程序代理HTTPS,以便用户无需额外设置即可使用它。
我的快递应用程序是使用HTTP服务器创建的。在测试时,我使用SwitchyOmega更改了Chrome中的代理设置,以使用HTTP代理HTTPS连接。 HTTP运行良好,但我的快递应用程序无法获得HTTPS的这些代理请求。
所以我写了一个简单的TCP代理来检查它们,并发现它们是这样的:
CONNECT HOSTNAME:443 HTTP/1.1
Host: HOSTNAME
Proxy-Connection: keep-alive
User-Agent: MY_AGENT
ENCRYPTED HTTPS
我相信这些请求是HTTP,但为什么表达不接收它们?
我确定如果我将浏览器代理设置更改为忽略HTTPS,则应用效果很好。但我确实想知道是否有任何解决方法可用于代理所有HTTP协议和仅一个端口。
THX。
来自我的快递应用的更新代码
app.use('*', function (req, res, next) {
// print all the request the app receive
console.log('received:', req.url)
})
app.use(bodyParser.text({type: '*/*'}))
app.use(cookieParser())
app.use(logger('dev'))
app.use(express.static(path.join(__dirname, 'public')))
// serve web pages for my app, only the request targeting my server
// is handled here(right IP and port), proxy request gets handled after this.
app.use('/', internalRoute)
// analyse the part I want
app.use('/END_POINT_I_WANT', myRoute)
// handle proxy requests
app.use('*', function (req, res, next) {
// proxy the request here
})
问题是,我的第一个中间件,用于显示应用程序收到的所有请求,无法捕获上述HTTP中包含的HTTPS代理请求。当然,我用作代理的中间件也无法捕获它们。
UPDATE-trying node-http-prxoy,没有运气
var httpProxy = require('http-proxy')
, http = require('http')
, fs = require('fs')
var options = {target: 'http://127.0.0.1:8099'}
, proxy = httpProxy.createServer(options)
http.createServer(function (req, res) {
console.log(req.url)
proxy.web(req, res)
}).listen(5050)
使用上面的代码和浏览器设置来代理使用HTTP的所有协议,它的工作方式与我的快递应用程序相同。 HTTPS代理请求获得ERR_EMPTY_RESPONSE
,而控制台上没有任何内容。
使用以下选项,似乎我必须将代理协议更改为HTTPS,我不想使用它,至少目前是这样。我得到ERR_PROXY_CERTIFICATE_INVALID
我的自签名证书......
var options = { secure: true
, target: 'http://127.0.0.1:8099'
, ssl: { key: fs.readFileSync('cert/key.pem', 'utf8')
, cert: fs.readFileSync('cert/server.crt', 'utf8')
}
}
UPDATE- pin将问题指向' connect'事件监听器
通过一些搜索,我发现this post很有帮助。
它指出http服务器没有connect
事件的监听器。我尝试了帖子中的代码,有效。但是正如该帖子的最后一条评论所提到的,我的应用程序充当代理以获取数据,然后将请求代理到另一个代理以便通过GreatFireWall。
这个过程就像:BROWSER -> MY_APP -> ANOTHER_PROXY -> TARGET
。
如果没有ANOTHER_PROXY
,这是一个HTTP代理,它适用于HTTP和HTTPS。但是我没能将它们全部链接起来。我使用的ANOTHER_PROXY
支持HTTPS over HTTP。
答案 0 :(得分:0)
由于您尚未发布任何代码,因此很难看出可能出现的问题。
但是,如果您只想创建一个支持HTTP和HTTPS的简单代理,我认为您应该考虑使用像node-http-proxy这样的模块。
他们的自述文件中包含最常见场景的示例代码,听起来它可以很好地满足您的需求。