[英]return raw binary ipv4 GET repsonse in elixir
我知道存在将HTTP响应返回为struct
的库:
> HTTPoison.get!("http://httpbin.org/get")
> %HTTPoison.Response{body: "{\n \"args\": {}, \n \"headers\": {\n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"hackney/1.6.6\"\n }, \n \"origin\": \"86.30.176.31\", \n \"url\": \"http://httpbin.org/get\"\n}\n", headers: [{"Server", "nginx"}, {"Date", "Sun, 12 Mar 2017 06:05:29 GMT"},{"Content-Type", "application/json"}, {"Content-Length", "165"}, {"Connection", "keep-alive"}, {"Access-Control-Allow-Origin", "*"}, {"Access-Control-Allow-Credentials", "true"}], status_code: 200}
但是,如何在elixir中获得ipv4 HTTP响应数据包的原始binary
形式?
根据Dogbert的建议,我尝试使用gen_tcp
,但是得到了以下内容:
iex(1)> {:ok, port} = :gen_tcp.connect('httpbin.org',80,[:binary, active:
false, packet: :http])
{:ok, #Port<0.6531>}
iex(2)> :gen_tcp.send(port, "GET /get HTTP/1.1\r\nHost: httpbin.org\r\n")
:ok
iex(3)> :gen_tcp.recv(port,0)
{:error, :closed}
我在这里做错了什么?
摆脱gen_tcp.connect
中的packet: :http
选项,并在HTTP文本末尾添加另一个\\r\\n
可以解决该问题:
iex(3)> {:ok, packet_binary} = :gen_tcp.recv(port,0)
{:ok, {:http_response, {1, 1}, 200, 'OK'}}
iex(4)> {:ok, port} = :gen_tcp.connect('httpbin.org',80,[:binary, active: false])
{:ok, #Port<0.6706>}
iex(5)> :gen_tcp.send(port, "GET /get HTTP/1.1\r\nHost: httpbin.org\r\n\r\n")
:ok
iex(6)> {:ok, packet_binary} = :gen_tcp.recv(port,0)
{:ok,
"HTTP/1.1 200 OK\r\nServer: nginx\r\nDate: Sun, 12 Mar 2017 14:01:05 GMT\r\nContent-Type: application/json\r\nContent-Length: 129\r\nConnection: keep-alive\r\nAccess-Control-Allow-Origin: *\r\nAccess-Control-Allow-Credentials: true\r\n\r\n{\n \"args\": {}, \n \"headers\": {\n \"Host\": \"httpbin.org\"\n }, \n \"origin\": \"86.30.176.31\", \n \"url\": \"http://httpbin.org/get\"\n}\n"}
iex(7)> IO.puts(packet_binary)
HTTP/1.1 200 OK
Server: nginx
Date: Sun, 12 Mar 2017 14:01:05 GMT
Content-Type: application/json
Content-Length: 129
Connection: keep-alive
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
{
"args": {},
"headers": {
"Host": "httpbin.org"
},
"origin": "86.30.176.31",
"url": "http://httpbin.org/get"
}
:ok
iex(8)> is_binary(packet_binary)
true
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.