路径和主机如何在nodejs中完全不同
how can a path and a host be completely different in nodejs
我正在研究 nodejs 中的代理。我遇到了让我大吃一惊的事情。在 http.request
连接的选项之一中,源代码将其显示为选项对象
const options = {
port: 1337,
host: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80'
};
这是整个隧道系统的更大代码的一部分。但是有人可以解释一下上面的选项是如何工作的吗?完整代码如下
const http = require('http');
const net = require('net');
const { URL } = require('url');
// Create an HTTP tunneling proxy
const proxy = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
// Connect to an origin server
const { port, hostname } = new URL(`http://${req.url}`);
const serverSocket = net.connect(port || 80, hostname, () => {
clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node.js-Proxy\r\n' +
'\r\n');
serverSocket.write(head);
serverSocket.pipe(clientSocket);
clientSocket.pipe(serverSocket);
});
});
// Now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {
// Make a request to a tunneling proxy
const options = {
port: 1337,
host: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80'
};
const req = http.request(options);
req.end();
req.on('connect', (res, socket, head) => {
console.log('got connected!');
// Make a request over an HTTP tunnel
socket.write('GET / HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
socket.on('data', (chunk) => {
console.log(chunk.toString());
});
socket.on('end', () => {
proxy.close();
});
});
});
您可能从未使用过需要配置 HTTP 代理的网络。如今,大多数网络都将其防火墙配置为允许 HTTP 流量。这意味着现在大多数人都不需要使用 HTTP 代理来访问网络。
A long-long 前一段时间,当我第一次开始使用互联网时(大约 1994 年),许多网络不允许透明的互联网访问。 您的电脑与外界没有任何连接。但是系统管理员会安装一个您可以连接的 HTTP 代理。您的 PC 只能访问 LAN(代理是其中的一部分),只有 HTTP 代理才能访问互联网。
以下是如何配置 Windows 以使用 HTTP 代理的示例:
如果您按上述方式配置您的 PC,那么当您连接到 www.google.com
时,您的浏览器将连接到端口 8080
上的主机 proxy.example.com
,然后请求它从中获取数据www.google.com
.
至于为什么调用请求的资源path
是因为它是在包的"path"部分发送的
例如,获取此页面的普通 GET 请求如下所示:
GET /questions/60498963 HTTP/1.1
Host: whosebug.com
并且 GET 之后和协议版本之前的字符串通常称为路径:
.---------- this is normally called
| the "path"
v
GET /questions/60498963 HTTP/1.1
Host: whosebug.com
发出代理请求时,HTTP header 如下所示:
CONNECT whosebug.com/questions/60498963 HTTP/1.1
所以url包括域名在通常用于发送文件路径的数据包部分发送给代理。
请注意,这一切与Node.js无关。这只是基本网络(不涉及编程语言)。
我正在研究 nodejs 中的代理。我遇到了让我大吃一惊的事情。在 http.request
连接的选项之一中,源代码将其显示为选项对象
const options = {
port: 1337,
host: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80'
};
这是整个隧道系统的更大代码的一部分。但是有人可以解释一下上面的选项是如何工作的吗?完整代码如下
const http = require('http');
const net = require('net');
const { URL } = require('url');
// Create an HTTP tunneling proxy
const proxy = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('okay');
});
proxy.on('connect', (req, clientSocket, head) => {
// Connect to an origin server
const { port, hostname } = new URL(`http://${req.url}`);
const serverSocket = net.connect(port || 80, hostname, () => {
clientSocket.write('HTTP/1.1 200 Connection Established\r\n' +
'Proxy-agent: Node.js-Proxy\r\n' +
'\r\n');
serverSocket.write(head);
serverSocket.pipe(clientSocket);
clientSocket.pipe(serverSocket);
});
});
// Now that proxy is running
proxy.listen(1337, '127.0.0.1', () => {
// Make a request to a tunneling proxy
const options = {
port: 1337,
host: '127.0.0.1',
method: 'CONNECT',
path: 'www.google.com:80'
};
const req = http.request(options);
req.end();
req.on('connect', (res, socket, head) => {
console.log('got connected!');
// Make a request over an HTTP tunnel
socket.write('GET / HTTP/1.1\r\n' +
'Host: www.google.com:80\r\n' +
'Connection: close\r\n' +
'\r\n');
socket.on('data', (chunk) => {
console.log(chunk.toString());
});
socket.on('end', () => {
proxy.close();
});
});
});
您可能从未使用过需要配置 HTTP 代理的网络。如今,大多数网络都将其防火墙配置为允许 HTTP 流量。这意味着现在大多数人都不需要使用 HTTP 代理来访问网络。
A long-long 前一段时间,当我第一次开始使用互联网时(大约 1994 年),许多网络不允许透明的互联网访问。 您的电脑与外界没有任何连接。但是系统管理员会安装一个您可以连接的 HTTP 代理。您的 PC 只能访问 LAN(代理是其中的一部分),只有 HTTP 代理才能访问互联网。
以下是如何配置 Windows 以使用 HTTP 代理的示例:
如果您按上述方式配置您的 PC,那么当您连接到 www.google.com
时,您的浏览器将连接到端口 8080
上的主机 proxy.example.com
,然后请求它从中获取数据www.google.com
.
至于为什么调用请求的资源path
是因为它是在包的"path"部分发送的
例如,获取此页面的普通 GET 请求如下所示:
GET /questions/60498963 HTTP/1.1
Host: whosebug.com
并且 GET 之后和协议版本之前的字符串通常称为路径:
.---------- this is normally called
| the "path"
v
GET /questions/60498963 HTTP/1.1
Host: whosebug.com
发出代理请求时,HTTP header 如下所示:
CONNECT whosebug.com/questions/60498963 HTTP/1.1
所以url包括域名在通常用于发送文件路径的数据包部分发送给代理。
请注意,这一切与Node.js无关。这只是基本网络(不涉及编程语言)。