2016-05-23 4 views
2

Ich suche die Header eines Eisen Response mit dem folgenden Code zu setzen:kann nicht eingestellt Header eines Eisen Rahmen Antwort

extern crate iron; // 0.3.0 
extern crate hyper; // 0.8.1 

use iron::prelude::*; 
use iron::status; 

use hyper::header::{Headers, ContentType}; 
use hyper::mime::{Mime, TopLevel, SubLevel}; 

use std::error::Error; 
use std::fs::File; 
use std::io::prelude::*; 
use std::path::Path; 

fn main() { 
    fn hello_world(_: &mut Request) -> IronResult<Response> { 
     let mut headers = Headers::new(); 
     let string = getFileAsString("./public/index.html"); 

     headers.set(
      ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![])) 
     ); 

     Ok(Response::with((status::Ok, string, headers))) 
    } 

    Iron::new(hello_world).http("localhost:3000").unwrap(); 
    println!("On 3000"); 
} 

fn getFileAsString(fileStr: &str) -> String { 
    let path = Path::new(fileStr); 
    let display = path.display(); 
    let mut fileContents = String::new(); 

    let mut file = match File::open(&path) { 
     Err(why) => panic!("couldn't open {}: {}", display, Error::description(&why)), 
     Ok(file) => file, 
    }; 

    match file.read_to_string(&mut fileContents) { 
     Err(why) => panic!("couldn't read {}: {}", display, Error::description(&why)), 
     Ok(_) => fileContents 
    }  
} 

Allerdings erhalte ich die Fehlermeldung:

error[E0277]: the trait bound `iron::Headers: iron::modifier::Modifier<iron::Response>` is not satisfied 
    --> src/main.rs:24:12 
    | 
24 |   Ok(Response::with((status::Ok, string, headers))) 
    |   ^^^^^^^^^^^^^^ the trait `iron::modifier::Modifier<iron::Response>` is not implemented for `iron::Headers` 
    | 
    = note: required because of the requirements on the impl of `iron::modifier::Modifier<iron::Response>` for `(hyper::status::StatusCode, std::string::String, iron::Headers)` 
    = note: required by `iron::Response::with` 

Warum bin ich nicht in der Lage, Header in dieses Tupel zu übergeben, um vom Builder Request geändert zu werden?

Antwort

10

Sie können die Header auf dem Response Objekt ändern:

fn hello_world(_: &mut Request) -> IronResult<Response> { 
    let string = get_file_as_string("./public/index.html"); 
    let mut resp = Response::with((status::Ok, string)); 
    resp.headers.set(ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![]))); 
    Ok(resp) 
} 

Um den ursprünglichen Fehler herauszufinden, lassen Sie uns die Fehlermeldung überprüfen:

error[E0277]: the trait bound `iron::Headers: iron::modifier::Modifier<iron::Response>` is not satisfied 
    --> src/main.rs:24:12 
    | 
24 |   Ok(Response::with((status::Ok, string, headers))) 
    |   ^^^^^^^^^^^^^^ the trait `iron::modifier::Modifier<iron::Response>` is not implemented for `iron::Headers` 
    | 
    = note: required because of the requirements on the impl of `iron::modifier::Modifier<iron::Response>` for `(hyper::status::StatusCode, std::string::String, iron::Headers)` 
    = note: required by `iron::Response::with` 

Die erste Zeile sagt uns die Sofortausgabe: iron::Headers implementiert das Merkmal iron::modifier::Modifier<iron::Response> nicht. Wenn wir die documentation for Headers überprüfen, können wir unter der Trait Implementierungen Abschnitt sehen, dass es tatsächlich nicht implementiert Modifier.

Wir können dann das Problem von der anderen Seite betrachten: Was tut implementieren Modifier? Die Dokumentation für Modifier, wenn in Verbindung mit Iron gebaut, beantworten diese Frage. Eine Sache, die wir sehen können, ist:

impl<H> Modifier<Response> for Header<H> 
where 
    H: Header + HeaderFormat, 

Dies führt zu einer alternativen Möglichkeit:

use iron::modifiers::Header; 

fn hello_world(_: &mut Request) -> IronResult<Response> { 
    let string = get_file_as_string("./public/index.html"); 
    let content_type = Header(ContentType(Mime(TopLevel::Text, SubLevel::Html, vec![]))); 
    Ok(Response::with((status::Ok, string, content_type))) 
} 

Und wenn wir bei the implementation of Modifier for Header aussehen:

fn modify(self, res: &mut Response) { 
    res.headers.set(self.0); 
} 

Es setzt nur die Kopfzeilen wie wir über.


FYI, Rust Stil ist snake_case für Variablen und Methoden und Error::description(&why) wird normalerweise why.description() geschrieben.

+0

Danke, können Sie erklären, warum ich keine Header in das Tupel übergeben kann, wie ich verstehe Response :: mit akzeptiert ein Tupel von Modifikatoren für das Antwortobjekt? –

+0

@JacobClark ah ja, ich habe den wichtigen Teil der Antwort vergessen! – Shepmaster

+0

ausgezeichnet, danke! Möglicherweise nicht mehr im Lieferumfang, aber wie wird das Tupel angewendet? Ich würde normalerweise erwarten, eine Form zu sehen, die jeweils durch jeden Modifikator iteriert, aber in der Iron-Modifier-Quelle sehe ich das nicht, können Sie mir zeigen, wo/wie jeder Modifikator in einem Tupel angewendet wird? –

Verwandte Themen