基于libp2p的http代理

这是一个 ipfs 官方的例子,基于 libp2p 模块构建一个 http 代理。proxy.go

1
2
3
4
5
6
7
8
9
10
11
                                                                                                    XXX
XX XXXXXX
X XX
XXXXXXX XX XX XXXXXXXXXX
+----------------+ +-----------------+ XXX XXX XXX XXX
HTTP Request | | | | XX XX
+-----------------> | libp2p stream | | HTTP X X
| Local peer <----------------> Remote peer <-------------> HTTP SERVER - THE INTERNET XX
<-----------------+ | | | Req & Resp XX X
HTTP Response | libp2p host | | libp2p host | XXXX XXXX XXXXXXXXXXXXXXXXXXXX XXXX
+----------------+ +-----------------+ XXXXX

为了能够代理 HTTP 请求,我们首先创建一个本地节点监听 localhost:9900。 HTTP 请求通过 libp2p 流建立隧道到远程节点,然后执行 HTTP 请求,将请求结果返回给本地节点,最后发送给用户。

注意,这是一个很简单的代理,没有处理 header, 也不支持 HTTPS, proxy.go 代码都注释过了,每一步都有细节描述。

Build

go-libp2p 根目录:

1
2
> make deps
> go build ./examples/http-proxy

Usage

首先按如下方式执行 remote。它将打印一个本地节点的地址。如果你不在同一台机器上运行,需相应替换 IP。

1
2
3
4
> ./http-proxy
Proxy server is ready
libp2p-peer addresses:
/ip4/127.0.0.1/tcp/12000/ipfs/QmddTrQXhA9AkCpXPTkcY7e22NK73TwkUms3a44DhTKJTD

然后运行本地节点,指定请求需通过如下方式到远程节点。

1
2
3
4
5
> ./http-proxy -d /ip4/127.0.0.1/tcp/12000/ipfs/QmddTrQXhA9AkCpXPTkcY7e22NK73TwkUms3a44DhTKJTD
Proxy server is ready
libp2p-peer addresses:
/ip4/127.0.0.1/tcp/12001/ipfs/Qmaa2AYTha1UqcFVX97p9R1UP7vbzDLY7bqWsZw1135QvN
proxy listening on 127.0.0.1:9900

正如你所看到的,代理打印了监听的节点 127.0.0.1:9900。你现在可以用这个地址作为代理,以 curl 为例:

1
2
> curl -x "127.0.0.1:9900" "http://ipfs.io/ipfs/QmfUX75pGRBRDnjeoMkQzuQczuCup2aYbeLxz5NzeSu9G6"
it works!