我正在尝试创建一个从www.xxx.com
获取页面的代理服务器,缓存响应,然后将其发送到请求的浏览器。
为此,我在服务器上创建了一个从xxx.com
请求页面的HTTP客户端。响应以块(缓冲区)的形式返回。然后,由于根据网页的块数不同,我将块放在缓冲区数组中。然后我发送数组的元素。
我的问题不是所有的块都发送成功。有没有其他方法可以在发送之前缓存数据? (我知道我可以直接发送数据,但我需要发送缓存,因为我想将它发送到多个浏览器)
要保存我使用的块:
function getURL(u) {
u = url.parse(u);
var client = http.createClient(u.port || 80, u.hostname);
var request = client.request('GET', '/', {
'Host': u.hostname,
});
var cache ={ };
cache.data = [];
request.end();
request.on('response', function(response) {
cache.statusCode = response.statusCode;
cache.headers = response.headers;
response.on('data', function(chunk) {
cache.data.push(chunk);
}
}
发送缓存,我使用:
function sendCache(response, cache) {
var writeSuccess = [];
response.writeHead(cache.statusCose, cache.headers);
for (var i in cache.data) {
// don't encode the data, leave it as it is
writeSuccess[i] = response.write(cache.data[i], "binary");
console.log("chunk " + i + " is of length "
+ cache.data[i].length + ". Response success: " + writeSuccess[i]);
}
}
在这里,我记录response.write
的返回值,以检查它是否成功。在node.js API中,没有解释此函数是否返回,但我只是试了一下。
我注意到,response.write有时为true,然后是其他缓存块的false,而如果我直接发送没有缓存的响应,则所有块的response.write都为真。
如果有人注意到我的错误,我正在或者确实知道一种更好的方法来缓存数据(最好是二进制文件,以便将所有非ASCII字符缓存到)。
答案 0 :(得分:0)
如果您尝试在node.js中代理请求,则应尝试使用https://github.com/nodejitsu/node-http-proxy,这将为您节省大量时间和麻烦。
答案 1 :(得分:0)
在最新版本的Node.js(v 0.4.0)中,解决了从缓冲区写入响应的问题。所以只需更新到这个版本我的问题就解决了。
但是,必须知道response.write可能仍然给出错误,但这并不意味着它不会被发送,而是直接发送(漏桶概念)。这是我能够从node.js库中的注释中得出的结论(我希望我是正确的)。