2015-12-10 2 views
1

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)) 
    } ] 
]; 

Répondre

1

Je pense que cela va nécessiter des modifications à lui-même configurable http-proxy. L'emplacement pour ajouter des en-têtes se trouve sur l'objet req d'origine avant d'initier la demande par proxy, here.

Il ressemblerait à quelque chose comme:

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); 

Ajout d'un crochet CHP pour modifier ici la demande, sur son chemin à travers, devrait faire ce faisable sans modifier la source de cogénération.

+0

Merci beaucoup! Je me sens idiot!! –