我正在寻找一个解决方案,以监控http response.write方法的发送/写入过程。
当一个事件(在我的情况下是带有安全令牌的第二个请求)出现(或不出现)时,我希望能够监视并停止正在运行的进程。
这一般是否可行,如果是的话,是否有人为我提供了一些代码安静?
这是一段关于代码行的咖啡
if req.headers.range?
console.log "serve range request from cache"
# browser wants chunged transmission
range = req.headers.range
parts = range.replace(/bytes=/, "").split "-"
partialstart = parts[0]
partialend = parts[1]
total = file.length
start = parseInt partialstart, 10
end = if partialend then parseInt partialend, 10 else total - 1
header["Content-Range"] = "bytes #{start}-#{end}/#{total}"
header["Accept-Ranges"] = "bytes"
header["Content-Length"]= (end-start)+1
header['Transfer-Encoding'] = 'chunked'
header["Connection"] = "close"
res.writeHead 206, header
# yeah I dont know why i have to append the '0'
# but chrome wont work unless i do
res.write file.slice(start, end)+'0', "binary"
else
console.log "serve normal request from cache"
# reply to normal un-chunked request
res.writeHead 200, header
res.write file, "binary"
console.log err if err
res.end()
有没有办法将某些 res.write文件,“二进制”行包装在某种函数或进程中,可以被杀死?
亲切的问候
答案 0 :(得分:1)
不确定。你可以这样做:
origWrite = res.write
res.write = function(buffer, encoding) {
// do some monitoring, starting, stopping, whatever you like
retval = origWrite(buffer, encoding);
// do some more monitoring, starting, stopping, whatever you like
return retval;
}
将此代码放在Express堆栈顶部的中间件中,这样您就可以监控来自所有中间件的所有写入,而不仅仅是您自己的。
另一件事:
在您的代码中,您指定Content-Length
和Transfer-Encoding: chunked
。这两个人不在一起。 chunked
是Chrome(以及任何其他浏览器......)最后想要0
的原因:chunked编码以“块”形式出现,每个块以其长度的ASCII十六进制表示开头。事情以一个空块结束(即:一个长度为0且没有数据的块)。之后你还应该添加一个CR-LF。