2015-12-10 6 views
1

Я работал с настраиваемым прокси-сервером Jupyterhub и добавлял необходимые параметры для прокси-сервера для обработки клиентских сертификатов ssl без использования параметров командной строки.Jupyterhub Конфигурируемый вопрос Http Proxy

Моя основная цель заключается в том, что я хочу взять запрос клиентов на прокси и добавить информацию о сертификате в заголовок. В заголовке я буду использовать аутентификатор jupyterhub для создания имени пользователя.

Моя проблема заключается в том, что, когда я использую метод 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)) 
    } ] 
]; 

ответ

1

Я думаю, что это будет требовать внесения изменений в конфигурируемый-HTTP-прокси сам. Место для добавления заголовков находится на исходном объекте req до начала запроса прокси, here.

Это будет выглядеть примерно так:

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

Добавление крюк в КГП для изменения запроса здесь, на своем пути через, должен сделать это выполнимо без изменения источника ТЭЦ.

+0

Большое спасибо! Я чувствую себя идиотом!! –