簡體   English   中英

在長生不老葯中返回原始二進制ipv4 GET回復

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM