J'ai travaillé avec le proxy Http configurable de Jupyterhub et j'ai ajouté les options nécessaires pour que le proxy puisse gérer les certificats ssl du client sans avoir à utiliser les options de la ligne de commande.Jupyterhub Configurable Http Proxy issue
Mon objectif principal est que je souhaite recevoir une demande de client au proxy et ajouter les informations de son certificat à l'en-tête. Une fois dans l'en-tête, j'utiliserai l'authentificateur de jupyterhub pour créer un nom d'utilisateur.
Mon problème est que lorsque j'utilise la méthode proxy.on('proxyReq
disponible pour le proxy http pour définir l'en-tête, je reçois cette erreur: [Error: Can't set headers after they are sent.]
J'ai cherché tout le code pour voir où une réponse/demande est écrit ou envoyé, mais je ne peux pas le trouver.
Voici le code de fonction ConfigurableProxy, je peux vous donner plus si nécessaire:
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))
} ]
];
Merci beaucoup! Je me sens idiot!! –