Jupyterhub可configuration的Http代理问题

我一直在使用Jupyterhub的可configurationHttp代理,我一直在为代理处理客户端的ssl证书而不必使用命令行选项来添加必要的选项。

我的主要目标是我想要接受客户端请求到代理并将其证书信息添加到标题。 一旦在标题中,我将使用jupyterhub的身份validation器制作一个用户名。

我的问题是,当我使用proxy.on('proxyReq方法可用于http代理设置标题,我得到这个错误: [Error: Can't set headers after they are sent.]

我一直在查看所有的代码,看看正在写或发送的响应/请求,但我找不到它。

这里是ConfigurableProxy函数代码,如果需要,我可以给你更多的代码:

 function ConfigurableProxy (options) { var that = this; this.options = options || {}; this.trie = new trie.URLTrie(); this.auth_token = this.options.auth_token; this.includePrefix = options.includePrefix === undefined ? true : options.includePrefix; this.routes = {}; this.host_routing = this.options.host_routing; this.error_target = options.error_target; if (this.error_target && this.error_target.slice(-1) !== '/') { this.error_target = this.error_target + '/'; // ensure trailing / } this.error_path = options.error_path || path.join(__dirname, 'error'); if (this.options.default_target) { this.add_route('/', { target: this.options.default_target }); } options.ws = true; options.secure= true; // These are the ssl options options.ssl = { //Right the key and cert are relative path on my computer //but these can be changed. key: fs.readFileSync('/Users/grantherman/Desktop/jupyterHubCSProject/ssl/server.key'), cert: fs.readFileSync('/Users/grantherman/Desktop/jupyterHubCSProject/ssl/server.crt'), requestCert: true, //Right now this is set to false, but if we add a CA to these options // and set this to true, the proxy will reject all unkown ssl certs rejectUnauthorized: false }; var response = []; var data = []; var proxy = this.proxy = httpProxy.createProxyServer(options); proxy.on('proxyReq', function(proxyReq, req, res, options) { console.log("proxy request"); try{ proxyReq.setHeader('X-Special-Proxy-Header', req.socket.getPeerCertificate()); }catch(err){ console.log(err); } }); proxy.on('data', function(data, req, res, options) { data.push(data); }); proxy.on('proxyRes', function(proxyRes, req, res, options) { response.push(proxyRes); }); proxy.on('error', function(error, req, res, options) { log.add(error); }); proxy.on('close', function (req, socket, head) { // view disconnected websocket connections console.log('Client disconnected'); }); // tornado-style regex routing, // because cross-language cargo-culting is always a good idea this.api_handlers = [ [ /^\/api\/routes(\/.*)?$/, { get : bound(this, authorized(this.get_routes)), post : json_handler(bound(this, authorized(this.post_routes))), 'delete' : bound(this, authorized(this.delete_routes)) } ] ]; 

我认为这将需要修改可configuration的http代理本身。 在这里 ,发起代理请求之前,添加标题的地方在原始req对象上。

它看起来像这样:

 ConfigurableProxy.prototype.handle_proxy = function (kind, req, res) { ... req.headers['X-My-Header'] = 'My-Value'; // dispatch the actual method this.proxy[kind].apply(this.proxy, args); 

在CHP中添加一个钩子来修改这个请求,在这个过程中,应该可以在不修改CHP源的情况下进行修改。