2015-01-08 9 views
7

For a little fun私はRustで簡単なHTTPリクエストを作りたかったのです。私は一緒にこれを投げたし、それは素晴らしい作品:RustのTcpSocket :: write()が "invalid input"を返す原因は何ですか?

use std::io::TcpStream; 

fn main() { 
    // This just does a "GET /" to www.stroustrup.com 
    println!("Establishing connection..."); 
    let mut stream = TcpStream::connect("www.stroustrup.com:80").unwrap(); 

    println!("Writing HTTP request..."); 
    // unwrap() the result to make sure it succeeded, at least 
    let _ = stream.write(b"GET/HTTP/1.1\r\n\ 
          Host: www.stroustrup.com\r\n\ 
          Accept: */*\r\n\ 
          Connection: close\r\n\r\n").unwrap(); 

    println!("Reading response..."); 
    let response = stream.read_to_string().unwrap(); 

    println!("Printing response:"); 
    println!("{}", response); 
} 

応答は次のとおりです。

Establishing connection... 
Writing HTTP request... 
Reading response... 
Printing response: 
HTTP/1.1 200 OK 
...and the rest of the long HTTP response with all the HTML as I'd expect... 

しかし、私は/C++.html代わりに/する要求を変更した場合:

use std::io::TcpStream; 

fn main() { 
    // The only change is to "GET /C++.html" instead of "GET /" 
    println!("Establishing connection..."); 
    let mut stream = TcpStream::connect("www.stroustrup.com:80").unwrap(); 

    println!("Writing HTTP request..."); 
    // unwrap() the result to make sure it succeeded, at least 
    let _ = stream.write(b"GET /C++.html HTTP/1.1\r\n\ 
          Host: www.stroustrup.com\r\n\ 
          Accept: */*\r\n\ 
          Connection: close\r\n\r\n").unwrap(); 

    println!("Reading response..."); 
    let response = stream.read_to_string().unwrap(); 

    println!("Printing response:"); 
    println!("{}", response); 
} 

ソケットに戻ります"invalid input"

Establishing connection... 
Writing HTTP request... 
Reading response... 
thread '<main>' panicked at 'called `Result::unwrap()` on an `Err` value: invalid input', /Users/rustbuild/src/rust-buildbot/slave/nightly-dist-rustc-mac/build/src/libcore/result.rs:746 

なぜソケットは"invalid input"を返すのですか? TCPソケットはHTTPプロトコルを認識していません(telnetとnetcatでリクエストをテストしました。正しいです)。したがって、HTTPリクエスト/レスポンスについて不平を言うことはできません。

ここでも"invalid input"は何を意味していますか?なぜこれは機能しませんか?

マイさびバージョン(私はOS X 10.10.1によ):"invalid input"エラーがソケットから来ていません

$ rustc --version 
rustc 1.0.0-nightly (ea6f65c5f 2015-01-06 19:47:08 +0000) 

答えて

9

。それはStringから来ています。 read_to_string()コールがread_to_end()に変更された場合、応答は成功します。明らかに、応答は有効なUTF-8ではありません。

より明示的

、コード:

println!("Reading response..."); 
let response = stream.read_to_end().unwrap(); 

println!("Printing response:"); 
println!("{}", String::from_utf8(response)); 

リターン:

Err(invalid utf-8: invalid byte at index 14787) 

だから、HTTPレスポンスが悪いです。 Webページを見ると、エラーがここにある(文字が問題となっている):

Lang.Next'14 Keynote: What � if anything � have we learned from C++? 
1

問題のある文字は確かに、UTF-8無効0x96です。 – 文書はiso-8859-1またはwindows 1252のいずれかです。エスケープされていない&のような、HTMLには他にも多くの問題があります。

関連する問題