模拟无效的HTTP请求

时间:2018-01-25 12:45:25

标签: node.js nginx

为了测试目的,我需要模拟格式错误的HTTP请求到我的服务器 - 我的Node.js服务器中有一个clientError处理程序,并希望创建一个功能测试。

例如: curl "https://myhost/endpoint?term=one two"将触发此处理程序(由于单词onetwo之间未编码的空格)

我很难找到在Node中做类似请求的方法。据我所知,任何一种更高级别的请求库都会自动进行编码,因此我无法使用它们。

使用内置的net库,我设法做到了这一点:

const net = require('net');
const socket = new net.Socket();

const options = {
    port: 443,
    host: 'myhost'
};

socket.connect(options, () => {
    console.log('connected to', socket.remoteAddress);
    socket.write('GET /endpoint?term=one two HTTP/1.1\r\n' +
    'Host: myhost\r\n' +
    '\r\n');

socket.on('data', (data) => {
    console.log('SOCKET RESPONSE: ' + data);
}).on('end', () => {
    console.log('SOCKET ENDED');
});

问题是,对我的Node.js服务的调用是通过Nginx代理的,因此运行上面的代码会导致来自Nginx的400错误:

  

普通HTTP请求已发送到HTTPS端口

我看到使用--verbose标志,Curl足够聪明,可以进行一些TLS握手。

有关如何更新我的代码以实现此目的的任何想法吗?

1 个答案:

答案 0 :(得分:0)

解决方案是使用tls库:

const tls = require('tls');

const options = {
    port: 443,
    host: 'myhost'
};
const socket = tls.connect(options, () => {
    console.log('connected to', socket.remoteAddress);
    socket.write('GET /endpoint?term=one two HTTP/1.1\r\n' +
        'Host: myhost\r\n' +
        '\r\n');

    socket.setEncoding('utf8');
    socket.on('data', data => {
        console.log('SOCKET RESPONSE:', data);
    }).on('end', () => {
        console.log('Connection end');
    }).on('close', (had_error) => {
        console.log('Connection closed. Had error:', had_error);
    }).on('error', error => {
        console.log('ERROR:', error);
    });
});