2016-10-27 2 views
2

Hyperは、&mut [u8]にHTTP応答の内容を読み取る関数fn read(&mut self, buf: &mut [u8]) -> io::Result<usize>を持っています。ハイパーとFlate2で​​gzip応答を読み取る

Flate2にgunzipすることができます

let mut d = GzDecoder::new("...".as_bytes()).unwrap(); 
let mut s = String::new(); 
d.read_to_string(&mut s).unwrap(); 
println!("{}", s); 

私は二つのことを一緒に入れてみてください:

fn gunzip(r: &Response) -> String { 
    let mut zs: &mut [u8] = &mut[]; 
    r.read(zs); 
    let mut d = GzDecoder::new(zs).unwrap(); 
    let mut s = String::new(); 
    d.read_to_string(&mut s).unwrap(); 
    s 
} 

そして、私はエラーを取得:

error[E0277]: the trait bound `[u8]: std::io::Read` is not satisfied 
    --> tests/integration.rs:232:21 
    | 
232 |   let mut d = GzDecoder::new(zs).unwrap(); 
    |      ^^^^^^^^^^^^^^ trait `[u8]: std::io::Read` not satisfied 
    | 
    = help: the following implementations were found: 
    = help: <&'a [u8] as std::io::Read> 
    = note: required because of the requirements on the impl of `std::io::Read` for `&mut [u8]` 
    = note: required by `<flate2::read::DecoderReader<R>>::new` 

どこが間違っているんですか?


編集:最終作業溶液:錆が固定型が期待されていた場合はどうなるいくつかの変換を実行しないように

fn gunzip(r: &mut Response) -> String { 
    let mut buffer = Vec::new(); 
    let _ = r.read_to_end(&mut buffer).unwrap(); 
    let mut d = GzDecoder::new(buffer.as_slice()).unwrap(); 
    let mut s = String::new(); 
    d.read_to_string(&mut s).unwrap(); 
    s 
} 
+0

(削除されたコメントへの応答として)はい私は[試して&zs']しました。結果は 'trait '&& mut [u8]:std :: io :: Read' not satisfied'となります。 – Synesso

+0

もう1つ追加することはできますか? (それは馬鹿だと思うが、[遊び場](https://play.rust-lang.org/?code=use%20std%3A%3Aio%3A%3ARead%3B%0A%0Afn%20foo(r %3A%20%20%20%20%20%20%20%20%20%20%20%20% 20%20%20%3D 20%5B8u 8%2C%206%2C%207%5D%3B%0A%20%20%20%20%20%20%20%20%3D%20%26A%3B%0A%20% 20%20%20%0Aの%20%20%20%20foo(%26%26bind%の5B ..%の5D)%3B%の0A%7D&バージョン=安定&バックトレース= 0)) – Neikos

+0

'新しいGzDecoder ::(&& ZS).unwrap () '=>' trait '&&& mut [u8]:std :: io ::読み込みが不満です。 – Synesso

答えて

1

パラメータGzDecoder::newには、ジェネリック型で定義されています。

可変スライスを参照解除し、その結果を参照することで、可変スライスを不変スライスに変換できます。ここで

let mut d = GzDecoder::new(&*zs).unwrap(); 
+0

Whacky!しかし、それは働いた。 – Synesso

1

は、あなたが別のバッファを使用せずにそれを行うことができます別の方法です:

extern crate hyper; 
extern crate flate2; 

use std::io::Read; 

use hyper::client::Client; 
use hyper::header::{Headers, AcceptEncoding, Encoding, qitem}; 

use flate2::read::GzDecoder; 

fn main() { 
    let c = Client::new(); 

    let mut req = c.get("http://httpbin.org/gzip"); 
    let mut headers = Headers::new(); 
    headers.set(
     AcceptEncoding(vec![qitem(Encoding::Gzip)]) 
    ); 
    req = req.headers(headers); 

    let res = req.send().unwrap(); 
    let mut decoder = GzDecoder::new(res).unwrap(); 
    let mut buf = String::new(); 

    let _ = decoder.read_to_string(&mut buf); 
    println!("{}", buf); 
} 

この例では、ResponseGzDecoderで使用することができることをテスト用HTTPBINからgzipエンドポイントを使用しています。私の貨物ファイルで使用

依存性:

[dependencies] 
hyper = "0.9" 
flate2 = "0.2" 

P.S. unwrap()は簡潔にするためのものです。

関連する問題