2014-04-28 3 views
2

녹을 가르치려고합니다. 나는 rust-http을 알고 있지만 내 자신의 http 클라이언트를 만들고 싶습니다. GNU Linux 64 비트 용으로 현재 야간 빌드를 사용하고 있습니다.std를 사용하여 녹에서 HTTP 요청하기

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 표준 라이브러리를 사용하여이 응답 (또는 응답)을 얻으려면 어떻게해야합니까? 감사!!

+0

코드는 지금 작동합니까? 최신 버전의 std를 사용하여 스 니펫으로 이동하는 것은 깔끔합니다. – speg

답변

5

헤더를 체결하지 않았기 때문에 요청이 잘못되었습니다. 따라서 요청이 잘못되었습니다. 헤더를 끝내려면 빈 줄이 필요합니다. 즉, 호스트 헤더 다음에 추가 CRLF를 작성해야합니다.

(BTW, 내가 볼 수없는 port 어디서나 정의.)

+0

도움 주셔서 감사합니다! 큰 코드에서이 코드를 복사하여 붙여 넣었습니다. 오류를 잡아 주셔서 감사합니다. – Rustavore

2

모든 사람들이 문서를 읽지 않고 자체 HTTP 클라이언트를 만들고 싶어하는 것처럼 보입니다. RFC2616을 살펴보고 특히 HTTP 헤더와 본문 간의 구분 기호 (본문이없는 경우에도 해당)를 확인하십시오.

+1

당신이 날 잡았어! 나를 올바른 방향으로 가리켜 주셔서 감사합니다. – Rustavore