Получить запрос на сайт с Vanilla Rust - PullRequest
0 голосов
/ 13 мая 2018

У меня есть следующий код, но он не дает ожидаемого результата, и я не понимаю причину. Если я запускаю приложение, оно запрашивает страницу, но не получает ответа. Было бы здорово, если бы я мог понять, что происходит не так.

use std::io::Read;
use std::io::Result;
use std::io::Write;
use std::net::TcpStream;

fn main() {

    if let Err(err) = connect() {
        println!("err = {}", err);
    }

}

fn connect() -> Result<()> {
    let mut stream = TcpStream::connect("www.google.de:80")?;

    let mut request_data = String::new();
    request_data.push_str("GET / HTTP/1.1");
    request_data.push_str("\r\n");
    request_data.push_str("Host: www.google.de");
    request_data.push_str("\r\n");
    request_data.push_str("\r\n");
    println!("request_data = {:?}", request_data);

    let request = stream.write_all(request_data.as_bytes())?;
    println!("request = {:?}", request);

    let mut buf = String::new();
    let result = stream.read_to_string(&mut buf)?;
    println!("result = {}", result);
    println!("buf = {}", buf);

    Ok(())
}

1 Ответ

0 голосов
/ 13 мая 2018

Вы должны передать заголовок Connection: close http, чтобы сервер мог правильно закрыть соединение.

Обратите внимание, что Google возвращает сжатый контент, поэтому вы получите сообщение об ошибке: err = stream не содержит действительного UTF-8 , даже отправляя заголовок Accept-Encoding: identity.

Тестирование с хостом изменено на www.rust-lang.org :

use std::io::Read;
use std::io::Result;
use std::io::Write;
use std::net::TcpStream;

fn main() {

    if let Err(err) = connect() {
        println!("err = {}", err);
    }

}

fn connect() -> Result<()> {
    let mut stream = TcpStream::connect("www.rust-lang.org:80")?;

    let mut request_data = String::new();
    request_data.push_str("GET / HTTP/1.0");
    request_data.push_str("\r\n");
    request_data.push_str("Host: www.rust-lang.org");
    request_data.push_str("\r\n");
    request_data.push_str("Connection: close"); // <== Here! 
    request_data.push_str("\r\n");
    request_data.push_str("\r\n");

    println!("request_data = {:?}", request_data);

    let request = stream.write_all(request_data.as_bytes())?;
    println!("request = {:?}", request);

    let mut buf = String::new();
    let result = stream.read_to_string(&mut buf)?;
    println!("result = {}", result);
    println!("buf = {}", buf);

    Ok(())
}

Результатом будет:

request_data = "GET / HTTP/1.0\r\nHost: www.rust-lang.org\r\nConnection: close\r\n\r\n"
request = ()
result = 554
buf = HTTP/1.1 301 Moved Permanently
Server: CloudFront
Date: Sun, 13 May 2018 04:46:00 GMT
Content-Type: text/html
Content-Length: 183
Connection: close
Location: https://www.rust-lang.org/
X-Cache: Redirect from cloudfront
Via: 1.1 17af5476e6187c3063f9ba7f797d342b.cloudfront.net (CloudFront)
X-Amz-Cf-Id: lzMymVQ6vTv27VxSU4J0MR6EmgPDCDqO8KFimo1kPvxmQxcKjT33jg==

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>CloudFront</center>
</body>
</html>
...