尝试通过创建一个简单的http代理服务器来了解有关node.js的更多信息.使用场景很简单:用户 - >代理 - >服务器 - >代理 - >用户
以下代码一直有效,直到最后一步.无法找到管道连接器输出回用户的方法.
#!/usr/bin/env node
var
url = require('url'),
http = require('http'),
acceptor = http.createServer().listen(3128);
acceptor.on('request', function(request, response) {
console.log('request ' + request.url);
request.pause();
var options = url.parse(request.url);
options.headers = request.headers;
options.method = request.method;
options.agent = false;
var connector = http.request(options);
request.pipe(connector);
request.resume();
// connector.pipe(response); // doesn't work
// connector.pipe(request); // doesn't work either
});
Run Code Online (Sandbox Code Playgroud)
使用tcpflow我看到来自浏览器的传入请求,然后是传出代理请求,然后是服务器响应回代理.不知何故,我无法将响应重新传输回浏览器.
使用管道实现此逻辑的正确方法是什么?
实现以下逻辑的最快方法是什么:
def xor(data, key):
l = len(key)
buff = ""
for i in range(0, len(data)):
buff += chr(ord(data[i]) ^ ord(key[i % l]))
return buff
Run Code Online (Sandbox Code Playgroud)
在我的情况下,密钥是20字节的sha1摘要,数据是20字节和几(1,2,3)兆字节之间的一些二进制数据
更新:
好,朋友们.这是一个快3.5倍的实现,它将数据和密钥分成4个,2个或1个字节(在我的情况下,大多数情况下它是4字节长整数):
def xor(data, key):
index = len(data) % 4
size = (4, 1, 2, 1)[index]
type = ('L', 'B', 'H', 'B')[index]
key_len = len(key)/size
data_len = len(data)/size
key_fmt = "<" + str(key_len) + type;
data_fmt = "<" + str(data_len) + type;
key_list = struct.unpack(key_fmt, key)
data_list = struct.unpack(data_fmt, data)
result …Run Code Online (Sandbox Code Playgroud) node.js中是否有类似setsockopt/getsockopt的套接字选项操作功能?