拦截Node.JS和Express中HTTPS服务器上的HTTP响应

时间:2014-05-30 16:06:54

标签: node.js express

我刚刚开始使用node.js和express,我正在做一个简单的HTTPS服务器。我已经和nginx合作了一段时间,当我向HTTPS端点发出HTTP请求时,我得到了一个" 400 Bad Request"错误。但是,使用node.js时,请求永远不会完成。

如何拦截Express中的HTTP请求,以便能够生成" 400错误请求"响应?

这是我的代码:

var express = require('express'); 
var https = require('https');
var fs = require('fs');

var port = process.env.PORT || 8080;

var tls_options = {
  key: fs.readFileSync('certs/server.key'),
  cert: fs.readFileSync('certs/server.crt'),
  ca: fs.readFileSync('certs/ca.crt'),
  requestCert: true,
};

var app = express();
var router = express.Router();

router.get('/', function(req, res) {
    res.json({ message: 'Checkpoint!!' });  
});

app.use('/', router);

var secureServer = https.createServer(tls_options, app);
secureServer.listen(port);
console.log('Listening on port ' + port);

到目前为止,我唯一能够使用的就是获得一个连接'每次请求到达服务器时都会发生事件:

secureServer.on('connection', function (stream) {
   console.log('someone connected!');
});

2 个答案:

答案 0 :(得分:2)

完成。实际上,在默认的120secs TLS handsahke超时后,对HTTPS套接字的HTTP请求结束。这样我就可以不用等待就结束请求了。如果有任何需要相同的功能,我会将我用于未来参考的解决方案包括在内。

var secureServer = https.createServer(options, app);
secureServer.on('connection', function(socket) {
    socket.on('data', function(data) {
    var first_line = data.toString().split('\r\n')[0];
    var pattern = /\bhttp\/1\.[01]$\b/i;
    if (pattern.test(first_line)) {
        var headers = {};
        headers['Date'] = new Date().toUTCString();
        headers['Connection'] = 'close';
        var headers_string = '';
        for (var name in headers) {
            headers_string = headers_string + '\r\n' + name + ': ' + headers[name];
        }
        socket.end('HTTP/1.1 400 Bad Request' + headers_string);
    }
});

答案 1 :(得分:-1)

无法在同一端口上启动HTTP和HTTPS服务器。大多数人做的是:

在不同的端口上启动两个服务器(一个HTTP和一个HTTPS),并将HTTP流量重定向到HTTPS。使用Express将意味着额外的代码:

// create two ports, one for HTTP and one for HTTPS
var port = process.env.PORT || 8080;
var httpsPort = 8081;

// redirect all HTTP requests to HTTPS
app.use(function(req, res, next) {
    var hostname;

    if (!req.secure) {
        hostname = req.get("host").split(":")[0];
        return res.redirect(["https://", hostname, ":", httpsPort, req.url].join(""));
    }
    next();
});

app.listen(port);  // listen on HTTP
https.createServer(tls_options, app).listen(httpsPort);  // listen on HTTPS

或者他们使用nginx或apache来处理外部连接(HTTP和HTTPS)并将流量重定向到节点服务器(然后可以在HTTP上运行)。