为了测试目的,我需要模拟格式错误的HTTP请求到我的服务器 - 我的Node.js服务器中有一个clientError处理程序,并希望创建一个功能测试。
例如:
curl "https://myhost/endpoint?term=one two"
将触发此处理程序(由于单词one
和two
之间未编码的空格)
我很难找到在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握手。
有关如何更新我的代码以实现此目的的任何想法吗?
答案 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);
});
});