2017-03-12 20 views
0

我知道图书馆的存在返回的HTTP响应为struct S:返回原始二进制的IPv4 GET repsonse在灵药

> 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} 

但是如何获取的原始binary形式的IPv4的HTTP响应报文在灵药?

按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} 

什么我错在这里做什么?

+0

如果请求的是一个简单的GET,你可以使用'gen_tcp'直接。如果它更复杂,我相信['hackney'](https://github.com/benoitc/hackney)必须有一个选项来获得原始响应,但我似乎无法找到它。 – Dogbert

+0

如果仅仅是为了调试的目的,可能[Wireshark](https://www.wireshark.org/)会是一个很好的通用选项吗? –

+0

@PatrickOscity - 尝试过,但是我正在寻找一些我可以在elixir中重现的东西。 – category

回答

0

gen_tcp.connect摆脱packet: :http选项,并增加另一个\r\n在HTTP文本的末尾解决它:

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 
+0

嗯实际上我不确定这一点 - 我需要验证这是一个ipv4数据包 - 似乎不符合ipv4规范。 – category