Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Make HTTP Request in Rust using std

Tags:

http

tcp

rust

I'm trying to teach myself Rust. I'm aware of rust-http, but I want to build my own http client. I'm using the currently nightly build for GNU Linux 64 bit.

Here's my current code:

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

This compiles. However, running the code I see the HTTP request over the socket, but then it just hangs in the terminal. Also, there is no response. Testing this url (http://www.telize.com/geoip) in the browser returns a JSON response. How can I get this response (or any response) using the Rust std library? Thanks!!

like image 762
Rustavore Avatar asked Apr 28 '14 16:04

Rustavore


2 Answers

Your request is malformed in that you have not concluded the headers, and so it is waiting for you to do that. To conclude the headers, you need a blank line. That is, you must write an extra CRLF after the Host header.

(BTW, I don't see port defined anywhere.)

like image 191
Chris Morgan Avatar answered Oct 06 '22 12:10

Chris Morgan


Looks like everybody wants to build its own HTTP client w/o reading the documentation. Please have a look at RFC2616 and note especially the delimiter between HTTP header and body (even if there is no body).

like image 25
Steffen Ullrich Avatar answered Oct 06 '22 13:10

Steffen Ullrich