使用std在Rust中生成HTTP请求

时间:2014-04-28 16:49:48

标签: http tcp rust

我试图自学Rust。我知道rust-http,但我想构建自己的http客户端。我正在使用GNU Linux 64位的当前每晚版本。

这是我目前的代码:

use std::io::net::ip::SocketAddr;
use std::io::net::tcp::TcpStream;
use std::io::net::addrinfo::get_host_addresses;
use std::io::net::ip::IpAddr;
use std::io::stdio::println;

fn main() {
  // HTTP endpoint
  let host = ~"www.telize.com";
  let path = ~"/geoip";

  // Attempt to convert host to IP address
  let ip_lookup = get_host_addresses(host).unwrap();

  // Open socket connection
  let addr = SocketAddr { ip: ip_lookup[0].clone(), port: port.clone() };
  let mut socket = TcpStream::connect_timeout(addr, 200u64).unwrap();

  // Format HTTP request
  let mut header = format!("GET {} HTTP/1.0\r\nHost: {}\r\n", path.clone(), host.clone());
  println(header);
  socket.write_str(header);

  // Make request and return response as string
  let resp = socket.read_to_str().unwrap();
  println(resp);
}

这个编译。但是,运行代码我通过套接字看到HTTP请求,但它只是在终端中挂起。此外,没有回应。在浏览器中测试此URL(http://www.telize.com/geoip)会返回JSON响应。如何使用Rust std库获得此响应(或任何响应)?谢谢!

2 个答案:

答案 0 :(得分:5)

您的请求格式不正确,因为您尚未结束标题,因此它正在等待您这样做。要结束标题,您需要一个空行。也就是说,您必须在Host标头之后写一个额外的CRLF。

(顺便说一句,我不会在任何地方看到port。)

答案 1 :(得分:2)

看起来每个人都想构建自己的HTTP客户端而无需阅读文档。请查看RFC2616并特别注意HTTP标头和正文之间的分隔符(即使没有正文)。